Class: SyntaxTree::YARV::GetInstanceVariable

Inherits:
Instruction
  • Object
show all
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

Instance Method Summary collapse

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

#cacheObject (readonly)

Returns the value of attribute cache.



1773
1774
1775
# File 'lib/syntax_tree/yarv/instructions.rb', line 1773

def cache
  @cache
end

#nameObject (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

#lengthObject



1800
1801
1802
# File 'lib/syntax_tree/yarv/instructions.rb', line 1800

def length
  3
end

#pushesObject



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