Class: SyntaxTree::YARV::GetInstanceVariable
- Inherits:
-
Instruction
- Object
- Instruction
- SyntaxTree::YARV::GetInstanceVariable
- Defined in:
- lib/syntax_tree/yarv/instructions.rb
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
~~~ruby ~~~
Instance Attribute Summary collapse
-
#cache ⇒ Object
readonly
Returns the value of attribute cache.
-
#name ⇒ Object
readonly
Returns the value of attribute name.
Instance Method Summary collapse
- #==(other) ⇒ Object
- #call(vm) ⇒ Object
- #deconstruct_keys(_keys) ⇒ Object
- #disasm(fmt) ⇒ Object
-
#initialize(name, cache) ⇒ GetInstanceVariable
constructor
A new instance of GetInstanceVariable.
- #length ⇒ Object
- #pushes ⇒ Object
- #to_a(_iseq) ⇒ Object
Methods inherited from Instruction
#branch_targets, #canonical, #falls_through?, #leaves?, #pops, #side_effects?
Constructor Details
#initialize(name, cache) ⇒ GetInstanceVariable
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 (readonly)
Returns the value of attribute cache.
1773 1774 1775 |
# File 'lib/syntax_tree/yarv/instructions.rb', line 1773 def cache @cache end |
#name ⇒ Object (readonly)
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 |