diff --git a/lib/parfait/message.rb b/lib/parfait/message.rb index e7b9a331..b307dac3 100644 --- a/lib/parfait/message.rb +++ b/lib/parfait/message.rb @@ -2,17 +2,34 @@ # instead it is parsed by salama to define part of the program that runs class Message + + def get_type_for name + index = @layout.get_index name + get_at index + end + def send - # Find the method for the given object (receiver) according to ruby dispatch rules: - # - see if the receiver object has a (singleton) method by the name - # - get receivers class and look for instance methods of the name - # - go up inheritance tree - # - start over with method_missing instead - # -> guaranteed to end at object.method_missing - method = @receiver.get_singeton_method @method_name - unless method - cl = @receiver.layout.object_class - method = cl.get_instance_or_super_method @method_name + typ = get_type_for( :receiver ) + # TODO: this will obviously be recoded as case, once that is done :-) + # depending on value type get method + if( typ == Integer ) + method = Integer.get_method @method_name + else + if( typ != ObjectReference ) + raise "unimplemented case" + else + method = @receiver.get_singeton_method @method_name + # Find the method for the given object (receiver) according to ruby dispatch rules: + # - see if the receiver object has a (singleton) method by the name + # - get receivers class and look for instance methods of the name + # - go up inheritance tree + # - start over with method_missing instead + # -> guaranteed to end at object.method_missing + unless method + cl = @receiver.layout.object_class + method = cl.get_instance_or_super_method @method_name + end + end end unless method message = Message.new( @receiver , :method_missing , [@method_name] + @args) diff --git a/lib/parfait/object.rb b/lib/parfait/object.rb index 879295ed..efdceec8 100644 --- a/lib/parfait/object.rb +++ b/lib/parfait/object.rb @@ -3,4 +3,7 @@ class Object + def get_class + @layout.get_class + end end