class SyntaxTree::YARV::Once
### Summary
‘once` is an instruction that wraps an instruction sequence and ensures that is it only ever executed once for the lifetime of the program. It uses a cache to ensure that it is only executed once. It pushes the result of running the instruction sequence onto the stack.
### Usage
~~~ruby END { puts “END” } ~~~
Attributes
cache[R]
iseq[R]
Public Class Methods
new(iseq, cache)
click to toggle source
# File lib/syntax_tree/yarv/instructions.rb, line 2618 def initialize(iseq, cache) @iseq = iseq @cache = cache end
Public Instance Methods
==(other)
click to toggle source
# File lib/syntax_tree/yarv/instructions.rb, line 2636 def ==(other) other.is_a?(Once) && other.iseq == iseq && other.cache == cache end
call(vm)
click to toggle source
# File lib/syntax_tree/yarv/instructions.rb, line 2648 def call(vm) return if @executed vm.push(vm.run_block_frame(iseq, vm.frame)) @executed = true end
deconstruct_keys(_keys)
click to toggle source
# File lib/syntax_tree/yarv/instructions.rb, line 2632 def deconstruct_keys(_keys) { iseq: iseq, cache: cache } end
disasm(fmt)
click to toggle source
# File lib/syntax_tree/yarv/instructions.rb, line 2623 def disasm(fmt) fmt.enqueue(iseq) fmt.instruction("once", [iseq.name, fmt.inline_storage(cache)]) end
length()
click to toggle source
# File lib/syntax_tree/yarv/instructions.rb, line 2640 def length 3 end
pushes()
click to toggle source
# File lib/syntax_tree/yarv/instructions.rb, line 2644 def pushes 1 end
to_a(_iseq)
click to toggle source
# File lib/syntax_tree/yarv/instructions.rb, line 2628 def to_a(_iseq) [:once, iseq.to_a, cache] end