From a496ea7e4b59b62f3c49a2a60f348e1d826e630a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20R=C3=BCger?= Date: Sat, 21 Sep 2019 18:50:33 +0300 Subject: [PATCH] Derive Class and MetaClass from Behaviour Finally! If i remember the module was from before i had any non Object superclasses unified code, unified bugs :-) just makes sense --- lib/parfait/behaviour.rb | 19 ++++++++++--- lib/parfait/class.rb | 30 +++------------------ lib/parfait/meta_class.rb | 29 ++++---------------- lib/risc/parfait_boot.rb | 6 +++-- lib/vool/class_method_expression.rb | 2 +- lib/vool/method_expression.rb | 2 +- test/mom/test_method_compiler.rb | 2 +- test/parfait/test_space.rb | 2 +- test/parfait/type/test_hash.rb | 4 +-- test/risc/interpreter/calling/test_minus.rb | 2 +- test/risc/test_collector.rb | 4 +-- test/risc/test_interpreter.rb | 2 +- test/risc/test_linker.rb | 2 +- test/risc/test_method_compiler.rb | 4 +-- test/rubyx/test_rubyx_compiler2.rb | 2 +- 15 files changed, 42 insertions(+), 70 deletions(-) diff --git a/lib/parfait/behaviour.rb b/lib/parfait/behaviour.rb index c81d65c0..98c57f08 100644 --- a/lib/parfait/behaviour.rb +++ b/lib/parfait/behaviour.rb @@ -3,11 +3,14 @@ # instance_methods is the attribute in the including class that has the methods module Parfait - module Behaviour + class Behaviour < Object - def initialize + attr_reader :instance_type , :instance_methods + + def initialize(type) super() @instance_methods = List.new + @instance_type = type end def methods @@ -24,9 +27,14 @@ module Parfait names end + def add_instance_method_for(name , type , frame , body ) + method = Parfait::VoolMethod.new(name , type , frame , body ) + add_instance_method( method ) + end + def add_instance_method( method ) raise "not implemented #{method.class} #{method.inspect}" unless method.is_a? VoolMethod - raise "HMM" + @instance_methods.push(method) method end @@ -52,5 +60,10 @@ module Parfait method end + # adding an instance changes the instance_type to include that variable + def add_instance_variable( name , type) + @instance_type = @instance_type.add_instance_variable( name , type ) + end + end end diff --git a/lib/parfait/class.rb b/lib/parfait/class.rb index 5c2ba2da..457f1688 100644 --- a/lib/parfait/class.rb +++ b/lib/parfait/class.rb @@ -15,11 +15,9 @@ # Each type in turn has a list of CallableMethods that hold binary code module Parfait - class Class < Object - include Behaviour + class Class < Behaviour - attr_reader :instance_type , :name , :instance_methods - attr_reader :super_class_name , :meta_class + attr_reader :name , :super_class_name , :meta_class def self.type_length 6 @@ -29,11 +27,9 @@ module Parfait end def initialize( name , superclass , instance_type) - super() + super(instance_type) @name = name @super_class_name = superclass - @instance_methods = List.new - @instance_type = instance_type @meta_class = MetaClass.new( self ) end @@ -48,26 +44,6 @@ module Parfait inspect end - def add_method_for(name , type , frame , body ) - method = Parfait::VoolMethod.new(name , type , frame , body ) - add_method( method ) - method - end - - def add_method(method) - raise "Must be untyped method #{method}" unless method.is_a? Parfait::VoolMethod - @instance_methods.push(method) - end - - def get_method(name) - @instance_methods.find{|m| m.name == name } - end - - # adding an instance changes the instance_type to include that variable - def add_instance_variable( name , type) - @instance_type = @instance_type.add_instance_variable( name , type ) - end - # return the super class, but raise exception if either the super class name # or the super classs is nil. # Use only for non Object base class diff --git a/lib/parfait/meta_class.rb b/lib/parfait/meta_class.rb index e40e1ce1..5155bfa0 100644 --- a/lib/parfait/meta_class.rb +++ b/lib/parfait/meta_class.rb @@ -14,10 +14,9 @@ # There is a one to one relationship between a class instance and it's meta_class instance. module Parfait - class MetaClass < Object - include Behaviour + class MetaClass < Behaviour - attr_reader :instance_type , :instance_methods , :clazz + attr_reader :clazz def self.type_length 4 @@ -27,9 +26,10 @@ module Parfait end def initialize( clazz ) - super() + type = Object.object_space.get_type_by_class_name(:Object) + raise "No type for #{clazz.name}" unless type + super( type ) @clazz = clazz - @instance_type = Object.object_space.get_type_by_class_name(:Object) end def rxf_reference_name @@ -43,25 +43,6 @@ module Parfait def to_s inspect end - def add_method_for(name , type , frame , body ) - method = Parfait::VoolMethod.new(name , type , frame , body ) - add_method( method ) - method - end - - def add_method(method) - raise "Must be untyped method #{method}" unless method.is_a? Parfait::VoolMethod - @instance_methods.push(method) - end - - def get_method(name) - @instance_methods.find{|m| m.name == name } - end - - # adding an instance changes the instance_type to include that variable - def add_instance_variable( name , type) - @instance_type = @instance_type.add_instance_variable( name , type ) - end # Nil name means no superclass, and so nil returned def super_class diff --git a/lib/risc/parfait_boot.rb b/lib/risc/parfait_boot.rb index e7b08e5c..922c0f1d 100644 --- a/lib/risc/parfait_boot.rb +++ b/lib/risc/parfait_boot.rb @@ -129,6 +129,8 @@ module Parfait List: :Data16 , CallableMethod: :Callable, Block: :Callable, + Class: :Behaviour, + MetaClass: :Behaviour , ReturnAddress: :Integer} end @@ -136,11 +138,11 @@ module Parfait # unfortuantely that constant condenses every detail about the system, class names # and all instance variable names. Really have to find a better way def self.type_names - {BinaryCode: {next_code: :BinaryCode} , + {Behaviour: {instance_type: :Type , instance_methods: :List } , + BinaryCode: {next_code: :BinaryCode} , Block: {binary: :BinaryCode, next_callable: :Block, arguments_type: :Type , self_type: :Type, frame_type: :Type, name: :Word , blocks: :Block } , - CacheEntry: {cached_type: :Type , cached_method: :CallableMethod } , Callable: {binary: :BinaryCode,next_callable: :Callable , arguments_type: :Type , self_type: :Type, frame_type: :Type, diff --git a/lib/vool/class_method_expression.rb b/lib/vool/class_method_expression.rb index d6902846..15ea9b23 100644 --- a/lib/vool/class_method_expression.rb +++ b/lib/vool/class_method_expression.rb @@ -10,7 +10,7 @@ module Vool def to_mom(clazz) 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 ) + method = clazz.add_instance_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)} diff --git a/lib/vool/method_expression.rb b/lib/vool/method_expression.rb index 4557a8ad..7a06f4d9 100644 --- a/lib/vool/method_expression.rb +++ b/lib/vool/method_expression.rb @@ -21,7 +21,7 @@ module Vool # extracted call to create the VoolMethod as this is the place # where we have all the info. Used in testing. def make_method(clazz) - clazz.add_method_for(name , make_arg_type , make_frame , body ) + clazz.add_instance_method_for(name , make_arg_type , make_frame , body ) end def each(&block) diff --git a/test/mom/test_method_compiler.rb b/test/mom/test_method_compiler.rb index 8499c997..fc5cbf2b 100644 --- a/test/mom/test_method_compiler.rb +++ b/test/mom/test_method_compiler.rb @@ -14,7 +14,7 @@ module Mom def test_method in_test_vool() - method = Parfait.object_space.get_class_by_name(:Test).get_method(:meth) + method = Parfait.object_space.get_class_by_name(:Test).get_instance_method(:meth) assert_equal Parfait::VoolMethod , method.class end def test_method_mom_col diff --git a/test/parfait/test_space.rb b/test/parfait/test_space.rb index 7cd574bb..5795cbf9 100644 --- a/test/parfait/test_space.rb +++ b/test/parfait/test_space.rb @@ -4,7 +4,7 @@ module Parfait class TestSpace < ParfaitTest def classes - [:BinaryCode,:Block,:CacheEntry,:Callable,:CallableMethod,:Class, + [:Behaviour ,:BinaryCode,:Block,:CacheEntry,:Callable,:CallableMethod,:Class, :DataObject,:Data4,:Data8,:Data16,:Data32,:Dictionary,:Factory, :Integer,:FalseClass, :List,:Message, :MetaClass,:NilClass,:Object,:ReturnAddress, :Space,:TrueClass,:Type,:VoolMethod,:Word] diff --git a/test/parfait/type/test_hash.rb b/test/parfait/type/test_hash.rb index 6109cf6c..d509b6ce 100644 --- a/test/parfait/type/test_hash.rb +++ b/test/parfait/type/test_hash.rb @@ -22,13 +22,13 @@ module Parfait end def test_name - assert_equal "BinaryCode_Type" , @types.values.first.name + assert_equal "Behaviour_Type" , @types.values.first.name end def test_to_hash hash = @first.to_hash assert_equal hash[:type] , :Type - assert_equal 2 , hash.length + assert_equal 3 , hash.length end def test_add_is_different type = @first.add_instance_variable :random , :Integer diff --git a/test/risc/interpreter/calling/test_minus.rb b/test/risc/interpreter/calling/test_minus.rb index e6a663b9..bfd2a8b5 100644 --- a/test/risc/interpreter/calling/test_minus.rb +++ b/test/risc/interpreter/calling/test_minus.rb @@ -38,7 +38,7 @@ module Risc ret = main_ticks(49) assert_equal FunctionReturn , ret.class assert_equal :r3 , ret.register.symbol - assert_equal 37852 , @interpreter.get_register(ret.register) + assert_equal 38236 , @interpreter.get_register(ret.register) end end end diff --git a/test/risc/test_collector.rb b/test/risc/test_collector.rb index 21cb6731..1ff40ecb 100644 --- a/test/risc/test_collector.rb +++ b/test/risc/test_collector.rb @@ -38,7 +38,7 @@ module Risc end def len - 1471 + 1479 end def test_collect_all_types @@ -70,7 +70,7 @@ module Risc end def len - 2951 + 2959 end end end diff --git a/test/risc/test_interpreter.rb b/test/risc/test_interpreter.rb index 685659d2..c39f363d 100644 --- a/test/risc/test_interpreter.rb +++ b/test/risc/test_interpreter.rb @@ -54,7 +54,7 @@ module Risc end def test_pc @interpreter.tick - assert_equal t = 37416 , @interpreter.pc + assert_equal t = 37800 , @interpreter.pc @interpreter.tick assert_equal t + 4 , @interpreter.pc end diff --git a/test/risc/test_linker.rb b/test/risc/test_linker.rb index b799e951..758c7826 100644 --- a/test/risc/test_linker.rb +++ b/test/risc/test_linker.rb @@ -24,7 +24,7 @@ module Risc assert_equal 0 , Position.get(@linker.cpu_init).at end def test_cpu_at - assert_equal "0x931c" , Position.get(@linker.cpu_init.first).to_s + assert_equal "0x941c" , Position.get(@linker.cpu_init.first).to_s end def test_cpu_label assert_equal Position , Position.get(@linker.cpu_init.first).class diff --git a/test/risc/test_method_compiler.rb b/test/risc/test_method_compiler.rb index bd9f54d8..c10705ab 100644 --- a/test/risc/test_method_compiler.rb +++ b/test/risc/test_method_compiler.rb @@ -15,7 +15,7 @@ module Risc def create_method(body = "@ivar = 5;return") in_test_vool("def meth; #{body};end") test = Parfait.object_space.get_class_by_name(:Test) - test.get_method(:meth) + test.get_instance_method(:meth) end def test_method_has_source @@ -55,7 +55,7 @@ module Risc def test_callable_method_has_one_local in_test_vool("def meth; local = 5 ; a = 6;return;end") test = Parfait.object_space.get_class_by_name(:Test) - method = test.get_method(:meth) + method = test.get_instance_method(:meth) assert_equal 3 , method.frame_type.instance_length assert_equal 1 , method.frame_type.variable_index(:local) assert_equal 2 , method.frame_type.variable_index(:a) diff --git a/test/rubyx/test_rubyx_compiler2.rb b/test/rubyx/test_rubyx_compiler2.rb index a868a6c6..86a9c690 100644 --- a/test/rubyx/test_rubyx_compiler2.rb +++ b/test/rubyx/test_rubyx_compiler2.rb @@ -38,7 +38,7 @@ module RubyX def test_load object = Parfait.object_space.get_class_by_name(:Object) - assert_equal Parfait::VoolMethod , object.get_method(:set_type).class + assert_equal Parfait::VoolMethod , object.get_instance_method(:set_type).class assert_equal Parfait::CallableMethod , object.instance_type.get_method(:set_type).class end end