Class: SyntaxTree::YARV::GetInstanceVariable
Overview
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
</code>
Instance Attribute Summary collapse
Instance Method Summary
collapse
Methods inherited from Instruction
#branch_targets, #canonical, #falls_through?, #leaves?, #pops, #side_effects?
Constructor Details
Returns a new instance of GetInstanceVariable.
1775
1776
1777
1778
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1775
def initialize(name, cache)
@name = name
@cache = cache
end
|
Instance Attribute Details
#cache ⇒ Object
Returns the value of attribute cache.
1773
1774
1775
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1773
def cache
@cache
end
|
#name ⇒ Object
Returns the value of attribute name.
1773
1774
1775
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1773
def name
@name
end
|
Instance Method Details
#==(other) ⇒ Object
1795
1796
1797
1798
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1795
def ==(other)
other.is_a?(GetInstanceVariable) && other.name == name &&
other.cache == cache
end
|
#call(vm) ⇒ Object
1808
1809
1810
1811
|
# 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) ⇒ Object
1791
1792
1793
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1791
def deconstruct_keys(_keys)
{ name: name, cache: cache }
end
|
#disasm(fmt) ⇒ Object
1780
1781
1782
1783
1784
1785
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1780
def disasm(fmt)
fmt.instruction(
"getinstancevariable",
[fmt.object(name), fmt.inline_storage(cache)]
)
end
|
#length ⇒ Object
1800
1801
1802
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1800
def length
3
end
|
#pushes ⇒ Object
1804
1805
1806
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1804
def pushes
1
end
|
#to_a(_iseq) ⇒ Object
1787
1788
1789
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1787
def to_a(_iseq)
[:getinstancevariable, name, cache]
end
|