Fix for call changes and helper changes

This commit is contained in:
Torsten Ruger 2017-01-04 21:38:38 +02:00
parent 0084406cfd
commit 83d943afa5
6 changed files with 111 additions and 99 deletions

View File

@ -9,17 +9,18 @@ module Register
@input = s(:statements, s(:assignment, s(:name, :r), s(:operator_value, :+, s(:int, 10), s(:int, 1)))) @input = s(:statements, s(:assignment, s(:name, :r), s(:operator_value, :+, s(:int, 10), s(:int, 1))))
@expect = [Label, LoadConstant, LoadConstant, OperatorInstruction, SlotToReg, RegToSlot, Label , @expect = [Label, LoadConstant, LoadConstant, OperatorInstruction, SlotToReg, RegToSlot ,
FunctionReturn] LoadConstant, SlotToReg, RegToSlot, Label, FunctionReturn]
check assert_nil msg = check_nil , msg
end end
def test_assign_local def test_assign_local
Parfait.object_space.get_main.add_local(:r , :Integer) Parfait.object_space.get_main.add_local(:r , :Integer)
@input =s(:statements, s(:assignment, s(:name, :r), s(:int, 5))) @input =s(:statements, s(:assignment, s(:name, :r), s(:int, 5)))
@expect = [Label, LoadConstant, SlotToReg, RegToSlot, Label, FunctionReturn] @expect = [Label, LoadConstant, SlotToReg, RegToSlot, LoadConstant, SlotToReg ,
check RegToSlot, Label, FunctionReturn]
assert_nil msg = check_nil , msg
end end
def test_assign_local_assign def test_assign_local_assign
@ -27,26 +28,27 @@ module Register
@input = s(:statements, s(:assignment, s(:name, :r), s(:int, 5))) @input = s(:statements, s(:assignment, s(:name, :r), s(:int, 5)))
@expect = [Label, LoadConstant, SlotToReg, RegToSlot, Label, FunctionReturn] @expect = [Label, LoadConstant, SlotToReg, RegToSlot, LoadConstant, SlotToReg ,
check RegToSlot, Label, FunctionReturn]
assert_nil msg = check_nil , msg
end end
def test_assign_call def test_assign_call
Parfait.object_space.get_main.add_local(:r , :Integer) Parfait.object_space.get_main.add_local(:r , :Integer)
@input = s(:statements, s(:assignment, s(:name, :r), s(:call, s(:name, :main), s(:arguments)))) @input = s(:statements, s(:assignment, s(:name, :r), s(:call, s(:name, :main), s(:arguments))))
@expect = [Label, SlotToReg, SlotToReg, RegToSlot, LoadConstant, RegToSlot, LoadConstant , @expect = [Label, SlotToReg, SlotToReg, RegToSlot, LoadConstant, RegToSlot ,
SlotToReg, SlotToReg, RegToSlot, LoadConstant, RegToSlot, RegisterTransfer, FunctionCall , LoadConstant, SlotToReg, RegToSlot, LoadConstant, RegToSlot, RegisterTransfer ,
Label, RegisterTransfer, SlotToReg, SlotToReg, SlotToReg, RegToSlot, Label , FunctionCall, Label, RegisterTransfer, SlotToReg, SlotToReg, SlotToReg ,
FunctionReturn] RegToSlot, LoadConstant, SlotToReg, RegToSlot, Label, FunctionReturn]
check assert_nil msg = check_nil , msg
end end
def test_named_list_get def test_named_list_get
Parfait.object_space.get_main.add_local(:r , :Integer) Parfait.object_space.get_main.add_local(:r , :Integer)
@input = s(:statements, s(:assignment, s(:name, :r), s(:int, 5)), s(:return, s(:name, :r))) @input = s(:statements, s(:assignment, s(:name, :r), s(:int, 5)), s(:return, s(:name, :r)))
@expect = [Label, LoadConstant, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot , @expect = [Label, LoadConstant, SlotToReg, RegToSlot, SlotToReg, SlotToReg ,
Label, FunctionReturn] RegToSlot, LoadConstant, SlotToReg, RegToSlot, Label, FunctionReturn]
was = check was = check_return
get = was.next(5) get = was.next(5)
assert_equal SlotToReg , get.class assert_equal SlotToReg , get.class
assert_equal 1 + 1, get.index , "Get to named_list index must be offset, not #{get.index}" assert_equal 1 + 1, get.index , "Get to named_list index must be offset, not #{get.index}"
@ -55,8 +57,9 @@ module Register
def test_assign_local_int def test_assign_local_int
Parfait.object_space.get_main.add_local(:r , :Integer) Parfait.object_space.get_main.add_local(:r , :Integer)
@input = s(:statements, s(:assignment, s(:name, :r), s(:int, 5)) ) @input = s(:statements, s(:assignment, s(:name, :r), s(:int, 5)) )
@expect = [Label, LoadConstant, SlotToReg, RegToSlot, Label, FunctionReturn] @expect = [Label, LoadConstant, SlotToReg, RegToSlot, LoadConstant, SlotToReg ,
was = check RegToSlot, Label, FunctionReturn]
was = check_return
set = was.next(3) set = was.next(3)
assert_equal RegToSlot , set.class assert_equal RegToSlot , set.class
assert_equal 1 + 1, set.index , "Set to named_list index must be offset, not #{set.index}" assert_equal 1 + 1, set.index , "Set to named_list index must be offset, not #{set.index}"
@ -72,8 +75,9 @@ module Register
def test_assign_arg def test_assign_arg
Parfait.object_space.get_main.add_argument(:blar , :Integer) Parfait.object_space.get_main.add_argument(:blar , :Integer)
@input = s(:statements, s(:assignment, s(:name, :blar), s(:int, 5))) @input = s(:statements, s(:assignment, s(:name, :blar), s(:int, 5)))
@expect = [Label, LoadConstant, SlotToReg, RegToSlot, Label, FunctionReturn] @expect = [Label, LoadConstant, SlotToReg, RegToSlot, LoadConstant, SlotToReg ,
was = check RegToSlot, Label, FunctionReturn]
was = check_return
set = was.next(3) set = was.next(3)
assert_equal RegToSlot , set.class assert_equal RegToSlot , set.class
assert_equal 1 + 1, set.index , "Set to args index must be offset, not #{set.index}" assert_equal 1 + 1, set.index , "Set to args index must be offset, not #{set.index}"
@ -90,8 +94,9 @@ module Register
# have to define bar externally, just because redefining main. Otherwise that would be automatic # have to define bar externally, just because redefining main. Otherwise that would be automatic
Parfait.object_space.get_main.add_argument(:balr , :Integer) Parfait.object_space.get_main.add_argument(:balr , :Integer)
@input = s(:statements, s(:return, s(:name, :balr))) @input = s(:statements, s(:return, s(:name, :balr)))
@expect = [Label, SlotToReg, SlotToReg, RegToSlot, Label, FunctionReturn] @expect = [Label, SlotToReg, SlotToReg, RegToSlot, LoadConstant, SlotToReg ,
was = check RegToSlot, Label, FunctionReturn]
was = check_return
get = was.next(2) get = was.next(2)
assert_equal SlotToReg , get.class assert_equal SlotToReg , get.class
assert_equal 1 + 1, get.index , "Get to args index must be offset, not #{get.index}" assert_equal 1 + 1, get.index , "Get to args index must be offset, not #{get.index}"

