simple send test works again

This commit is contained in:
Torsten Ruger 2018-03-15 21:54:03 +05:30
parent 9b4fcf0e0f
commit 1def69c783
6 changed files with 33 additions and 27 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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