rubyx/lib/mom/instruction/block_yield.rb
Torsten Ruger ce157ffa94 change block_yield to_risc to use builder
only changes the order of two instructions
2018-08-16 08:58:49 +03:00

36 lines
881 B
Ruby

module Mom
# A BlockYield calls an argument block. All we need to know is the index
# of the argument, and the rest is almost as simple as a SimpleCall
class BlockYield < Instruction
attr :arg_index
def initialize(index)
@arg_index = index
end
def to_s
"BlockYield[#{arg_index}] "
end
def to_risc(compiler)
return_label = Risc.label("block_yield", "continue_#{object_id}")
index = arg_index
compiler.build("BlockYield") do
next_message! << message[:next_message]
return_address! << return_label
next_message[:return_address] << return_address
block_reg! << message[:arguments]
block_reg << block_reg[index]
message << message[:next_message]
add_code Risc::DynamicJump.new("block_yield", block_reg )
add_code return_label
end
end
end
end