View File

@ -9,9 +9,10 @@ module Register
clean_compile :Integer, :puti, {}, s(:statements, s(:return, s(:int, 1))) clean_compile :Integer, :puti, {}, s(:statements, s(:return, s(:int, 1)))
@input = s(:call, s(:name, :puti), s(:arguments), s(:receiver, s(:int, 42))) @input = s(:call, s(:name, :puti), s(:arguments), s(:receiver, s(:int, 42)))
@expect = [Label, SlotToReg, LoadConstant, RegToSlot, LoadConstant, RegToSlot, LoadConstant , @expect = [Label, SlotToReg, LoadConstant, RegToSlot, LoadConstant, RegToSlot, LoadConstant ,
SlotToReg, SlotToReg, RegToSlot, LoadConstant, RegToSlot, RegisterTransfer, FunctionCall , SlotToReg, RegToSlot, LoadConstant, RegToSlot, RegisterTransfer, FunctionCall, Label ,
Label, RegisterTransfer, SlotToReg, SlotToReg, Label, FunctionReturn] RegisterTransfer, SlotToReg, SlotToReg, LoadConstant, SlotToReg, RegToSlot, Label ,
check FunctionReturn]
assert_nil msg = check_nil , msg
end end
@ -19,22 +20,23 @@ module Register
clean_compile :Word, :putstr,{}, s(:statements, s(:return, s(:int, 1))) clean_compile :Word, :putstr,{}, s(:statements, s(:return, s(:int, 1)))
@input =s(:call, s(:name, :putstr), s(:arguments), s(:receiver, s(:string, "Hello"))) @input =s(:call, s(:name, :putstr), s(:arguments), s(:receiver, s(:string, "Hello")))
@expect = [Label, SlotToReg, LoadConstant, RegToSlot, LoadConstant, RegToSlot, LoadConstant , @expect = [Label, SlotToReg, LoadConstant, RegToSlot, LoadConstant, RegToSlot, LoadConstant ,
SlotToReg, SlotToReg, RegToSlot, LoadConstant, RegToSlot, RegisterTransfer, FunctionCall , SlotToReg, RegToSlot, LoadConstant, RegToSlot, RegisterTransfer, FunctionCall, Label ,
Label, RegisterTransfer, SlotToReg, SlotToReg, Label, FunctionReturn] RegisterTransfer, SlotToReg, SlotToReg, LoadConstant, SlotToReg, RegToSlot, Label ,
check FunctionReturn]
assert_nil msg = check_nil , msg
end end
def _test_call_local_int def test_call_local_int
Parfait.object_space.get_main.add_local(:testi , :Integer) Parfait.object_space.get_main.add_local(:testi , :Integer)
clean_compile :Integer, :putint, {}, s(:statements, s(:return, s(:int, 1))) clean_compile :Integer, :putint, {}, s(:statements, s(:return, s(:int, 1)))
@input = s(:statements, s(:assignment, s(:name, :testi), s(:int, 20)), s(:call, s(:name, :putint), s(:arguments), s(:receiver, s(:name, :testi)))) @input = s(:statements, s(:assignment, s(:name, :testi), s(:int, 20)), s(:call, s(:name, :putint), s(:arguments), s(:receiver, s(:name, :testi))))
@expect = [Label, LoadConstant, SlotToReg, RegToSlot, SlotToReg, SlotToReg, SlotToReg , @expect = [Label, LoadConstant, SlotToReg, RegToSlot, SlotToReg, SlotToReg, SlotToReg ,
RegToSlot, LoadConstant, RegToSlot, LoadConstant, RegToSlot, LoadConstant, RegToSlot , RegToSlot, LoadConstant, RegToSlot, LoadConstant, SlotToReg, RegToSlot, LoadConstant ,
RegisterTransfer, FunctionCall, Label, RegisterTransfer, SlotToReg, SlotToReg, Label , RegToSlot, RegisterTransfer, FunctionCall, Label, RegisterTransfer, SlotToReg, SlotToReg ,
FunctionReturn] LoadConstant, SlotToReg, RegToSlot, Label, FunctionReturn]
check assert_nil msg = check_nil , msg
end end
def test_call_local_class def test_call_local_class
@ -42,30 +44,25 @@ module Register
clean_compile :List, :add, {}, s(:statements, s(:return, s(:int, 1))) clean_compile :List, :add, {}, s(:statements, s(:return, s(:int, 1)))
@input =s(:statements, s(:call, s(:name, :add), s(:arguments), s(:receiver, s(:name, :test_l)))) @input =s(:statements, s(:call, s(:name, :add), s(:arguments), s(:receiver, s(:name, :test_l))))
@expect = [Label, SlotToReg, SlotToReg, SlotToReg, RegToSlot, LoadConstant, RegToSlot , @expect = [Label, SlotToReg, SlotToReg, SlotToReg, RegToSlot, LoadConstant, RegToSlot ,
LoadConstant, SlotToReg, SlotToReg, RegToSlot, LoadConstant, RegToSlot, RegisterTransfer , LoadConstant, SlotToReg, RegToSlot, LoadConstant, RegToSlot, RegisterTransfer, FunctionCall ,
FunctionCall, Label, RegisterTransfer, SlotToReg, SlotToReg, Label, FunctionReturn] Label, RegisterTransfer, SlotToReg, SlotToReg, LoadConstant, SlotToReg, RegToSlot ,
check Label, FunctionReturn]
assert_nil msg = check_nil , msg
end end
def _test_call_puts def test_call_puts
@input = <<HERE clean_compile :Space, :putstr, {str: :Word}, s(:statements, s(:return, s(:name, :str)))
class Space @input =s(:call, s(:name, :putstr), s(:arguments, s(:string, "Hello") ) )
int puts(Word str) @expect = [Label, SlotToReg, SlotToReg, RegToSlot, LoadConstant, RegToSlot ,
return str LoadConstant, SlotToReg, RegToSlot, LoadConstant, SlotToReg, RegToSlot ,
end LoadConstant, RegToSlot, RegisterTransfer, FunctionCall, Label, RegisterTransfer ,
int main() SlotToReg, SlotToReg, LoadConstant, SlotToReg, RegToSlot, Label ,
puts("Hello") FunctionReturn]
end was = check_return
end set = was.next(8)
HERE
@expect = [Label, SlotToReg, SlotToReg, RegToSlot, LoadConstant, RegToSlot, LoadConstant ,
RegToSlot, LoadConstant, RegToSlot, LoadConstant, RegToSlot, RegisterTransfer, FunctionCall ,
Label, RegisterTransfer, SlotToReg, SlotToReg, Label, FunctionReturn]
was = check
set = was.next(7)
assert_equal RegToSlot , set.class assert_equal RegToSlot , set.class
assert_equal 9, set.index , "Set to message must be offset, not #{set.index}" assert_equal 1, set.index , "Set to message must be offset, not #{set.index}"
end end
end end
end end

