Fix meta_class, sis class instance variables and class methods
after some serious recursive thinking it now actually makes sense. The key was to change the actual type of the class that the meta_class manages For objects it's (still) ok just to change the instance_type, but since the class object exists and has type, when adding instance variables, that actual type has to change
This commit is contained in:
@ -12,7 +12,7 @@ module Vool
|
||||
return @inst
|
||||
end
|
||||
def main(arg)
|
||||
return Space.one_plus
|
||||
return Space.some_inst
|
||||
end
|
||||
end
|
||||
eos
|
||||
@ -20,16 +20,34 @@ module Vool
|
||||
|
||||
def setup
|
||||
ret = RubyX::RubyXCompiler.new(RubyX.default_test_options).ruby_to_mom(class_main)
|
||||
@ins = ret.compilers.find{|c|c.callable.name==:some_inst}.mom_instructions.next
|
||||
@compiler = ret.compilers.find{|c|c.callable.name==:some_inst}
|
||||
@main = ret.compilers.find{|c|c.callable.name==:main}
|
||||
@ins = @compiler.mom_instructions.next
|
||||
end
|
||||
def test_class_inst
|
||||
space_class = Parfait.object_space.get_class
|
||||
assert_equal :Space , space_class.name
|
||||
names = space_class.meta_class.instance_type.names
|
||||
assert names.index_of(:inst) , names
|
||||
space_class = Parfait.object_space.get_class
|
||||
assert_equal :Space , space_class.name
|
||||
names = space_class.meta_class.instance_type.names
|
||||
assert names.index_of(:inst) , names
|
||||
end
|
||||
def test_compiler
|
||||
assert_equal Mom::MethodCompiler, @compiler.class
|
||||
assert_equal Parfait::Type, @compiler.callable.self_type.class
|
||||
assert_equal 6, @compiler.callable.self_type.names.index_of(:inst) , @compiler.callable.self_type.names
|
||||
end
|
||||
def test_array
|
||||
check_array [SlotLoad, ReturnJump, Label, ReturnSequence, Label] , @ins
|
||||
check_array [SlotLoad, ReturnJump, Label, ReturnSequence, Label] , @ins
|
||||
end
|
||||
def test_main_array
|
||||
check_array [MessageSetup, ArgumentTransfer, SimpleCall, SlotLoad, ReturnJump ,
|
||||
Label, ReturnSequence, Label] , @main.mom_instructions.next
|
||||
end
|
||||
def test_main_args
|
||||
args = @main.mom_instructions.next(2)
|
||||
assert_equal Parfait::Class , args.receiver.known_object.class
|
||||
assert_equal :Space , args.receiver.known_object.name
|
||||
assert_equal :some_inst , args.receiver.known_object.type.method_names.first
|
||||
assert_equal :inst , args.receiver.known_object.type.names.last
|
||||
end
|
||||
def test_load_inst
|
||||
assert_equal SlotLoad, @ins.class
|
||||
|
@ -40,7 +40,7 @@ module Vool
|
||||
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
|
||||
assert_equal :Class, @ins.next(2).method.self_type.object_class.name
|
||||
end
|
||||
end
|
||||
end
|
||||
|
Reference in New Issue
Block a user