diff --git a/lib/mom/if_statement.rb b/lib/mom/if_statement.rb index 14c58f0e..6a733741 100644 --- a/lib/mom/if_statement.rb +++ b/lib/mom/if_statement.rb @@ -11,7 +11,17 @@ module Mom end def flatten - self + head = hoisted.flatten + true_label = Label.new( "true_label_#{object_id}") + false_label = Label.new( "false_label_#{object_id}") + merge_label = Label.new( "merge_label_#{object_id}") + head.append condition.flatten( true_label: true_label , false_label: false_label) + head.append true_label + head.append if_true.flatten( merge_label: merge_label) + head.append false_label + head.append if_false.flatten( merge_label: merge_label) + head.append merge_label + head end end diff --git a/lib/mom/statement.rb b/lib/mom/statement.rb index a8a75443..421adcfe 100644 --- a/lib/mom/statement.rb +++ b/lib/mom/statement.rb @@ -1,7 +1,7 @@ module Mom class Statement # flattening will change the structure from a tree to a linked list (and use - # next_instruction to do so) + # nekst to do so) def flatten raise "not implemented for #{self}" end @@ -10,9 +10,14 @@ module Mom class Statements < Statement include Common::Statements - def flatten - @statements.each{ |s| s.flatten } + def flatten( options = {} ) + flat = @statements.pop.flatten + while( nekst = @statements.pop ) + flat.append nekst.flatten() + end + flat end + end end diff --git a/test/mom/test_if_simple.rb b/test/mom/test_if_simple.rb new file mode 100644 index 00000000..e2b70ca9 --- /dev/null +++ b/test/mom/test_if_simple.rb @@ -0,0 +1,27 @@ + +require_relative "helper" + +module Mom + class TestConditionIfMom < MiniTest::Test + include MomCompile + + def setup + Risc.machine.boot + @stats = compile_first_method_flat( "if(@a == 5) ; 5.mod4 ; else; 4.mod4 ; end") + @first = @stats.next + end + + def test_if_compiles + assert IfStatement != @stats.class , @stats + end + def test_check + assert_equal TruthCheck , @first.class + end + def test_condition_is_slot + assert_equal SlotDefinition , @first.condition.class , @first + end + def test_length + assert_equal 9 , @stats.length + end + end +end