View File

@ -9,8 +9,9 @@ module Register
Parfait.object_space.get_main.add_local( :m , :Message) Parfait.object_space.get_main.add_local( :m , :Message)
@input = s(:statements, s(:return, s(:field_access, @input = s(:statements, s(:return, s(:field_access,
s(:receiver, s(:name, :m)), s(:field, s(:name, :name))))) s(:receiver, s(:name, :m)), s(:field, s(:name, :name)))))
@expect = [Label, SlotToReg, SlotToReg, SlotToReg, RegToSlot, Label, FunctionReturn] @expect = [Label, SlotToReg, SlotToReg, SlotToReg, RegToSlot, LoadConstant ,
check SlotToReg, RegToSlot, Label, FunctionReturn]
assert_nil msg = check_nil , msg
end end
def test_field_arg def test_field_arg
@ -20,20 +21,22 @@ module Register
s(:receiver, s(:name, :main)), s(:field, s(:name, :name))))) s(:receiver, s(:name, :main)), s(:field, s(:name, :name)))))
@input =s(:statements, s(:return, s(:call, s(:name, :get_name), s(:arguments, s(:name, :m))))) @input =s(:statements, s(:return, s(:call, s(:name, :get_name), s(:arguments, s(:name, :m)))))
@expect = [ Label, SlotToReg, SlotToReg, RegToSlot, LoadConstant, RegToSlot, LoadConstant , @expect = [Label, SlotToReg, SlotToReg, RegToSlot, LoadConstant, RegToSlot ,
SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, SlotToReg, RegToSlot , LoadConstant, SlotToReg, RegToSlot, SlotToReg, SlotToReg, SlotToReg ,
LoadConstant, RegToSlot, RegisterTransfer, FunctionCall, Label, RegisterTransfer, SlotToReg , RegToSlot, LoadConstant, RegToSlot, RegisterTransfer, FunctionCall, Label ,
SlotToReg, RegToSlot, Label, FunctionReturn] RegisterTransfer, SlotToReg, SlotToReg, RegToSlot, LoadConstant, SlotToReg ,
check RegToSlot, Label, FunctionReturn]
assert_nil msg = check_nil , msg
end end
def test_message_field def test_message_field
Parfait.object_space.get_main.add_local(:name , :Word) Parfait.object_space.get_main.add_local(:name , :Word)
@input = s(:statements, s(:assignment, s(:name, :name), s(:field_access, s(:receiver, s(:name, :message)), s(:field, s(:name, :name)))), s(:return, s(:name, :name))) @input = s(:statements, s(:assignment, s(:name, :name), s(:field_access, s(:receiver, s(:name, :message)), s(:field, s(:name, :name)))), s(:return, s(:name, :name)))
@expect = [Label, RegisterTransfer, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg , @expect = [Label, RegisterTransfer, SlotToReg, SlotToReg, RegToSlot, SlotToReg ,
RegToSlot, Label, FunctionReturn] SlotToReg, RegToSlot, LoadConstant, SlotToReg, RegToSlot, Label ,
check FunctionReturn]
assert_nil msg = check_nil , msg
end end
end end
end end

