diff --git a/lib/risc/builtin/kernel.rb b/lib/risc/builtin/kernel.rb index b05429fa..2cd3cab7 100644 --- a/lib/risc/builtin/kernel.rb +++ b/lib/risc/builtin/kernel.rb @@ -19,8 +19,10 @@ module Risc message_ind = Risc.resolve_to_index( :space , :first_message ) #load the first_message (instance of space) compiler.add_slot_to_reg( "__init__ load 1st message" , space_reg , message_ind , :message) + compiler.add_mom( Mom::MessageSetup.new(compiler.method)) # but use it's next message, so main can return normally compiler.add_slot_to_reg( "__init__ load 2nd message" , :message , :next_message , :message) + compiler.add_reg_to_slot( "__init__ store Space in message", space_reg , :message , :receiver) #fixme: should add arg type here, as done in call_site (which this sort of is) exit_label = Risc.label("_exit_label for __init__" , "#{compiler.type.object_class.name}.#{compiler.method.name}" ) diff --git a/test/mom/assign/test_assign_local_const.rb b/test/mom/assign/test_assign_local_const.rb index 5ddf1254..77229702 100644 --- a/test/mom/assign/test_assign_local_const.rb +++ b/test/mom/assign/test_assign_local_const.rb @@ -18,9 +18,15 @@ module Risc assert_equal 5 , produced.constant.value end - def test_slot_move + def test_frame_load + produced = produce_body + assert_equal :Message , produced.next(1).array.type + assert_equal 4 , produced.next(1).index # 4 is frame + end + def test_value_load produced = produce_body assert_equal produced.next(2).register , produced.register + assert_equal 2 , produced.next(2).index #type == 1 , r == 2 end end diff --git a/test/risc/interpreter/test_assign_local.rb b/test/risc/interpreter/test_assign_local.rb new file mode 100644 index 00000000..dc826f09 --- /dev/null +++ b/test/risc/interpreter/test_assign_local.rb @@ -0,0 +1,51 @@ +require_relative "helper" + +module Risc + class InterpreterAssignLocal < MiniTest::Test + include Ticker + + def setup + @string_input = as_main("a = 15 ; return a") + super + end + + def test_chain + #show_ticks # get output of what is + check_chain [Branch, Label, LoadConstant, SlotToReg, LoadConstant, + SlotToReg, SlotToReg, RegToSlot, LoadConstant, SlotToReg, + SlotToReg, SlotToReg, SlotToReg, RegToSlot, LoadConstant, + SlotToReg, SlotToReg, SlotToReg, SlotToReg, RegToSlot, + SlotToReg, RegToSlot, LoadConstant, RegToSlot, FunctionCall, + Label, LoadConstant, SlotToReg, RegToSlot, SlotToReg, + SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, + SlotToReg, SlotToReg, FunctionReturn, Transfer, Syscall, + NilClass] + assert_equal 15 , get_return + end + + def test_call_main + call_ins = ticks(25) + assert_equal FunctionCall , call_ins.class + assert :main , call_ins.method.name + end + def test_load_15 + load_ins = ticks 27 + assert_equal LoadConstant , load_ins.class + assert_equal 15 , @interpreter.get_register(load_ins.register) + end + def test_transfer + transfer = ticks(39) + assert_equal Transfer , transfer.class + end + def test_sys + sys = ticks(40) + assert_equal Syscall , sys.class + end + def test_return + ret = ticks(38) + assert_equal FunctionReturn , ret.class + link = @interpreter.get_register( ret.register ) + assert_equal Label , link.class + end + end +end diff --git a/test/risc/interpreter/test_return.rb b/test/risc/interpreter/test_return.rb index 7b8e6a78..ef6aa7e5 100644 --- a/test/risc/interpreter/test_return.rb +++ b/test/risc/interpreter/test_return.rb @@ -11,34 +11,42 @@ module Risc def test_chain #show_ticks # get output of what is - check_chain [Branch, Label, LoadConstant, SlotToReg, SlotToReg, - RegToSlot, LoadConstant, RegToSlot, FunctionCall, Label, - LoadConstant, RegToSlot, SlotToReg, SlotToReg, RegToSlot, - SlotToReg, SlotToReg, FunctionReturn, Transfer, Syscall, - NilClass] + check_chain [Branch, Label, LoadConstant, SlotToReg, LoadConstant, + SlotToReg, SlotToReg, RegToSlot, LoadConstant, SlotToReg, + SlotToReg, SlotToReg, SlotToReg, RegToSlot, LoadConstant, + SlotToReg, SlotToReg, SlotToReg, SlotToReg, RegToSlot, + SlotToReg, RegToSlot, LoadConstant, RegToSlot, FunctionCall, + Label, LoadConstant, RegToSlot, SlotToReg, SlotToReg, + RegToSlot, SlotToReg, SlotToReg, FunctionReturn, Transfer, + Syscall, NilClass] assert_equal 5 , get_return end def test_call_main - call_ins = ticks(9) + call_ins = ticks(25) assert_equal FunctionCall , call_ins.class assert :main , call_ins.method.name end + def test_label_main + call_ins = ticks(26) + assert_equal Label , call_ins.class + assert :main , call_ins.name + end def test_load_5 - load_ins = ticks 11 + load_ins = ticks 27 assert_equal LoadConstant , load_ins.class assert_equal 5 , @interpreter.get_register(load_ins.register) end def test_transfer - transfer = ticks(19) + transfer = ticks(35) assert_equal Transfer , transfer.class end def test_sys - sys = ticks(20) + sys = ticks(36) assert_equal Syscall , sys.class end def test_return - ret = ticks(18) + ret = ticks(34) assert_equal FunctionReturn , ret.class link = @interpreter.get_register( ret.register ) assert_equal Label , link.class