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