View File

@ -7,29 +7,30 @@ module Register
def test_if_basicr def test_if_basicr
@input = s(:statements, s(:if_statement, :plus, s(:condition, s(:operator_value, :-, s(:int, 10), s(:int, 12))), s(:true_statements, s(:return, s(:int, 3))), s(:false_statements, s(:return, s(:int, 4))))) @input = s(:statements, s(:if_statement, :plus, s(:condition, s(:operator_value, :-, s(:int, 10), s(:int, 12))), s(:true_statements, s(:return, s(:int, 3))), s(:false_statements, s(:return, s(:int, 4)))))
@expect = [Label, LoadConstant,LoadConstant, OperatorInstruction,IsPlus , @expect = [Label, LoadConstant, LoadConstant, OperatorInstruction, IsPlus, LoadConstant ,
LoadConstant,RegToSlot,Branch , Label , LoadConstant ,RegToSlot, RegToSlot, Branch, Label, LoadConstant, RegToSlot, Label ,
Label,Label,FunctionReturn] LoadConstant, SlotToReg, RegToSlot, Label, FunctionReturn]
check assert_nil msg = check_nil , msg
end end
def test_if_small_minus def test_if_small_minus
@input = s(:statements, s(:if_statement, :minus, s(:condition, s(:operator_value, :-, s(:int, 10), s(:int, 12))), s(:true_statements, s(:return, s(:int, 3))), s(:false_statements, nil))) @input = s(:statements, s(:if_statement, :minus, s(:condition, s(:operator_value, :-, s(:int, 10), s(:int, 12))), s(:true_statements, s(:return, s(:int, 3))), s(:false_statements, nil)))
@expect = [Label, LoadConstant, LoadConstant, OperatorInstruction, IsMinus, Branch, Label , @expect = [Label, LoadConstant, LoadConstant, OperatorInstruction, IsMinus, Branch ,
LoadConstant, RegToSlot, Label, Label, FunctionReturn] Label, LoadConstant, RegToSlot, Label, LoadConstant, SlotToReg ,
check RegToSlot, Label, FunctionReturn]
assert_nil msg = check_nil , msg
end end
def test_if_small_zero def test_if_small_zero
@input = s(:statements, s(:if_statement, :zero, s(:condition, s(:operator_value, :-, s(:int, 10), s(:int, 12))), s(:true_statements, s(:return, s(:int, 3))), s(:false_statements, nil))) @input = s(:statements, s(:if_statement, :zero, s(:condition, s(:operator_value, :-, s(:int, 10), s(:int, 12))), s(:true_statements, s(:return, s(:int, 3))), s(:false_statements, nil)))
@expect = [Label, LoadConstant,LoadConstant,OperatorInstruction,IsZero , @expect = [Label, LoadConstant, LoadConstant, OperatorInstruction, IsZero, Branch ,
Branch , Label , LoadConstant ,RegToSlot, Label, LoadConstant, RegToSlot, Label, LoadConstant, SlotToReg ,
Label,Label, FunctionReturn] RegToSlot, Label, FunctionReturn]
check assert_nil msg = check_nil , msg
end end
end end
end end

