diff --git a/lib/common/list.rb b/lib/common/list.rb index fc664f1a..7ae4d31d 100644 --- a/lib/common/list.rb +++ b/lib/common/list.rb @@ -42,6 +42,7 @@ module Common # so append the given code to the linked list at the end def append( code ) last.set_next code + self end alias :<< :append diff --git a/lib/vool/statements/send_statement.rb b/lib/vool/statements/send_statement.rb index 3ac65aa2..2b7841a5 100644 --- a/lib/vool/statements/send_statement.rb +++ b/lib/vool/statements/send_statement.rb @@ -46,12 +46,12 @@ module Vool end def message_setup(in_method) - setup = [Mom::MessageSetup.new(in_method)] - receiver = @receiver.slot_class.new([:message , :next_message , :receiver] , @receiver.to_mom(in_method)) + setup = Mom::MessageSetup.new(in_method) << + Mom::SlotLoad.new([:message , :next_message , :receiver] , @receiver.slot_definition(in_method)) arg_target = [:message , :next_message , :arguments] args = [] @arguments.each_with_index do |arg , index| - args << arg.slot_class.new( arg_target + [index] , arg.to_mom(in_method)) + args << Mom::SlotLoad.new( arg_target + [index] , arg.slot_definition(in_method)) end setup << Mom::ArgumentTransfer.new( receiver , args ) end diff --git a/lib/vool/statements/statements.rb b/lib/vool/statements/statements.rb index c218548b..2b5213f3 100644 --- a/lib/vool/statements/statements.rb +++ b/lib/vool/statements/statements.rb @@ -50,8 +50,14 @@ module Vool @statements.each{|a| a.each(&block)} end + def normalize + Statements.new(@statements.collect{|s| s.normalize}) + end end class ScopeStatement < Statements + def normalize + ScopeStatement.new(@statements.collect{|s| s.normalize}) + end end end diff --git a/test/vool/to_mom/send/simple_send_harness.rb b/test/vool/to_mom/send/simple_send_harness.rb index 56bd0504..7494f9a9 100644 --- a/test/vool/to_mom/send/simple_send_harness.rb +++ b/test/vool/to_mom/send/simple_send_harness.rb @@ -1,31 +1,31 @@ module Vool - # relies on @stats and receiver_type method + # relies on @ins and receiver_type method module SimpleSendHarness def test_compiles_not_array - assert Array != @stats.class , @stats + assert Array != @ins.class , @ins end def test_class_compiles - assert_equal Mom::MessageSetup , @stats.class , @stats + assert_equal Mom::MessageSetup , @ins.class , @ins end def test_two_instructions_are_returned - assert_equal 3 , @stats.length , @stats.to_rxf + assert_equal 4 , @ins.length , @ins end def test_receiver_move_class - assert_equal Mom::ArgumentTransfer, @stats[1].class + assert_equal Mom::ArgumentTransfer, @ins.next(2).class end def test_receiver_move - assert_equal :receiver, @stats[1].receiver.left.slots[1] + assert_equal :receiver, @ins.next(1).left.slots[1] end def test_receiver type , value = receiver - assert_equal type, @stats[1].receiver.right.class - assert_equal value, @stats[1].receiver.right.value + assert_equal type, @ins.next.right.class + assert_equal value, @ins.next.right.value end def test_call_is - assert_equal Mom::SimpleCall, @stats[2].class + assert_equal Mom::SimpleCall, @ins.next(3).class end def test_call_has_method - assert_equal Parfait::TypedMethod, @stats[2].method.class + assert_equal Parfait::TypedMethod, @ins.next(3).method.class end end end diff --git a/test/vool/to_mom/send/test_send_simple_args.rb b/test/vool/to_mom/send/test_send_simple_args.rb index 22dbf14a..99763aa7 100644 --- a/test/vool/to_mom/send/test_send_simple_args.rb +++ b/test/vool/to_mom/send/test_send_simple_args.rb @@ -8,22 +8,22 @@ module Vool def setup Risc.machine.boot - @stats = compile_first_method( "5.mod4(1,2)").first + @ins = compile_first_method( "5.mod4(1,2)") end def receiver [Mom::IntegerConstant , 5] end def test_args_two_move - assert_equal :next_message, @stats[1].arguments[1].left.slots[0] - assert_equal :arguments, @stats[1].arguments[1].left.slots[1] + assert_equal :next_message, @ins.next(2).arguments[1].left.slots[0] + assert_equal :arguments, @ins.next(2).arguments[1].left.slots[1] end def test_args_two_str - assert_equal Mom::IntegerConstant, @stats[1].arguments[1].right.class - assert_equal 2, @stats[1].arguments[1].right.value + assert_equal Mom::IntegerConstant, @ins.next(2).arguments[1].right.class + assert_equal 2, @ins.next(2).arguments[1].right.value end def test_array - check_array [MessageSetup,ArgumentTransfer,SimpleCall] , @stats + check_array [Mom::MessageSetup,Mom::SlotLoad,Mom::ArgumentTransfer,Mom::SimpleCall] , @ins end end end diff --git a/test/vool/to_mom/test_if_simple.rb b/test/vool/to_mom/test_if_simple.rb index e8e7b2bb..ca364445 100644 --- a/test/vool/to_mom/test_if_simple.rb +++ b/test/vool/to_mom/test_if_simple.rb @@ -7,27 +7,26 @@ module Vool def setup Risc.machine.boot - @stats = compile_first_method( "if(@a) ; 5.mod4 ; else; 4.mod4 ; end") - @first = @stats.first + @ins = compile_first_method( "if(@a) ; 5.mod4 ; else; 4.mod4 ; end") end def test_compiles_not_array - assert Array != @stats.class , @stats + assert Array != @ins.class , @ins end def test_if_compiles_as_array - assert_equal Mom::IfStatement , @first.class , @stats + assert_equal Mom::IfStatement , @ins.class , @ins end def test_condition_compiles_to_check - assert_equal Mom::TruthCheck , @first.condition.class , @stats + assert_equal Mom::TruthCheck , @ins.condition.class , @ins end def test_condition_is_slot - assert_equal Mom::SlotDefinition , @first.condition.condition.class , @stats + assert_equal Mom::SlotDefinition , @ins.condition.condition.class , @ins end def test_nothing_hoisted - assert_nil @first.hoisted , @stats + assert_nil @ins.hoisted , @ins end def test_array - check_array [SlotLoad,TruthCheck,Label,MessageSetup,ArgumentTransfer,SimpleCall,Label], @stats + check_array [SlotLoad,TruthCheck,Label,MessageSetup,ArgumentTransfer,SimpleCall,Label], @ins end end end