diff --git a/lib/mom/macro/init.rb b/lib/mom/macro/init.rb index 2606a37e..0959d36a 100644 --- a/lib/mom/macro/init.rb +++ b/lib/mom/macro/init.rb @@ -2,6 +2,8 @@ module Mom class Init < Macro def to_risc(compiler) builder = compiler.builder(compiler.source) + main = Parfait.object_space.get_method!(:Space, :main) + builder.build do factory! << Parfait.object_space.get_factory_for(:Message) message << factory[:next_object] @@ -9,7 +11,7 @@ module Mom factory[:next_object] << next_message end builder.reset_names - Mom::MessageSetup.new(Parfait.object_space.get_main).build_with( builder ) + Mom::MessageSetup.new(main).build_with( builder ) builder.build do message << message[:next_message] @@ -22,7 +24,7 @@ module Mom builder.build do ret_tmp << exit_label message[:return_address] << ret_tmp - add_code Risc.function_call( "__init__ issue call" , Parfait.object_space.get_main) + add_code Risc.function_call( "__init__ issue call" , main) add_code exit_label end compiler.reset_regs diff --git a/lib/parfait/space.rb b/lib/parfait/space.rb index 243cc83b..df1a0c71 100644 --- a/lib/parfait/space.rb +++ b/lib/parfait/space.rb @@ -113,16 +113,15 @@ module Parfait methods end - # shortcut to get the main method. main is defined on Space - def get_main - space = get_class_by_name :Space - space.instance_type.get_method :main - end - - # shortcut to get the __init__ method, which is defined on Object - def get_init - object = get_class_by_name :Object - object.instance_type.get_method :__init__ + # shortcut to get at known methods that are used in the compiler + # arguments are class and method names + # returns method or raises (!) + def get_method!( clazz_name , method_name ) + clazz = get_class_by_name( clazz_name ) + raise "No such class #{clazz_name}" unless clazz + method = clazz.instance_type.get_method(method_name) + raise "No such Method #{method_name}, in #{clazz_name}" unless method + method end # get the current instance_typ of the class with the given name diff --git a/lib/risc/builder.rb b/lib/risc/builder.rb index f42c7593..c63443f8 100644 --- a/lib/risc/builder.rb +++ b/lib/risc/builder.rb @@ -19,6 +19,7 @@ module Risc # call build with a block to build def initialize(compiler, for_source) raise "no compiler" unless compiler + raise "no source" unless for_source @compiler = compiler @source = for_source @source_used = false @@ -207,7 +208,7 @@ module Risc def call_get_more factory = Parfait.object_space.get_factory_for( :Integer ) calling = factory.get_type.get_method( :get_more ) - calling = Parfait.object_space.get_main #until we actually parse Factory + calling = Parfait.object_space.get_method!(:Space,:main) #until we actually parse Factory raise "no main defined" unless calling Mom::MessageSetup.new( calling ).build_with( self ) self.build do diff --git a/lib/risc/callable_compiler.rb b/lib/risc/callable_compiler.rb index 85b0aef9..ad514806 100644 --- a/lib/risc/callable_compiler.rb +++ b/lib/risc/callable_compiler.rb @@ -14,6 +14,7 @@ module Risc # Must pass the callable (method/block) # Also start instuction, usually a label is mandatory def initialize( callable , mom_label) + raise "No method" unless callable @callable = callable @regs = [] @constants = [] diff --git a/test/mom/test_callable_compiler.rb b/test/mom/test_callable_compiler.rb index 5652295e..23061212 100644 --- a/test/mom/test_callable_compiler.rb +++ b/test/mom/test_callable_compiler.rb @@ -1,6 +1,4 @@ require_relative "helper" -class FakeCallable -end module Mom class FakeCallableCompiler < CallableCompiler def source_name diff --git a/test/parfait/test_space.rb b/test/parfait/test_space.rb index a0ddcdf7..a21301c1 100644 --- a/test/parfait/test_space.rb +++ b/test/parfait/test_space.rb @@ -45,28 +45,6 @@ module Parfait def test_all_classes assert_equal classes.length , @space.classes.length , @space.classes.keys.inspect end - def test_types - assert @space.types.is_a? Parfait::Dictionary - end - def test_types_attr - assert @space.types.is_a? Parfait::Dictionary - end - def test_types_each - @space.each_type do |type| - assert type.is_a?(Parfait::Type) - end - end - def test_types_hashes - types = @space.types - types.each do |has , type| - assert has.is_a?(::Integer) , has.inspect - end - end - def test_classes_types_in_space_types - @space.classes do |name , clazz| - assert_equal clazz.instance_type , @space.get_type_for(clazz.instance_type.hash) , clazz.name - end - end def test_word_class word = @space.classes[:Word] assert word.instance_type @@ -149,39 +127,6 @@ module Parfait assert @space.get_class_by_name(:NewerClass) end - def test_class_types_are_stored - @space.classes.each do |name,clazz| - assert @space.get_type_for(clazz.instance_type.hash) - end - end - - def test_class_types_are_identical - @space.classes.each do |name , clazz| - cl_type = @space.get_type_for(clazz.instance_type.hash) - assert_equal cl_type.object_id , clazz.instance_type.object_id - end - end - - def test_remove_methods - @space.each_type do | type | - type.method_names.each do |method| - type.remove_method(method) - end - end - assert_equal 0 , @space.get_all_methods.length - end - def test_no_methods_in_types - test_remove_methods - @space.each_type do |type| - assert_equal 0 , type.methods_length , "name #{type.name}" - end - end - def test_no_methods_in_classes - test_remove_methods - @space.classes.each do |name , cl| - assert_equal 0 , cl.instance_type.methods_length , "name #{cl.name}" - end - end end class BigTestSpace < BigParfaitTest def test_address_count diff --git a/test/parfait/test_space2.rb b/test/parfait/test_space2.rb new file mode 100644 index 00000000..b6450ada --- /dev/null +++ b/test/parfait/test_space2.rb @@ -0,0 +1,71 @@ +require_relative "helper" + +module Parfait + # Most type and method related stuff + class TestSpaceMethod < ParfaitTest + + def test_types + assert @space.types.is_a? Parfait::Dictionary + end + def test_types_attr + assert @space.types.is_a? Parfait::Dictionary + end + def test_types_each + @space.each_type do |type| + assert type.is_a?(Parfait::Type) + end + end + def test_types_hashes + types = @space.types + types.each do |has , type| + assert has.is_a?(::Integer) , has.inspect + end + end + def test_classes_types_in_space_types + @space.classes do |name , clazz| + assert_equal clazz.instance_type , @space.get_type_for(clazz.instance_type.hash) , clazz.name + end + end + + def test_class_types_are_stored + @space.classes.each do |name,clazz| + assert @space.get_type_for(clazz.instance_type.hash) + end + end + + def test_class_types_are_identical + @space.classes.each do |name , clazz| + cl_type = @space.get_type_for(clazz.instance_type.hash) + assert_equal cl_type.object_id , clazz.instance_type.object_id + end + end + + def test_remove_methods + @space.each_type do | type | + type.method_names.each do |method| + type.remove_method(method) + end + end + assert_equal 0 , @space.get_all_methods.length + end + + def test_no_methods_in_types + test_remove_methods + @space.each_type do |type| + assert_equal 0 , type.methods_length , "name #{type.name}" + end + end + + def test_no_methods_in_classes + test_remove_methods + @space.classes.each do |name , cl| + assert_equal 0 , cl.instance_type.methods_length , "name #{cl.name}" + end + end + + def test_get_method_raises + assert_raises(RuntimeError){ @space.get_method!(:Space,:main)} + end + + end +end diff --git a/test/parfait/type/test_method_api.rb b/test/parfait/type/test_method_api.rb index 3e907dd1..4b878512 100644 --- a/test/parfait/type/test_method_api.rb +++ b/test/parfait/type/test_method_api.rb @@ -63,6 +63,10 @@ module Parfait type.add_method(foo) assert_equal :foo , type.get_method(:foo).name end + def test_space_get_method + test_get_instance + assert_equal :foo , @space.get_method!(:Object , :foo).name + end def test_resolve_on_object add_foo_to :Object assert_equal :foo , object_type.resolve_method( :foo ).name diff --git a/test/risc/test_builder.rb b/test/risc/test_builder.rb index faab9dbe..c319191f 100644 --- a/test/risc/test_builder.rb +++ b/test/risc/test_builder.rb @@ -6,8 +6,8 @@ module Risc def setup Parfait.boot!(Parfait.default_test_options) Risc.boot! - init = Parfait.object_space.get_init - @builder = Risc::MethodCompiler.new( init ,Mom::Label.new( "source_name", "return_label")).builder(init) + label = Mom::Label.new( "source_name", "return_label") + @builder = Risc::MethodCompiler.new( FakeCallable.new ,label).builder("source") @label = Risc.label("source","name") @start = @builder.compiler.current end diff --git a/test/risc/test_builder2.rb b/test/risc/test_builder2.rb index 36eeef76..66c6dd45 100644 --- a/test/risc/test_builder2.rb +++ b/test/risc/test_builder2.rb @@ -6,9 +6,9 @@ module Risc def setup Parfait.boot!(Parfait.default_test_options) Risc.boot! - @init = Parfait.object_space.get_init - @compiler = Risc::MethodCompiler.new( @init, Mom::Label.new( "source_name", "return_label") ) - @builder = @compiler.builder(@init) + method = FakeCallable.new + @compiler = Risc::MethodCompiler.new( method, Mom::Label.new( "source_name", "return_label") ) + @builder = @compiler.builder(method) end def test_list assert_equal :List , @builder.infer_type(:list).class_name diff --git a/test/risc/test_linker.rb b/test/risc/test_linker.rb index 79941f03..56357a33 100644 --- a/test/risc/test_linker.rb +++ b/test/risc/test_linker.rb @@ -30,11 +30,11 @@ module Risc assert_equal Position , Position.get(@linker.cpu_init.first).class end def test_first_binary_jump - bin = Parfait.object_space.get_init.binary + bin = Parfait.object_space.get_method!(:Object,:__init__).binary assert_equal 116 , bin.total_byte_length end def test_second_binary_first - bin = Parfait.object_space.get_init.binary + bin = Parfait.object_space.get_method!(:Object,:__init__).binary assert 0 != bin.get_word(0) , "index 0 is 0 #{bin.inspect}" end def test_positions_set diff --git a/test/support/fake_compiler.rb b/test/support/fake_compiler.rb index 016fa442..9fa8cd2e 100644 --- a/test/support/fake_compiler.rb +++ b/test/support/fake_compiler.rb @@ -1,3 +1,5 @@ +class FakeCallable +end module Risc class FakeCompiler attr_reader :instructions