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:
@ -36,15 +36,18 @@ module Parfait
|
||||
assert_raises{ @try.add_instance_method(nil)}
|
||||
end
|
||||
def test_add_instance_variable_changes_type
|
||||
before = @space.get_class.instance_type
|
||||
@space.get_class.add_instance_variable(:counter , :Integer)
|
||||
assert before != @space.get_class.instance_type
|
||||
before = @try.instance_type
|
||||
@try.add_instance_variable(:counter , :Integer)
|
||||
assert before != @try.instance_type
|
||||
end
|
||||
def test_add_instance_variable_changes_type_hash
|
||||
before = @space.get_class.instance_type.hash
|
||||
@space.get_class.add_instance_variable(:counter , :Integer)
|
||||
assert before != @space.get_class.instance_type.hash
|
||||
before = @try.instance_type.hash
|
||||
@try.add_instance_variable(:counter , :Integer)
|
||||
assert before != @try.instance_type.hash
|
||||
end
|
||||
def test_add_instance_variable_changes_class_type
|
||||
@try.add_instance_variable(:counter , :Integer)
|
||||
assert_equal @try.clazz.type , @try.instance_type
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
@ -1,7 +1,7 @@
|
||||
require_relative "../helper"
|
||||
|
||||
module Risc
|
||||
class InterpreterSetters < MiniTest::Test
|
||||
class InterpreterGetters < MiniTest::Test
|
||||
include Ticker
|
||||
|
||||
def setup
|
||||
@ -19,7 +19,7 @@ module Risc
|
||||
MAIN
|
||||
super
|
||||
end
|
||||
|
||||
#Space type is wrong, shold be same as meta_class.instance_type
|
||||
def test_chain
|
||||
#show_main_ticks # get output of what is
|
||||
run_input @string_input
|
||||
|
@ -23,7 +23,7 @@ MAIN
|
||||
super
|
||||
end
|
||||
|
||||
def est_chain
|
||||
def test_chain
|
||||
#show_main_ticks # get output of what is
|
||||
run_input @string_input
|
||||
assert_equal 5 , get_return
|
||||
|
@ -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