diff --git a/lib/mom/instruction/dynamic_call.rb b/lib/mom/instruction/dynamic_call.rb index 680981fe..b27a0ce6 100644 --- a/lib/mom/instruction/dynamic_call.rb +++ b/lib/mom/instruction/dynamic_call.rb @@ -25,6 +25,7 @@ module Mom # Instead we need a DynamicJump instruction that explicitly takes a register as # a target (not a label) def to_risc(compiler) + compiler.add_constant( @cache_entry ) reg = compiler.use_reg( :Object ) call = Risc.load_constant( self , @cache_entry , reg ) method_index = Risc.resolve_to_index(:cache_entry , :cached_method) diff --git a/test/risc/interpreter/test_assign_local.rb b/test/risc/interpreter/test_assign_local.rb index 302ac94f..0e0b1617 100644 --- a/test/risc/interpreter/test_assign_local.rb +++ b/test/risc/interpreter/test_assign_local.rb @@ -10,16 +10,11 @@ module Risc 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, LoadConstant, RegToSlot, LoadConstant, RegToSlot, - FunctionCall, Label, LoadConstant, SlotToReg, RegToSlot, - SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, - RegToSlot, SlotToReg, SlotToReg, FunctionReturn, Transfer, - Syscall, NilClass] + #show_main_ticks # get output of what is + check_main_chain [Label, LoadConstant, SlotToReg, RegToSlot, SlotToReg, + SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, + SlotToReg, SlotToReg, FunctionReturn, Transfer, Syscall, + NilClass] assert_equal 15 , get_return.value end @@ -29,21 +24,21 @@ module Risc assert :main , call_ins.method.name end def test_load_15 - load_ins = ticks 28 + load_ins = main_ticks(2) assert_equal LoadConstant , load_ins.class assert_equal Parfait::Integer , @interpreter.get_register(load_ins.register).class assert_equal 15 , @interpreter.get_register(load_ins.register).value end def test_transfer - transfer = ticks(40) + transfer = main_ticks(14) assert_equal Transfer , transfer.class end def test_sys - sys = ticks(41) + sys = main_ticks(15) assert_equal Syscall , sys.class end def test_return - ret = ticks(39) + ret = main_ticks(13) assert_equal FunctionReturn , ret.class link = @interpreter.get_register( ret.register ) assert_equal Label , link.class diff --git a/test/risc/interpreter/test_div10.rb b/test/risc/interpreter/test_div10.rb index 633ac7b1..8ec5de35 100644 --- a/test/risc/interpreter/test_div10.rb +++ b/test/risc/interpreter/test_div10.rb @@ -10,52 +10,42 @@ module Risc 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, LoadConstant, RegToSlot, LoadConstant, RegToSlot, - FunctionCall, Label, LoadConstant, SlotToReg, SlotToReg, + #show_main_ticks # get output of what is + check_main_chain [Label, LoadConstant, SlotToReg, SlotToReg, RegToSlot, + LoadConstant, SlotToReg, SlotToReg, SlotToReg, SlotToReg, RegToSlot, LoadConstant, SlotToReg, SlotToReg, SlotToReg, - SlotToReg, RegToSlot, LoadConstant, SlotToReg, SlotToReg, - SlotToReg, SlotToReg, RegToSlot, LoadConstant, SlotToReg, - RegToSlot, LoadConstant, SlotToReg, RegToSlot, SlotToReg, - LoadConstant, FunctionCall, Label, SlotToReg, SlotToReg, - SlotToReg, SlotToReg, SlotToReg, SlotToReg, LoadData, - OperatorInstruction, LoadData, OperatorInstruction, OperatorInstruction, LoadData, - Transfer, OperatorInstruction, OperatorInstruction, LoadData, Transfer, + SlotToReg, RegToSlot, LoadConstant, SlotToReg, RegToSlot, + LoadConstant, SlotToReg, RegToSlot, SlotToReg, LoadConstant, + FunctionCall, Label, SlotToReg, SlotToReg, SlotToReg, + SlotToReg, SlotToReg, SlotToReg, LoadData, OperatorInstruction, + LoadData, OperatorInstruction, OperatorInstruction, LoadData, Transfer, OperatorInstruction, OperatorInstruction, LoadData, Transfer, OperatorInstruction, - OperatorInstruction, LoadData, OperatorInstruction, LoadData, Transfer, - OperatorInstruction, OperatorInstruction, Transfer, LoadData, OperatorInstruction, - LoadData, OperatorInstruction, OperatorInstruction, LoadConstant, SlotToReg, - SlotToReg, RegToSlot, RegToSlot, RegToSlot, SlotToReg, - SlotToReg, RegToSlot, SlotToReg, SlotToReg, FunctionReturn, + OperatorInstruction, LoadData, Transfer, OperatorInstruction, OperatorInstruction, + LoadData, OperatorInstruction, LoadData, Transfer, OperatorInstruction, + OperatorInstruction, Transfer, LoadData, OperatorInstruction, LoadData, + OperatorInstruction, OperatorInstruction, LoadConstant, SlotToReg, SlotToReg, + RegToSlot, RegToSlot, RegToSlot, SlotToReg, SlotToReg, + RegToSlot, SlotToReg, SlotToReg, FunctionReturn, SlotToReg, + SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, - RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, - SlotToReg, FunctionReturn, Transfer, Syscall, NilClass] + FunctionReturn, Transfer, Syscall, NilClass] assert_equal Parfait::Integer , get_return.class assert_equal 2 , get_return.value end - def test_call_main - call_ins = ticks(26) - assert_equal FunctionCall , call_ins.class - assert :main , call_ins.method.name - end def test_load_25 - load_ins = ticks 44 + load_ins = main_ticks 18 assert_equal LoadConstant , load_ins.class assert_equal 25 , @interpreter.get_register(load_ins.register).value end def test_return - ret = ticks(100) + ret = main_ticks(74) assert_equal FunctionReturn , ret.class link = @interpreter.get_register( ret.register ) assert_equal Label , link.class end def test_sys - sys = ticks(114) + sys = main_ticks(88) assert_equal Syscall , sys.class assert_equal :exit , sys.name end diff --git a/test/risc/interpreter/test_dynamic_call.rb b/test/risc/interpreter/test_dynamic_call.rb index 50fa6473..4b3afe51 100644 --- a/test/risc/interpreter/test_dynamic_call.rb +++ b/test/risc/interpreter/test_dynamic_call.rb @@ -10,24 +10,19 @@ module Risc end def test_chain - #show_ticks # get output of what is - check_chain [Branch, Label, LoadConstant, SlotToReg, LoadConstant, + #show_main_ticks # get output of what is + check_main_chain [Label, LoadConstant, SlotToReg, RegToSlot, LoadConstant, + SlotToReg, SlotToReg, SlotToReg, OperatorInstruction, IsZero, + SlotToReg, SlotToReg, LoadConstant, RegToSlot, LoadConstant, SlotToReg, SlotToReg, RegToSlot, LoadConstant, SlotToReg, SlotToReg, SlotToReg, SlotToReg, RegToSlot, LoadConstant, SlotToReg, SlotToReg, SlotToReg, SlotToReg, RegToSlot, - SlotToReg, LoadConstant, RegToSlot, LoadConstant, RegToSlot, - FunctionCall, Label, LoadConstant, SlotToReg, RegToSlot, - LoadConstant, SlotToReg, SlotToReg, SlotToReg, OperatorInstruction, - IsZero, SlotToReg, SlotToReg, LoadConstant, RegToSlot, - LoadConstant, SlotToReg, SlotToReg, RegToSlot, LoadConstant, - SlotToReg, SlotToReg, SlotToReg, SlotToReg, RegToSlot, - LoadConstant, SlotToReg, SlotToReg, SlotToReg, SlotToReg, - RegToSlot, LoadConstant, SlotToReg, RegToSlot, SlotToReg, - SlotToReg, SlotToReg, SlotToReg, RegToSlot, LoadConstant, - SlotToReg, RegToSlot, SlotToReg, LoadConstant, FunctionCall, - Label, SlotToReg, SlotToReg, SlotToReg, SlotToReg, - Label, LoadConstant, SlotToReg, OperatorInstruction, IsZero, - Label, Transfer, Syscall, NilClass] + LoadConstant, SlotToReg, RegToSlot, SlotToReg, SlotToReg, + SlotToReg, SlotToReg, RegToSlot, LoadConstant, SlotToReg, + RegToSlot, SlotToReg, LoadConstant, FunctionCall, Label, + SlotToReg, SlotToReg, SlotToReg, SlotToReg, Label, + LoadConstant, SlotToReg, OperatorInstruction, IsZero, Label, + Transfer, Syscall, NilClass] #assert_equal 1 , get_return end @@ -37,17 +32,17 @@ module Risc assert_equal :main , call_ins.method.name end def test_call_resolve - call_ins = ticks(70) + call_ins = main_ticks(44) assert_equal FunctionCall , call_ins.class assert_equal :resolve_method , call_ins.method.name end def test_label - call_ins = ticks(71) + call_ins = main_ticks(45) assert_equal Label , call_ins.class assert_equal "Word_Type.resolve_method" , call_ins.name end def test_arg_15_to_resolve - sl = ticks( 74 ) + sl = main_ticks( 48 ) assert_equal SlotToReg , sl.class assert_equal :r2 , sl.array.symbol #load from message assert_equal 2 , sl.index @@ -57,7 +52,7 @@ module Risc end def est_dyn - cal = ticks(102) + cal = main_ticks(76) assert_equal DynamicJump , cal.class end #should end in exit, but doesn't, becasue resolve never returns diff --git a/test/risc/interpreter/test_get_byte.rb b/test/risc/interpreter/test_get_byte.rb index 5b3d7afa..76d53829 100644 --- a/test/risc/interpreter/test_get_byte.rb +++ b/test/risc/interpreter/test_get_byte.rb @@ -9,35 +9,30 @@ module Risc 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, LoadConstant, RegToSlot, LoadConstant, RegToSlot, - FunctionCall, Label, LoadConstant, SlotToReg, SlotToReg, + #show_main_ticks # get output of what is + check_main_chain [Label, LoadConstant, SlotToReg, SlotToReg, RegToSlot, + LoadConstant, SlotToReg, SlotToReg, SlotToReg, SlotToReg, RegToSlot, LoadConstant, SlotToReg, SlotToReg, SlotToReg, - SlotToReg, RegToSlot, LoadConstant, SlotToReg, SlotToReg, - SlotToReg, SlotToReg, RegToSlot, LoadConstant, SlotToReg, - RegToSlot, LoadConstant, SlotToReg, SlotToReg, RegToSlot, - LoadConstant, SlotToReg, RegToSlot, SlotToReg, LoadConstant, - FunctionCall, Label, SlotToReg, SlotToReg, SlotToReg, - SlotToReg, ByteToReg, LoadConstant, SlotToReg, SlotToReg, - RegToSlot, RegToSlot, RegToSlot, SlotToReg, SlotToReg, - RegToSlot, SlotToReg, SlotToReg, FunctionReturn, SlotToReg, - SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, - SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, - FunctionReturn, Transfer, Syscall, NilClass] + SlotToReg, RegToSlot, LoadConstant, SlotToReg, RegToSlot, + LoadConstant, SlotToReg, SlotToReg, RegToSlot, LoadConstant, + SlotToReg, RegToSlot, SlotToReg, LoadConstant, FunctionCall, + Label, SlotToReg, SlotToReg, SlotToReg, SlotToReg, + ByteToReg, LoadConstant, SlotToReg, SlotToReg, RegToSlot, + RegToSlot, RegToSlot, SlotToReg, SlotToReg, RegToSlot, + SlotToReg, SlotToReg, FunctionReturn, SlotToReg, SlotToReg, + RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, + SlotToReg, RegToSlot, SlotToReg, SlotToReg, FunctionReturn, + Transfer, Syscall, NilClass] assert_equal Parfait::Integer , get_return.class assert_equal "H".ord , get_return.value end def test_exit - done = ticks(88) + done = main_ticks(62) assert_equal Syscall , done.class end def test_byte_to_reg - done = ticks(62) + done = main_ticks(36) assert_equal ByteToReg , done.class assert_equal "H".ord , @interpreter.get_register(done.register) end diff --git a/test/risc/interpreter/test_minus.rb b/test/risc/interpreter/test_minus.rb index 07180bd4..bb118576 100644 --- a/test/risc/interpreter/test_minus.rb +++ b/test/risc/interpreter/test_minus.rb @@ -10,36 +10,31 @@ module Risc end def test_minus - #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, LoadConstant, RegToSlot, LoadConstant, RegToSlot, - FunctionCall, Label, LoadConstant, SlotToReg, SlotToReg, + #show_main_ticks # get output of what is + check_main_chain [Label, LoadConstant, SlotToReg, SlotToReg, RegToSlot, + LoadConstant, SlotToReg, SlotToReg, SlotToReg, SlotToReg, RegToSlot, LoadConstant, SlotToReg, SlotToReg, SlotToReg, - SlotToReg, RegToSlot, LoadConstant, SlotToReg, SlotToReg, - SlotToReg, SlotToReg, RegToSlot, LoadConstant, SlotToReg, - RegToSlot, LoadConstant, SlotToReg, SlotToReg, RegToSlot, - LoadConstant, SlotToReg, RegToSlot, SlotToReg, LoadConstant, - FunctionCall, Label, SlotToReg, SlotToReg, SlotToReg, - SlotToReg, SlotToReg, OperatorInstruction, LoadConstant, SlotToReg, - SlotToReg, RegToSlot, RegToSlot, RegToSlot, SlotToReg, - SlotToReg, RegToSlot, SlotToReg, SlotToReg, FunctionReturn, + SlotToReg, RegToSlot, LoadConstant, SlotToReg, RegToSlot, + LoadConstant, SlotToReg, SlotToReg, RegToSlot, LoadConstant, + SlotToReg, RegToSlot, SlotToReg, LoadConstant, FunctionCall, + Label, SlotToReg, SlotToReg, SlotToReg, SlotToReg, + SlotToReg, OperatorInstruction, LoadConstant, SlotToReg, SlotToReg, + RegToSlot, RegToSlot, RegToSlot, SlotToReg, SlotToReg, + RegToSlot, SlotToReg, SlotToReg, FunctionReturn, SlotToReg, + SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, - RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, - SlotToReg, FunctionReturn, Transfer, Syscall, NilClass] + FunctionReturn, Transfer, Syscall, NilClass] assert_equal Parfait::Integer , get_return.class assert_equal 1 , get_return.value end def test_load_5 - lod = ticks( 47 ) + lod = main_ticks( 21 ) assert_equal LoadConstant , lod.class assert_equal Parfait::Integer , lod.constant.class assert_equal 5 , lod.constant.value end def test_op - op = ticks(63) + op = main_ticks(37) assert_equal OperatorInstruction , op.class assert_equal :r1 , op.left.symbol assert_equal :r2 , op.right.symbol @@ -47,7 +42,7 @@ module Risc assert_equal 1 , @interpreter.get_register(:r1) end def test_sys - sys = ticks(89) + sys = main_ticks(63) assert_equal Syscall , sys.class assert_equal :exit , sys.name end diff --git a/test/risc/interpreter/test_mod.rb b/test/risc/interpreter/test_mod.rb index e7432988..6d483664 100644 --- a/test/risc/interpreter/test_mod.rb +++ b/test/risc/interpreter/test_mod.rb @@ -10,35 +10,30 @@ module Risc 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, LoadConstant, RegToSlot, LoadConstant, RegToSlot, - FunctionCall, Label, LoadConstant, SlotToReg, SlotToReg, + #show_main_ticks # get output of what is + check_main_chain [Label, LoadConstant, SlotToReg, SlotToReg, RegToSlot, + LoadConstant, SlotToReg, SlotToReg, SlotToReg, SlotToReg, RegToSlot, LoadConstant, SlotToReg, SlotToReg, SlotToReg, - SlotToReg, RegToSlot, LoadConstant, SlotToReg, SlotToReg, - SlotToReg, SlotToReg, RegToSlot, LoadConstant, SlotToReg, - RegToSlot, LoadConstant, SlotToReg, RegToSlot, SlotToReg, - LoadConstant, FunctionCall, Label, SlotToReg, SlotToReg, - LoadData, OperatorInstruction, LoadConstant, SlotToReg, SlotToReg, - RegToSlot, RegToSlot, RegToSlot, SlotToReg, SlotToReg, - RegToSlot, SlotToReg, SlotToReg, FunctionReturn, SlotToReg, - SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, - SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, - FunctionReturn, Transfer, Syscall, NilClass] + SlotToReg, RegToSlot, LoadConstant, SlotToReg, RegToSlot, + LoadConstant, SlotToReg, RegToSlot, SlotToReg, LoadConstant, + FunctionCall, Label, SlotToReg, SlotToReg, LoadData, + OperatorInstruction, LoadConstant, SlotToReg, SlotToReg, RegToSlot, + RegToSlot, RegToSlot, SlotToReg, SlotToReg, RegToSlot, + SlotToReg, SlotToReg, FunctionReturn, SlotToReg, SlotToReg, + RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, + SlotToReg, RegToSlot, SlotToReg, SlotToReg, FunctionReturn, + Transfer, Syscall, NilClass] assert_equal Parfait::Integer , get_return.class assert_equal 2 , get_return.value end def test_load - lod = ticks(44) + lod = main_ticks(18) assert_equal LoadConstant , lod.class assert_equal 9 , lod.constant.value end def test_fix # reduce self to fix - sl = ticks(55) + sl = main_ticks(29) assert_equal SlotToReg , sl.class assert_equal :r1 , sl.array.symbol assert_equal 3 , sl.index @@ -47,7 +42,7 @@ module Risc end def test_sys - sys = ticks(83) + sys = main_ticks(57) assert_equal Syscall , sys.class assert_equal :exit , sys.name end diff --git a/test/risc/interpreter/test_mult.rb b/test/risc/interpreter/test_mult.rb index 2e43c4fe..3f9cf895 100644 --- a/test/risc/interpreter/test_mult.rb +++ b/test/risc/interpreter/test_mult.rb @@ -10,30 +10,25 @@ module Risc end def test_mult - #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, LoadConstant, RegToSlot, LoadConstant, RegToSlot, - FunctionCall, Label, LoadConstant, SlotToReg, SlotToReg, + #show_main_ticks # get output of what is + check_main_chain [Label, LoadConstant, SlotToReg, SlotToReg, RegToSlot, + LoadConstant, SlotToReg, SlotToReg, SlotToReg, SlotToReg, RegToSlot, LoadConstant, SlotToReg, SlotToReg, SlotToReg, - SlotToReg, RegToSlot, LoadConstant, SlotToReg, SlotToReg, - SlotToReg, SlotToReg, RegToSlot, LoadConstant, SlotToReg, - RegToSlot, LoadConstant, SlotToReg, SlotToReg, RegToSlot, - LoadConstant, SlotToReg, RegToSlot, SlotToReg, LoadConstant, - FunctionCall, Label, SlotToReg, SlotToReg, SlotToReg, - SlotToReg, SlotToReg, OperatorInstruction, LoadConstant, SlotToReg, - SlotToReg, RegToSlot, RegToSlot, RegToSlot, SlotToReg, - SlotToReg, RegToSlot, SlotToReg, SlotToReg, FunctionReturn, + SlotToReg, RegToSlot, LoadConstant, SlotToReg, RegToSlot, + LoadConstant, SlotToReg, SlotToReg, RegToSlot, LoadConstant, + SlotToReg, RegToSlot, SlotToReg, LoadConstant, FunctionCall, + Label, SlotToReg, SlotToReg, SlotToReg, SlotToReg, + SlotToReg, OperatorInstruction, LoadConstant, SlotToReg, SlotToReg, + RegToSlot, RegToSlot, RegToSlot, SlotToReg, SlotToReg, + RegToSlot, SlotToReg, SlotToReg, FunctionReturn, SlotToReg, + SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, - RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, - SlotToReg, FunctionReturn, Transfer, Syscall, NilClass] + FunctionReturn, Transfer, Syscall, NilClass] assert_equal Parfait::Integer , get_return.class assert_equal 0 , get_return.value end def test_op - op = ticks(63) + op = main_ticks(37) assert_equal OperatorInstruction , op.class assert_equal :r1 , op.left.symbol assert_equal :r2 , op.right.symbol @@ -41,7 +36,7 @@ module Risc assert_equal 0 , @interpreter.get_register(:r1) end def test_overflow - ticks( 63 ) + main_ticks( 37 ) assert @interpreter.flags[:overflow] end def test_zero diff --git a/test/risc/interpreter/test_plus.rb b/test/risc/interpreter/test_plus.rb index 5b9903ff..53bdee7f 100644 --- a/test/risc/interpreter/test_plus.rb +++ b/test/risc/interpreter/test_plus.rb @@ -10,64 +10,59 @@ module Risc end def test_add - #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, LoadConstant, RegToSlot, LoadConstant, RegToSlot, - FunctionCall, Label, LoadConstant, SlotToReg, SlotToReg, + #show_main_ticks # get output of what is + check_main_chain [Label, LoadConstant, SlotToReg, SlotToReg, RegToSlot, + LoadConstant, SlotToReg, SlotToReg, SlotToReg, SlotToReg, RegToSlot, LoadConstant, SlotToReg, SlotToReg, SlotToReg, - SlotToReg, RegToSlot, LoadConstant, SlotToReg, SlotToReg, - SlotToReg, SlotToReg, RegToSlot, LoadConstant, SlotToReg, - RegToSlot, LoadConstant, SlotToReg, SlotToReg, RegToSlot, - LoadConstant, SlotToReg, RegToSlot, SlotToReg, LoadConstant, - FunctionCall, Label, SlotToReg, SlotToReg, SlotToReg, - SlotToReg, SlotToReg, OperatorInstruction, LoadConstant, SlotToReg, - SlotToReg, RegToSlot, RegToSlot, RegToSlot, SlotToReg, - SlotToReg, RegToSlot, SlotToReg, SlotToReg, FunctionReturn, + SlotToReg, RegToSlot, LoadConstant, SlotToReg, RegToSlot, + LoadConstant, SlotToReg, SlotToReg, RegToSlot, LoadConstant, + SlotToReg, RegToSlot, SlotToReg, LoadConstant, FunctionCall, + Label, SlotToReg, SlotToReg, SlotToReg, SlotToReg, + SlotToReg, OperatorInstruction, LoadConstant, SlotToReg, SlotToReg, + RegToSlot, RegToSlot, RegToSlot, SlotToReg, SlotToReg, + RegToSlot, SlotToReg, SlotToReg, FunctionReturn, SlotToReg, + SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, - RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, - SlotToReg, FunctionReturn, Transfer, Syscall, NilClass] + FunctionReturn, Transfer, Syscall, NilClass] assert_equal Parfait::Integer , get_return.class assert_equal 10 , get_return.value end def test_load_5 - lod = ticks( 47 ) + lod = main_ticks( 21 ) assert_equal LoadConstant , lod.class assert_equal Parfait::Integer , lod.constant.class assert_equal 5 , lod.constant.value end def test_slot_receiver #load receiver from message - sl = ticks( 58 ) + sl = main_ticks( 32 ) assert_equal SlotToReg , sl.class assert_equal :r0 , sl.array.symbol #load from message assert_equal 3 , sl.index assert_equal :r1 , sl.register.symbol end def test_slot_args #load args from message - sl = ticks( 59 ) + sl = main_ticks( 33 ) assert_equal SlotToReg , sl.class assert_equal :r0 , sl.array.symbol #load from message assert_equal 9 , sl.index assert_equal :r2 , sl.register.symbol end def test_slot_arg #load arg 1, destructively from args - sl = ticks( 60 ) + sl = main_ticks( 34 ) assert_equal SlotToReg , sl.class assert_equal :r2 , sl.array.symbol #load from message assert_equal 2 , sl.index assert_equal :r2 , sl.register.symbol end def test_slot_int1 #load int from object - sl = ticks( 61 ) + sl = main_ticks( 35 ) assert_equal SlotToReg , sl.class assert_equal :r1 , sl.array.symbol #load from message assert_equal 3 , sl.index assert_equal :r1 , sl.register.symbol end def test_op - op = ticks(63) + op = main_ticks(37) assert_equal OperatorInstruction , op.class assert_equal :r1 , op.left.symbol assert_equal :r2 , op.right.symbol @@ -75,13 +70,13 @@ module Risc assert_equal 10 , @interpreter.get_register(:r1) end def test_load_int_space - cons = ticks(64) + cons = main_ticks(38) assert_equal LoadConstant , cons.class assert_equal Parfait::Space , cons.constant.class assert_equal :r3 , cons.register.symbol end def test_load_int_next_space - sl = ticks(65) + sl = main_ticks(39) assert_equal SlotToReg , sl.class assert_equal :r3 , sl.array.symbol #load from space assert_equal 5 , sl.index @@ -89,7 +84,7 @@ module Risc assert_equal Parfait::Integer , @interpreter.get_register(:r2).class end def test_load_int_next_int - sl = ticks(66) + sl = main_ticks(40) assert_equal SlotToReg , sl.class assert_equal :r2 , sl.array.symbol #load from next_int assert_equal 2 , sl.index @@ -97,14 +92,14 @@ module Risc assert_equal Parfait::Integer , @interpreter.get_register(:r4).class end def test_load_int_next_int2 - sl = ticks(67) + sl = main_ticks(41) assert_equal RegToSlot , sl.class assert_equal :r3 , sl.array.symbol #store to space assert_equal 5 , sl.index assert_equal :r4 , sl.register.symbol end def test_sys - sys = ticks(89) + sys = main_ticks(63) assert_equal Syscall , sys.class assert_equal :exit , sys.name end diff --git a/test/risc/interpreter/test_puts.rb b/test/risc/interpreter/test_puts.rb index 9b01c638..9ade29d8 100644 --- a/test/risc/interpreter/test_puts.rb +++ b/test/risc/interpreter/test_puts.rb @@ -10,37 +10,31 @@ module Risc 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, LoadConstant, RegToSlot, LoadConstant, RegToSlot, - FunctionCall, Label, LoadConstant, SlotToReg, SlotToReg, + #show_main_ticks # get output of what is + check_main_chain [Label, LoadConstant, SlotToReg, SlotToReg, RegToSlot, + LoadConstant, SlotToReg, SlotToReg, SlotToReg, SlotToReg, RegToSlot, LoadConstant, SlotToReg, SlotToReg, SlotToReg, - SlotToReg, RegToSlot, LoadConstant, SlotToReg, SlotToReg, - SlotToReg, SlotToReg, RegToSlot, LoadConstant, SlotToReg, - RegToSlot, LoadConstant, SlotToReg, RegToSlot, SlotToReg, - LoadConstant, FunctionCall, Label, SlotToReg, SlotToReg, - Transfer, Syscall, Transfer, Transfer, LoadConstant, - SlotToReg, SlotToReg, RegToSlot, RegToSlot, RegToSlot, + SlotToReg, RegToSlot, LoadConstant, SlotToReg, RegToSlot, + LoadConstant, SlotToReg, RegToSlot, SlotToReg, LoadConstant, + FunctionCall, Label, SlotToReg, SlotToReg, Transfer, + Syscall, Transfer, Transfer, LoadConstant, SlotToReg, + SlotToReg, RegToSlot, RegToSlot, RegToSlot, SlotToReg, + SlotToReg, RegToSlot, SlotToReg, SlotToReg, FunctionReturn, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, - FunctionReturn, SlotToReg, SlotToReg, RegToSlot, SlotToReg, - SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, - SlotToReg, SlotToReg, FunctionReturn, Transfer, Syscall, - NilClass] + RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, + SlotToReg, FunctionReturn, Transfer, Syscall, NilClass] assert_equal "Hello again" , @interpreter.stdout assert_equal Parfait::Integer , get_return.class assert_equal 11 , get_return.value #bytes written end def test_call - cal = ticks(52) + cal = main_ticks(26) assert_equal FunctionCall , cal.class assert_equal :putstring , cal.method.name end def test_putstring_sys - done = ticks(57) + done = main_ticks(31) assert_equal Syscall , done.class assert_equal "Hello again" , @interpreter.stdout assert_equal 11 , @interpreter.get_register(:r0) @@ -48,28 +42,28 @@ module Risc assert_equal "Hello again" , @interpreter.get_register(:r1).to_string end def test_move_sys_return - sl = ticks(58) + sl = main_ticks(32) assert_equal Transfer , sl.class assert_equal :r0 , sl.from.symbol assert_equal :r1 , sl.to.symbol assert_equal 11 , @interpreter.get_register(:r1) end def test_restore_message - sl = ticks(59) + sl = main_ticks(33) assert_equal Transfer , sl.class assert_equal :r8 , sl.from.symbol assert_equal :r0 , sl.to.symbol assert_equal Parfait::Message , @interpreter.get_register(:r0).class end def test_save_sys_return - sl = ticks(64) + sl = main_ticks(38) assert_equal RegToSlot , sl.class assert_equal :r1 , sl.register.symbol #return assert_equal :r2 , sl.array.symbol #parfait integer assert_equal 3 , sl.index end def test_return - done = ticks(71) + done = main_ticks(45) assert_equal FunctionReturn , done.class end diff --git a/test/risc/interpreter/test_return.rb b/test/risc/interpreter/test_return.rb index 36db90ec..fc25718a 100644 --- a/test/risc/interpreter/test_return.rb +++ b/test/risc/interpreter/test_return.rb @@ -10,15 +10,10 @@ module Risc 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, LoadConstant, RegToSlot, LoadConstant, RegToSlot, - FunctionCall, Label, LoadConstant, RegToSlot, SlotToReg, - SlotToReg, RegToSlot, SlotToReg, SlotToReg, FunctionReturn, - Transfer, Syscall, NilClass] + #show_main_ticks # get output of what is + check_main_chain [Label, LoadConstant, RegToSlot, SlotToReg, SlotToReg, + RegToSlot, SlotToReg, SlotToReg, FunctionReturn, Transfer, + Syscall, NilClass] assert_equal 5 , get_return.value end @@ -28,28 +23,28 @@ module Risc assert :main , call_ins.method.name end def test_label_main - call_ins = ticks(27) + call_ins = main_ticks(1) assert_equal Label , call_ins.class assert :main , call_ins.name end def test_load_5 - load_ins = ticks 28 + load_ins = main_ticks(2) assert_equal LoadConstant , load_ins.class assert_equal 5 , @interpreter.get_register(load_ins.register).value end - def test_transfer - transfer = ticks(36) - assert_equal Transfer , transfer.class - end - def test_sys - sys = ticks(37) - assert_equal Syscall , sys.class - end def test_return - ret = ticks(35) + ret = main_ticks(9) assert_equal FunctionReturn , ret.class link = @interpreter.get_register( ret.register ) assert_equal Label , link.class end + def test_transfer + transfer = main_ticks(10) + assert_equal Transfer , transfer.class + end + def test_sys + sys = main_ticks(11) + assert_equal Syscall , sys.class + end end end diff --git a/test/risc/interpreter/test_set_byte.rb b/test/risc/interpreter/test_set_byte.rb index 1e4b55b3..a9b50d6c 100644 --- a/test/risc/interpreter/test_set_byte.rb +++ b/test/risc/interpreter/test_set_byte.rb @@ -10,36 +10,30 @@ module Risc 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, LoadConstant, RegToSlot, LoadConstant, RegToSlot, - FunctionCall, Label, LoadConstant, SlotToReg, SlotToReg, + #show_main_ticks # get output of what is + check_main_chain [Label, LoadConstant, SlotToReg, SlotToReg, RegToSlot, + LoadConstant, SlotToReg, SlotToReg, SlotToReg, SlotToReg, RegToSlot, LoadConstant, SlotToReg, SlotToReg, SlotToReg, - SlotToReg, RegToSlot, LoadConstant, SlotToReg, SlotToReg, - SlotToReg, SlotToReg, RegToSlot, LoadConstant, SlotToReg, - RegToSlot, LoadConstant, SlotToReg, SlotToReg, RegToSlot, + SlotToReg, RegToSlot, LoadConstant, SlotToReg, RegToSlot, LoadConstant, SlotToReg, SlotToReg, RegToSlot, LoadConstant, - SlotToReg, RegToSlot, SlotToReg, LoadConstant, FunctionCall, - Label, SlotToReg, SlotToReg, SlotToReg, SlotToReg, - SlotToReg, SlotToReg, SlotToReg, RegToByte, RegToSlot, + SlotToReg, SlotToReg, RegToSlot, LoadConstant, SlotToReg, + RegToSlot, SlotToReg, LoadConstant, FunctionCall, Label, + SlotToReg, SlotToReg, SlotToReg, SlotToReg, SlotToReg, + SlotToReg, SlotToReg, RegToByte, RegToSlot, SlotToReg, + SlotToReg, RegToSlot, SlotToReg, SlotToReg, FunctionReturn, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, - FunctionReturn, SlotToReg, SlotToReg, RegToSlot, SlotToReg, - SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, - SlotToReg, SlotToReg, FunctionReturn, Transfer, Syscall, - NilClass] + RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, + SlotToReg, FunctionReturn, Transfer, Syscall, NilClass] assert_equal Parfait::Word , get_return.class assert_equal "Kello" , get_return.to_string end def test_reg_to_byte - done = ticks(69) + done = main_ticks(43) assert_equal RegToByte , done.class assert_equal "K".ord , @interpreter.get_register(done.register) end def test_exit - done = ticks(90) + done = main_ticks(64) assert_equal Syscall , done.class end diff --git a/test/risc/interpreter/test_simple_if10.rb b/test/risc/interpreter/test_simple_if10.rb index 5ac44b50..24b81125 100644 --- a/test/risc/interpreter/test_simple_if10.rb +++ b/test/risc/interpreter/test_simple_if10.rb @@ -1,7 +1,7 @@ require_relative "helper" module Risc - class InterreterSimpleIf10 < MiniTest::Test + class InterpreterSimpleIf10 < MiniTest::Test include Ticker def setup @@ -10,21 +10,16 @@ module Risc end def test_if - #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, LoadConstant, RegToSlot, LoadConstant, RegToSlot, - FunctionCall, Label, LoadConstant, LoadConstant, OperatorInstruction, - IsNotZero, Label, LoadConstant, RegToSlot, SlotToReg, - SlotToReg, RegToSlot, SlotToReg, SlotToReg, FunctionReturn, - Transfer, Syscall, NilClass] + #show_main_ticks # get output of what is in main + check_main_chain [Label, LoadConstant, LoadConstant, OperatorInstruction, IsNotZero, + Label, LoadConstant, RegToSlot, SlotToReg, SlotToReg, + RegToSlot, SlotToReg, SlotToReg, FunctionReturn, Transfer, + Syscall, NilClass] assert_equal Parfait::Word , get_return.class assert_equal "else" , get_return.to_string end def test_exit - done = ticks(42) + done = main_ticks(16) assert_equal Syscall , done.class end end diff --git a/test/support/risc.rb b/test/support/risc.rb index ddbed283..c61603f6 100644 --- a/test/support/risc.rb +++ b/test/support/risc.rb @@ -2,18 +2,37 @@ module Risc # relies on @interpreter instance to be set up during setup module InterpreterHelpers - def check_chain should + # check the given array of instructions is what the interpreter actually does + # possible second argument ignores the given amount, usually up until main + def check_chain( should , start_at = 0 ) + ticks( start_at ) if start_at > 0 should.each_with_index do |name , index| got = ticks(1) - assert_equal got.class ,name , "Wrong class for #{index+1}, expect #{name} , got #{got}" + assert_equal got.class ,name , "Wrong class for #{index + 1 - start_at}, expect #{name} , got #{got}" end end + # check the main only, ignoring the __init instructions + def check_main_chain( should ) + check_chain( should , main_at) + end + + # how many instruction up until the main starts, ie + # ticks(main_at) will be the label for main + def main_at + 26 + end def get_return assert_equal Parfait::Message , @interpreter.get_register(:r0).class @interpreter.get_register(:r0).return_value end + # do as many as given ticks in the main, ie main_at more + def main_ticks(num) + ticks( main_at + num) + end + + # do a certain number of steps in the interpreter and return the last executed instruction def ticks( num ) last = nil num.times do @@ -23,7 +42,8 @@ module Risc return last end - def show_ticks + # collect the classes of all executed istructions + def all_classes classes = [] tick = 1 begin @@ -38,6 +58,22 @@ module Risc puts e puts e.backtrace end + classes + end + + # for chaning the tests quickly output all instructions that are executed + def show_ticks + classes = all_classes + output_classes(classes) + end + # show all instructions of the main only + def show_main_ticks + classes = all_classes + classes = classes.slice(main_at , 1000) + output_classes(classes) + end + + def output_classes(classes) str = classes.to_s.gsub("Risc::","") all = str.split(",").each_slice(5).collect {|line| " " + line.join(",")} puts all.join(",\n")