diff --git a/lib/soml/compiler/call_site.rb b/lib/soml/compiler/call_site.rb index 1b7337d8..3f78c5f6 100644 --- a/lib/soml/compiler/call_site.rb +++ b/lib/soml/compiler/call_site.rb @@ -3,8 +3,8 @@ module Soml def on_call statement #puts statement - name , arguments , receiver = *statement - name = name.to_a.first + name_s , arguments , receiver = *statement + name = name_s.to_a.first raise "not inside method " unless @method reset_regs #move the new message (that we need to populate to make a call) to std register @@ -24,26 +24,8 @@ module Soml end # move our receiver there add_code Register.set_slot( statement , me , :new_message , :receiver) - # load method name and set to new message (for exceptions/debug) - name_tmp = use_reg(:Word) - add_code Register::LoadConstant.new(statement, name , name_tmp) - add_code Register.set_slot( statement , name_tmp , :new_message , :name) - # next arguments. first length then args - len_tmp = use_reg(:Integer , arguments.to_a.length ) - add_code Register::LoadConstant.new(statement, arguments.to_a.length , len_tmp) - add_code Register.set_slot( statement , len_tmp , :new_message , :indexed_length) - - # reset tmp regs for each and load result into new_message - arguments.to_a.each_with_index do |arg , i| - reset_regs - # processing should return the register with the value - val = process( arg) - raise "Not register #{val}" unless val.is_a?(Register::RegisterValue) - # which we load int the new_message at the argument's index (the one comes from c index) - set = Register.set_slot( arg , val , :new_message , Parfait::Message.get_indexed(i+1)) - add_code set - end - + set_message_details(name_s , arguments) + set_arguments(arguments) #puts "clazz #{clazz.name}" raise "No such class #{me.type}" unless clazz method = clazz.get_instance_method(name) @@ -56,5 +38,30 @@ module Soml add_code Register.get_slot(statement, :message , :return_value , ret ) ret end + private + def set_message_details name_s , arguments + name = name_s.to_a.first + # load method name and set to new message (for exceptions/debug) + name_tmp = use_reg(:Word) + add_code Register::LoadConstant.new(name_s, name , name_tmp) + add_code Register.set_slot( name_s , name_tmp , :new_message , :name) + # next arguments. first length then args + len_tmp = use_reg(:Integer , arguments.to_a.length ) + add_code Register::LoadConstant.new(arguments, arguments.to_a.length , len_tmp) + add_code Register.set_slot( arguments , len_tmp , :new_message , :indexed_length) + + end + def set_arguments arguments + # reset tmp regs for each and load result into new_message + arguments.to_a.each_with_index do |arg , i| + reset_regs + # processing should return the register with the value + val = process( arg) + raise "Not register #{val}" unless val.is_a?(Register::RegisterValue) + # which we load int the new_message at the argument's index (the one comes from c index) + set = Register.set_slot( arg , val , :new_message , Parfait::Message.get_indexed(i+1)) + add_code set + end + end end end