class SyntaxTree::YARV::GetInstanceVariable

### Summary

‘getinstancevariable` pushes the value of an instance variable onto the stack. It uses an inline cache to avoid having to look up the instance variable in the class hierarchy every time.

This instruction has two forms, but both have the same structure. Before Ruby 3.2, the inline cache corresponded to both the get and set instructions and could be shared. Since Ruby 3.2, it uses object shapes instead so the caches are unique per instruction.

### Usage

~~~ruby @instance_variable ~~~

Attributes

cache[R]
name[R]

Public Class Methods

new(name, cache) click to toggle source
# File lib/syntax_tree/yarv/instructions.rb, line 1775
def initialize(name, cache)
  @name = name
  @cache = cache
end

Public Instance Methods

==(other) click to toggle source
# File lib/syntax_tree/yarv/instructions.rb, line 1795
def ==(other)
  other.is_a?(GetInstanceVariable) && other.name == name &&
    other.cache == cache
end
call(vm) click to toggle source
# File lib/syntax_tree/yarv/instructions.rb, line 1808
def call(vm)
  method = Object.instance_method(:instance_variable_get)
  vm.push(method.bind(vm.frame._self).call(name))
end
deconstruct_keys(_keys) click to toggle source
# File lib/syntax_tree/yarv/instructions.rb, line 1791
def deconstruct_keys(_keys)
  { name: name, cache: cache }
end
disasm(fmt) click to toggle source
# File lib/syntax_tree/yarv/instructions.rb, line 1780
def disasm(fmt)
  fmt.instruction(
    "getinstancevariable",
    [fmt.object(name), fmt.inline_storage(cache)]
  )
end
length() click to toggle source
# File lib/syntax_tree/yarv/instructions.rb, line 1800
def length
  3
end
pushes() click to toggle source
# File lib/syntax_tree/yarv/instructions.rb, line 1804
def pushes
  1
end
to_a(_iseq) click to toggle source
# File lib/syntax_tree/yarv/instructions.rb, line 1787
def to_a(_iseq)
  [:getinstancevariable, name, cache]
end