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.
1489
1490
1491
1492
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1489
def initialize(index, level)
@index = index
@level = level
end
|
Instance Attribute Details
#index ⇒ Object
Returns the value of attribute index.
1487
1488
1489
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1487
def index
@index
end
|
#level ⇒ Object
Returns the value of attribute level.
1487
1488
1489
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1487
def level
@level
end
|
Instance Method Details
#==(other) ⇒ Object
1508
1509
1510
1511
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1508
def ==(other)
other.is_a?(GetBlockParam) && other.index == index &&
other.level == level
end
|
#call(vm) ⇒ Object
1521
1522
1523
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1521
def call(vm)
vm.push(vm.local_get(index, level))
end
|
#deconstruct_keys(_keys) ⇒ Object
1504
1505
1506
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1504
def deconstruct_keys(_keys)
{ index: index, level: level }
end
|
#disasm(fmt) ⇒ Object
1494
1495
1496
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1494
def disasm(fmt)
fmt.instruction("getblockparam", [fmt.local(index, explicit: level)])
end
|
#length ⇒ Object
1513
1514
1515
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1513
def length
3
end
|
#pushes ⇒ Object
1517
1518
1519
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1517
def pushes
1
end
|
#to_a(iseq) ⇒ Object
1498
1499
1500
1501
1502
|
# File 'lib/syntax_tree/yarv/instructions.rb', line 1498
def to_a(iseq)
current = iseq
level.times { current = iseq.parent_iseq }
[:getblockparam, current.local_table.offset(index), level]
end
|