From b7701d0d5e94b7e6a3203be410530490fedcb65a Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Tue, 5 Dec 2017 21:46:37 +0200 Subject: [PATCH] start on dynamic call --- lib/vool/statements/send_statement.rb | 13 +++++---- .../to_mom/send/test_send_cached_simple.rb | 28 +++++++++++++++---- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/lib/vool/statements/send_statement.rb b/lib/vool/statements/send_statement.rb index 6b77e5f3..ca85400f 100644 --- a/lib/vool/statements/send_statement.rb +++ b/lib/vool/statements/send_statement.rb @@ -70,6 +70,7 @@ module Vool def flatten raise "flat" end + # check that current type is the cached type # if not, change and find method for the type (simple_call to resolve_method) # conceptually easy in ruby, but we have to compile that "easy" ruby @@ -77,14 +78,15 @@ module Vool # if cached_type != current_type # cached_type = current_type # cached_method = current_type.resolve_method(method.name) - if_true = [build_type_cache_update , build_method_cache_update] #@if_true.to_mom( in_method ) #find and assign - [Mom::IfStatement.new( build_condition , if_true )] + if_true = [build_type_cache_update , build_method_cache_update] + #@if_true.to_mom( in_method ) #find and assign + [Mom::IfStatement.new( build_condition , if_true )] end # this may look like a simple_call, but the difference is that we don't know # the method until run-time. Alas the setup is the same def call_cached_method(in_method) - message_setup(in_method) << Mom::DynamicCall.new( method_var_name) + message_setup(in_method) << Mom::DynamicCall.new(method_var_name) end private # cached type and method are stored in the frame as local variables. @@ -92,6 +94,7 @@ module Vool def create_tmps(in_method) in_method.create_tmp end + # we store the (one!) cached mathod in the frame, under the name that this # method returns def method_var_name @@ -107,10 +110,10 @@ module Vool Mom::NotSameCheck.new(cached_type , current_type) end def build_type_cache_update - + 1 end def build_method_cache_update - + 1 end end end diff --git a/test/vool/to_mom/send/test_send_cached_simple.rb b/test/vool/to_mom/send/test_send_cached_simple.rb index 8660d23b..1641930a 100644 --- a/test/vool/to_mom/send/test_send_cached_simple.rb +++ b/test/vool/to_mom/send/test_send_cached_simple.rb @@ -7,12 +7,15 @@ module Vool def setup Risc.machine.boot @stats = compile_first_method( "arg.mod4").first - @first = @stats.first + @first, @second , @third ,@fourth= @stats[0],@stats[1],@stats[2],@stats[3] end def test_compiles_not_array assert Array != @stats.class , @stats end + def test_four_instructions_are_returned + assert_equal 4 , @stats.length + end def test_if_first assert_equal Mom::IfStatement , @first.class , @first end @@ -23,14 +26,27 @@ module Vool assert @first.if_true , @first end def test_if_true_not_empty - assert @first.if_true.first , @first + assert @first.if_true.first , @first.to_rxf end - def test_slot_is_set - assert_equal 1 , @stats , @stats.to_rxf + def test_if_true_not_empty + assert @first.if_true.first , @first.to_rxf end - def est_two_instructions_are_returned - assert_equal 2 , @stats.length + def test_setup_second + assert_equal Mom::MessageSetup , @second.class , @second.to_rxf end + + def test_transfer_third + assert_equal Mom::ArgumentTransfer , @third.class , @third.to_rxf + end + + def test_call_third + assert_equal Mom::DynamicCall , @fourth.class , @fourth.to_rxf + end + + def test_call_third + assert @fourth.method_var_name.start_with?("cached_") , @fourth.to_rxf + end + def est_receiver_move_class assert_equal Mom::SlotConstant, @first.class end