diff --git a/lib/parfait/class.rb b/lib/parfait/class.rb index fa1890a4..5c2ba2da 100644 --- a/lib/parfait/class.rb +++ b/lib/parfait/class.rb @@ -44,6 +44,9 @@ module Parfait def inspect "Class(#{name})" end + def to_s + inspect + end def add_method_for(name , type , frame , body ) method = Parfait::VoolMethod.new(name , type , frame , body ) diff --git a/lib/parfait/meta_class.rb b/lib/parfait/meta_class.rb index a7105d78..e40e1ce1 100644 --- a/lib/parfait/meta_class.rb +++ b/lib/parfait/meta_class.rb @@ -29,7 +29,6 @@ module Parfait def initialize( clazz ) super() @clazz = clazz - @instance_methods = List.new @instance_type = Object.object_space.get_type_by_class_name(:Object) end @@ -41,6 +40,9 @@ module Parfait "MetaClass(#{@clazz.name})" end + def to_s + inspect + end def add_method_for(name , type , frame , body ) method = Parfait::VoolMethod.new(name , type , frame , body ) add_method( method ) diff --git a/lib/parfait/type.rb b/lib/parfait/type.rb index b7e73995..6ad902ad 100644 --- a/lib/parfait/type.rb +++ b/lib/parfait/type.rb @@ -127,7 +127,7 @@ module Parfait end method.set_next( @methods ) @methods = method - #puts "#{self.name} add #{method.name}" + # puts "ADD method to #{self.inspect}:#{method.name}" method end @@ -167,9 +167,9 @@ module Parfait def resolve_method( fname ) method = get_method(fname) return method if method + return nil if object_class.name == :Object sup = object_class.super_class return nil unless sup - return nil if object_class.name == :Object sup.instance_type.resolve_method(fname) end diff --git a/lib/vool/class_method_expression.rb b/lib/vool/class_method_expression.rb index d4a293b7..d6902846 100644 --- a/lib/vool/class_method_expression.rb +++ b/lib/vool/class_method_expression.rb @@ -11,6 +11,7 @@ module Vool raise "not meta" unless clazz.class == Parfait::MetaClass raise( "no class in #{self}") unless clazz method = clazz.add_method_for(name , make_arg_type , make_frame , body ) + #puts "CLass method Class:#{clazz}:#{name}" compiler = method.compiler_for(clazz.instance_type) each {|node| raise "Blocks not implemented" if node.is_a?(LambdaExpression)} compiler diff --git a/test/vool/class_send/test_class_send_inherited.rb b/test/vool/class_send/test_class_send_inherited.rb new file mode 100644 index 00000000..f78641ae --- /dev/null +++ b/test/vool/class_send/test_class_send_inherited.rb @@ -0,0 +1,46 @@ +require_relative "helper" + +module Vool + class TestClassSendInherited < MiniTest::Test + include Mom + include VoolCompile + + def class_main + <<-eos + class Object + def self.one_plus() + return 1 + 1 + end + end + class Space + def main(arg) + return Space.one_plus + end + end + eos + end + + def setup + source = "class Integer;def +(other);X.int_operator(:+);end;end;" + class_main + ret = RubyX::RubyXCompiler.new(RubyX.default_test_options).ruby_to_mom(source) + @ins = ret.compilers.find{|c|c.callable.name==:main}.mom_instructions.next + end + def test_array + check_array [MessageSetup,ArgumentTransfer,SimpleCall,SlotLoad, + ReturnJump,Label, ReturnSequence , Label] , @ins + end + def test_receiver + assert_equal Mom::ArgumentTransfer, @ins.next(1).class + assert_equal 0, @ins.next(1).arguments.length + assert_equal SlotDefinition, @ins.next(1).receiver.class + assert_equal Parfait::Class, @ins.next(1).receiver.known_object.class + assert_equal :Space, @ins.next(1).receiver.known_object.name + end + def test_call + assert_equal SimpleCall, @ins.next(2).class + assert_equal :one_plus, @ins.next(2).method.name + assert_equal Parfait::Type, @ins.next(2).method.self_type.class + assert_equal :Object, @ins.next(2).method.self_type.object_class.name + end + end +end