View File

@ -6,38 +6,41 @@ module Register
def test_return_int def test_return_int
@input = s(:statements, s(:return, s(:int, 5))) @input = s(:statements, s(:return, s(:int, 5)))
@expect = [Label, LoadConstant ,RegToSlot,Label,FunctionReturn] @expect = [Label, LoadConstant, RegToSlot, LoadConstant, SlotToReg, RegToSlot ,
check Label, FunctionReturn]
assert_nil msg = check_nil , msg
end end
def test_return_local def test_return_local
Parfait.object_space.get_main.add_local(:runner , :Integer) Parfait.object_space.get_main.add_local(:runner , :Integer)
@input = s(:statements, s(:return, s(:name, :runner))) @input = s(:statements, s(:return, s(:name, :runner)))
@expect = [Label, SlotToReg,SlotToReg ,RegToSlot,Label,FunctionReturn] @expect = [Label, SlotToReg, SlotToReg, RegToSlot, LoadConstant, SlotToReg ,
check RegToSlot, Label, FunctionReturn]
assert_nil msg = check_nil , msg
end end
def test_return_local_assign def test_return_local_assign
Parfait.object_space.get_main.add_local(:runner , :Integer) Parfait.object_space.get_main.add_local(:runner , :Integer)
@input = s(:statements, s(:assignment, s(:name, :runner), s(:int, 5)), s(:return, s(:name, :runner))) @input = s(:statements, s(:assignment, s(:name, :runner), s(:int, 5)), s(:return, s(:name, :runner)))
@expect = [Label, LoadConstant,SlotToReg,RegToSlot,SlotToReg,SlotToReg ,RegToSlot, @expect = [Label, LoadConstant, SlotToReg, RegToSlot, SlotToReg, SlotToReg ,
Label,FunctionReturn] RegToSlot, LoadConstant, SlotToReg, RegToSlot, Label, FunctionReturn]
check assert_nil msg = check_nil , msg
end end
def test_return_call def test_return_call
@input =s(:statements, s(:return, s(:call, s(:name, :main), s(:arguments)))) @input =s(:statements, s(:return, s(:call, s(:name, :main), s(:arguments))))
@expect = [Label, SlotToReg, SlotToReg, RegToSlot, LoadConstant, RegToSlot, LoadConstant , @expect = [Label, SlotToReg, SlotToReg, RegToSlot, LoadConstant, RegToSlot ,
SlotToReg, SlotToReg, RegToSlot, LoadConstant, RegToSlot, RegisterTransfer, FunctionCall , LoadConstant, SlotToReg, RegToSlot, LoadConstant, RegToSlot, RegisterTransfer ,
Label, RegisterTransfer, SlotToReg, SlotToReg, RegToSlot, Label, FunctionReturn] FunctionCall, Label, RegisterTransfer, SlotToReg, SlotToReg, RegToSlot ,
check LoadConstant, SlotToReg, RegToSlot, Label, FunctionReturn]
assert_nil msg = check_nil , msg
end end
def pest_return_space_length # need to add runtime first def pest_return_space_length # need to add runtime first
Parfait.object_space.get_main.add_local(:l , :Type) Parfait.object_space.get_main.add_local(:l , :Type)
@input = s(:statements, s(:assignment, s(:name, :l), s(:call, s(:name, :get_type), s(:arguments), s(:receiver, s(:name, :space)))), s(:return, s(:field_access, s(:receiver, s(:name, :self)), s(:field, s(:name, :runner))))) @input = s(:statements, s(:assignment, s(:name, :l), s(:call, s(:name, :get_type), s(:arguments), s(:receiver, s(:name, :space)))), s(:return, s(:field_access, s(:receiver, s(:name, :self)), s(:field, s(:name, :runner)))))
@expect = [Label, SlotToReg,SlotToReg ,RegToSlot,Label,FunctionReturn] @expect = [Label, SlotToReg,SlotToReg ,RegToSlot,Label,FunctionReturn]
check assert_nil msg = check_nil , msg
end end
end end

