diff --git a/lib/mom/instruction/truth_check.rb b/lib/mom/instruction/truth_check.rb index 6679b056..4c0c8b07 100644 --- a/lib/mom/instruction/truth_check.rb +++ b/lib/mom/instruction/truth_check.rb @@ -20,11 +20,11 @@ module Mom false_load = SlotDefinition.new( FalseConstant.new , [] ).to_register(compiler,self) left << false_load left << Risc.op( self , :- , left.register , false_load.register) - left << Risc::IsNotZero.new( self, false_label) + left << Risc::IsZero.new( self, false_label) nil_load = SlotDefinition.new( NilConstant.new , [] ).to_register(compiler,self) left << nil_load left << Risc.op( self , :- , left.register , nil_load.register) - left << Risc::IsNotZero.new( self, false_label) + left << Risc::IsZero.new( self, false_label) left end diff --git a/lib/vool/statements/if_statement.rb b/lib/vool/statements/if_statement.rb index e8806968..b28056a2 100644 --- a/lib/vool/statements/if_statement.rb +++ b/lib/vool/statements/if_statement.rb @@ -21,6 +21,20 @@ module Vool end def to_mom( method ) + if_false ? full_if(method) : simple_if(method) + end + + def simple_if(method) + true_label = Mom::Label.new( "true_label_#{object_id}") + merge_label = Mom::Label.new( "merge_label_#{object_id}") + + head = Mom::TruthCheck.new(condition.slot_definition(method) , merge_label) + head << true_label + head << if_true.to_mom(method) + head << merge_label + end + + def full_if(method) true_label = Mom::Label.new( "true_label_#{object_id}") false_label = Mom::Label.new( "false_label_#{object_id}") merge_label = Mom::Label.new( "merge_label_#{object_id}") @@ -28,13 +42,10 @@ module Vool head = Mom::TruthCheck.new(condition.slot_definition(method) , false_label) head << true_label head << if_true.to_mom(method) - head << Mom::Jump.new(merge_label) if if_false + head << Mom::Jump.new(merge_label) head << false_label - if if_false - head << if_false.to_mom(method) - head << merge_label - end - head + head << if_false.to_mom(method) + head << merge_label end def each(&block) diff --git a/test/mom/test_if_else.rb b/test/mom/test_if_else.rb index f22247a2..4aa90156 100644 --- a/test/mom/test_if_else.rb +++ b/test/mom/test_if_else.rb @@ -7,9 +7,9 @@ module Risc def setup super @input = "if(@a) ; arg = 5 ; else; arg = 6; end" - @expect = [SlotToReg, SlotToReg, LoadConstant, OperatorInstruction, IsNotZero , - LoadConstant, OperatorInstruction, IsNotZero, Label, LoadConstant , - SlotToReg, RegToSlot, Branch, Label, LoadConstant , + @expect = [SlotToReg, SlotToReg, LoadConstant, OperatorInstruction, IsZero, + LoadConstant, OperatorInstruction, IsZero, Label, LoadConstant, + SlotToReg, RegToSlot, Branch, Label, LoadConstant, SlotToReg, RegToSlot, Label] end diff --git a/test/mom/test_if_no_else.rb b/test/mom/test_if_no_else.rb index 1a665e6e..1407c1ec 100644 --- a/test/mom/test_if_no_else.rb +++ b/test/mom/test_if_no_else.rb @@ -7,8 +7,8 @@ module Risc def setup super @input = "if(@a) ; arg = 5 ; end" - @expect = [SlotToReg, SlotToReg, LoadConstant, OperatorInstruction, IsNotZero , - LoadConstant, OperatorInstruction, IsNotZero, Label, LoadConstant , + @expect = [SlotToReg, SlotToReg, LoadConstant, OperatorInstruction, IsZero, + LoadConstant, OperatorInstruction, IsZero, Label, LoadConstant, SlotToReg, RegToSlot, Label] end @@ -22,8 +22,9 @@ module Risc end def test_isnotzero produced = produce_body - assert_equal IsNotZero , produced.next(4).class - assert produced.next(4).label.name.start_with?("false_label") + check = produced.next(4) + assert_equal IsZero , check.class + assert check.label.name.start_with?("merge_label") , check.label.name end def test_false_label produced = produce_body diff --git a/test/mom/test_while.rb b/test/mom/test_while.rb index 14b8c91f..067593c3 100644 --- a/test/mom/test_while.rb +++ b/test/mom/test_while.rb @@ -7,8 +7,8 @@ module Risc def setup super @input = "while(@a) ; arg = 5 end" - @expect = [Label, SlotToReg, SlotToReg, LoadConstant, OperatorInstruction , - IsNotZero, LoadConstant, OperatorInstruction, IsNotZero, LoadConstant , + @expect = [Label, SlotToReg, SlotToReg, LoadConstant, OperatorInstruction, + IsZero, LoadConstant, OperatorInstruction, IsZero, LoadConstant, SlotToReg, RegToSlot, Branch, Label] end diff --git a/test/risc/interpreter/test_simple_if10.rb b/test/risc/interpreter/test_simple_if10.rb index 24b81125..28e387c0 100644 --- a/test/risc/interpreter/test_simple_if10.rb +++ b/test/risc/interpreter/test_simple_if10.rb @@ -11,15 +11,35 @@ module Risc def test_if #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] + check_main_chain [Label, LoadConstant, LoadConstant, OperatorInstruction, IsZero, + LoadConstant, OperatorInstruction, IsZero, 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 + assert_equal "then" , get_return.to_string + end + def test_load_10 + load = main_ticks(2) + assert_equal LoadConstant , load.class + assert_equal 10 , load.constant.value + end + def test_load_false + load = main_ticks(3) + assert_equal LoadConstant , load.class + assert_equal Parfait::FalseClass , load.constant.class + end + def test_compare + op = main_ticks(4) + assert_equal OperatorInstruction , op.class + assert_equal :- , op.operator + end + def test_not_zero + check = main_ticks(5) + assert_equal IsZero , check.class + assert check.label.name.start_with?("false_label") , check.label.name end def test_exit - done = main_ticks(16) + done = main_ticks(19) assert_equal Syscall , done.class end end