Class: SyntaxTree::YARV::GetBlockParam
Overview
Summary
getblockparam is a similar instruction to getlocal in that it looks
for a local variable in the current instruction sequence's local table and
walks recursively up the parent instruction sequences until it finds it.
The local it retrieves, however, is a special block local that was passed
to the current method. It pushes the value of the block local onto the
stack.
Usage
def foo(&block)
block
end
Instance Attribute Summary collapse
Instance Method Summary
collapse
Methods inherited from Instruction
#branch_targets, #canonical, #falls_through?, #leaves?, #pops, #side_effects?
Constructor Details
#initialize(index, level) ⇒ GetBlockParam
Returns a new instance of GetBlockParam.
1542
1543
1544
1545
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1542
def initialize(index, level)
@index = index
@level = level
end
|
Instance Attribute Details
#index ⇒ Object
Returns the value of attribute index.
1540
1541
1542
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1540
def index
@index
end
|
#level ⇒ Object
Returns the value of attribute level.
1540
1541
1542
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1540
def level
@level
end
|
Instance Method Details
#==(other) ⇒ Object
1561
1562
1563
1564
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1561
def ==(other)
other.is_a?(GetBlockParam) && other.index == index &&
other.level == level
end
|
#call(vm) ⇒ Object
1574
1575
1576
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1574
def call(vm)
vm.push(vm.local_get(index, level))
end
|
#deconstruct_keys(_keys) ⇒ Object
1557
1558
1559
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1557
def deconstruct_keys(_keys)
{ index: index, level: level }
end
|
#disasm(fmt) ⇒ Object
1547
1548
1549
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1547
def disasm(fmt)
fmt.instruction("getblockparam", [fmt.local(index, explicit: level)])
end
|
#length ⇒ Object
1566
1567
1568
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1566
def length
3
end
|
#pushes ⇒ Object
1570
1571
1572
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1570
def pushes
1
end
|
#to_a(iseq) ⇒ Object
1551
1552
1553
1554
1555
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1551
def to_a(iseq)
current = iseq
level.times { current = iseq.parent_iseq }
[:getblockparam, current.local_table.offset(index), level]
end
|