View File

@ -8,9 +8,10 @@ module Register
def test_while_mini def test_while_mini
@input = s(:statements, s(:while_statement, :plus, s(:conditional, s(:int, 1)), s(:statements, s(:return, s(:int, 3))))) @input = s(:statements, s(:while_statement, :plus, s(:conditional, s(:int, 1)), s(:statements, s(:return, s(:int, 3)))))
@expect = [Label, Branch, Label, LoadConstant, RegToSlot, Label, LoadConstant , @expect = [Label, Branch, Label, LoadConstant, RegToSlot, Label ,
IsPlus, Label, FunctionReturn] LoadConstant, IsPlus, LoadConstant, SlotToReg, RegToSlot, Label ,
check FunctionReturn]
assert_nil msg = check_nil , msg
end end
def test_while_assign def test_while_assign
@ -18,10 +19,11 @@ module Register
@input = s(:statements, s(:assignment, s(:name, :n), s(:int, 5)), s(:while_statement, :plus, s(:conditional, s(:name, :n)), s(:statements, s(:assignment, s(:name, :n), s(:operator_value, :-, s(:name, :n), s(:int, 1))))), s(:return, s(:name, :n))) @input = s(:statements, s(:assignment, s(:name, :n), s(:int, 5)), s(:while_statement, :plus, s(:conditional, s(:name, :n)), s(:statements, s(:assignment, s(:name, :n), s(:operator_value, :-, s(:name, :n), s(:int, 1))))), s(:return, s(:name, :n)))
@expect = [Label, LoadConstant, SlotToReg, RegToSlot, Branch, Label, SlotToReg , @expect = [Label, LoadConstant, SlotToReg, RegToSlot, Branch, Label ,
SlotToReg, LoadConstant, OperatorInstruction, SlotToReg, RegToSlot, Label, SlotToReg , SlotToReg, SlotToReg, LoadConstant, OperatorInstruction, SlotToReg, RegToSlot ,
SlotToReg, IsPlus, SlotToReg, SlotToReg, RegToSlot, Label, FunctionReturn] Label, SlotToReg, SlotToReg, IsPlus, SlotToReg, SlotToReg ,
check RegToSlot, LoadConstant, SlotToReg, RegToSlot, Label, FunctionReturn]
assert_nil msg = check_nil , msg
end end
@ -30,11 +32,12 @@ module Register
@input = s(:statements, s(:assignment, s(:name, :n), s(:int, 10)), s(:while_statement, :plus, s(:conditional, s(:operator_value, :-, s(:name, :n), s(:int, 5))), s(:statements, s(:assignment, s(:name, :n), s(:operator_value, :+, s(:name, :n), s(:int, 1))), s(:return, s(:name, :n))))) @input = s(:statements, s(:assignment, s(:name, :n), s(:int, 10)), s(:while_statement, :plus, s(:conditional, s(:operator_value, :-, s(:name, :n), s(:int, 5))), s(:statements, s(:assignment, s(:name, :n), s(:operator_value, :+, s(:name, :n), s(:int, 1))), s(:return, s(:name, :n)))))
@expect = [Label, LoadConstant, SlotToReg, RegToSlot, Branch, Label, SlotToReg , @expect = [Label, LoadConstant, SlotToReg, RegToSlot, Branch, Label ,
SlotToReg, LoadConstant, OperatorInstruction, SlotToReg, RegToSlot, SlotToReg, SlotToReg , SlotToReg, SlotToReg, LoadConstant, OperatorInstruction, SlotToReg, RegToSlot ,
RegToSlot, Label, SlotToReg, SlotToReg, LoadConstant, OperatorInstruction, IsPlus , SlotToReg, SlotToReg, RegToSlot, Label, SlotToReg, SlotToReg ,
Label, FunctionReturn] LoadConstant, OperatorInstruction, IsPlus, LoadConstant, SlotToReg, RegToSlot ,
check Label, FunctionReturn]
assert_nil msg = check_nil , msg
end end
end end
end end