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