diff --git a/lib/parfait/frame.rb b/lib/parfait/frame.rb index 0020f05d..2ab0d85c 100644 --- a/lib/parfait/frame.rb +++ b/lib/parfait/frame.rb @@ -21,8 +21,9 @@ # Which resolves the dichotomy of objects on the stack or heap. Sama sama. module Parfait - class Frame < List - def initialize + class Frame < Object + def initialize next_f + @next_frame = next_f super() end end diff --git a/lib/parfait/message.rb b/lib/parfait/message.rb index e21cd92e..1fa93e3e 100644 --- a/lib/parfait/message.rb +++ b/lib/parfait/message.rb @@ -5,6 +5,11 @@ module Parfait class Message < Object + def initialize next_m + @next_message = next_m + super() + end + def get_type_for(name) index = @layout.get_index(name) get_at(index) diff --git a/lib/parfait/method.rb b/lib/parfait/method.rb index e45a8d54..167f2c04 100644 --- a/lib/parfait/method.rb +++ b/lib/parfait/method.rb @@ -29,7 +29,7 @@ module Parfait @locals = List.new @tmps = List.new end - attr_reader :name , :arg_names , :for_class , :code + attr_reader :name , :arg_names , :for_class , :code , :locals , :tmps # determine whether this method has a variable by the given name diff --git a/lib/parfait/space.rb b/lib/parfait/space.rb index 1c26a2db..256b4b78 100644 --- a/lib/parfait/space.rb +++ b/lib/parfait/space.rb @@ -29,21 +29,18 @@ module Parfait @classes = Parfait::Dictionary.new_object @syscall_message = nil # a hack sto store the message during syscall end - attr_reader :classes , :frames, :messages, :next_message , :next_frame + attr_reader :classes , :next_message , :next_frame # need a two phase init for the object space (and generally parfait) because the space # is an interconnected graph, so not everthing is ready def late_init - @frames = List.new_object - @messages = List.new_object counter = 0 - while( counter < 5) - @frames.push Frame.new_object - @messages.push Message.new_object - counter = counter + 1 + @next_message = Message.new(nil) + @next_frame = Frame.new(nil) + 5.times do |i| + @next_message = Message.new @next_message + @next_frame = Frame.new @next_frame end - @next_message = @messages.first - @next_frame = @frames.first init_layout end diff --git a/lib/register/passes/frame_implementation.rb b/lib/register/passes/frame_implementation.rb index 58c42f58..35501199 100644 --- a/lib/register/passes/frame_implementation.rb +++ b/lib/register/passes/frame_implementation.rb @@ -34,16 +34,19 @@ module Register # move the spave to it's register (mov instruction gets the address of the object) new_codes = [ LoadConstant.new( Parfait::Space.object_space , space_tmp )] # find index in the space where to grab frame/message - ind = Parfait::Space.object_space.get_layout().index_of( kind ) - raise "index not found for #{kind}.#{kind.class}" unless ind + space_index = Parfait::Space.object_space.get_layout().index_of( kind ) + raise "index not found for #{kind}.#{kind.class}" unless space_index # load the frame/message from space by index - new_codes << GetSlot.new( space_tmp , ind , RegisterReference.frame_reg ) + new_codes << GetSlot.new( space_tmp , space_index , RegisterReference.frame_reg ) # a temporary place to store the new frame frame_tmp = space_tmp.next_reg_use # get the next_frame - new_codes << GetSlot.new( RegisterReference.frame_reg , 2 , frame_tmp) # 2 index of next_frame + from = Parfait::Space.object_space.send( kind ) + kind_index = from.get_layout().index_of( kind ) + raise "index not found for #{kind}.#{kind.class}" unless kind_index + new_codes << GetSlot.new( RegisterReference.frame_reg , kind_index , frame_tmp) # 2 index of next_frame # save next frame into space - new_codes << SetSlot.new( frame_tmp , space_tmp , ind) + new_codes << SetSlot.new( frame_tmp , space_tmp , space_index) block.replace(code , new_codes ) end end diff --git a/lib/virtual/boot.rb b/lib/virtual/boot.rb index e590458f..07316257 100644 --- a/lib/virtual/boot.rb +++ b/lib/virtual/boot.rb @@ -25,11 +25,11 @@ module Virtual value_classes = values.collect { |cl| @space.create_class(cl,nil) } layouts = { :Word => [] , :List => [] , - :Message => [], + :Message => [:next_message], :MetaClass => [], :BinaryCode => [], - :Space => [:classes ,:frames ,:messages ,:next_message ,:next_frame, :syscall_message], - :Frame => [:locals , :tmps ], + :Space => [:classes ,:next_message ,:next_frame, :syscall_message], + :Frame => [:next_frame ], :Layout => [:object_class] , :Class => [:object_layout ], :Dictionary => [:keys , :values ] ,