diff --git a/lib/parfait/frame.rb b/lib/parfait/frame.rb index eac629d0..0020f05d 100644 --- a/lib/parfait/frame.rb +++ b/lib/parfait/frame.rb @@ -21,12 +21,9 @@ # Which resolves the dichotomy of objects on the stack or heap. Sama sama. module Parfait - class Frame < Object - def initialize locals , temps + class Frame < List + def initialize super() - @locals = locals - @tmps = tmps end - attr_accessor :locals , :tmps end end diff --git a/lib/parfait/list.rb b/lib/parfait/list.rb index b8c99781..ec80c2db 100644 --- a/lib/parfait/list.rb +++ b/lib/parfait/list.rb @@ -44,6 +44,11 @@ module Parfait self.set( self.get_length + 1 , value) end + def first + return nil unless empty? + get(1) + end + # set the value at index. # Lists start from index 1 def set( index , value) diff --git a/lib/parfait/space.rb b/lib/parfait/space.rb index 330916e7..7ae18f90 100644 --- a/lib/parfait/space.rb +++ b/lib/parfait/space.rb @@ -37,8 +37,14 @@ module Parfait # 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 = 100.times.collect{ ::Parfait::Frame.new([],[])} - @messages = 100.times.collect{ ::Parfait::Message.new } + @frames = List.new_object + @messages = List.new_object + counter = 0 + while( counter < 100) + @frames.push Frame.new_object + @messages.push Message.new_object + counter = counter + 1 + end @next_message = @messages.first @next_frame = @frames.first end @@ -70,8 +76,8 @@ module Parfait end def create_class name , superclass - c = Class.new_object(name , superclass) raise "uups " if name.is_a? String + c = Class.new_object(name , superclass) @classes[name] = c end end diff --git a/lib/virtual/boot.rb b/lib/virtual/boot.rb index 44a265f5..fbb2fe56 100644 --- a/lib/virtual/boot.rb +++ b/lib/virtual/boot.rb @@ -59,16 +59,20 @@ module Virtual class_mappings["Kernel"] = value_classes[2] #need for further booting class_mappings["Object"] = value_classes[3] #need for further booting + # add space and instances which get created before the objects list + @space.add_object @space + @space.add_object @space.classes + @space.add_object @space.classes.keys + @space.add_object @space.classes.values + @space.add_object @space.objects + + @space.late_init + # now update the layout on all objects created so far, # go through objects in space @space.objects.each do | o | o.init_layout end - # and go through the space instance variables which get created before the object list - @space.init_layout - @space.classes.init_layout - @space.objects.init_layout - @space.late_init boot_functions! end diff --git a/lib/virtual/instruction.rb b/lib/virtual/instruction.rb index 8607f6f9..0e76e17a 100644 --- a/lib/virtual/instruction.rb +++ b/lib/virtual/instruction.rb @@ -10,7 +10,9 @@ module Virtual # instructions, thus defining a minimal set of instructions needed to implement oo. class Instruction - include Positioned + def to_s + Sof::Writer.write(self) + end end end diff --git a/lib/virtual/machine.rb b/lib/virtual/machine.rb index 46a0439f..e62e0780 100644 --- a/lib/virtual/machine.rb +++ b/lib/virtual/machine.rb @@ -34,11 +34,9 @@ module Virtual def initialize @parser = Parser::Salama.new - #the_end = Halt.new @passes = [ "Virtual::SendImplementation" ] -# @message = Message.new(the_end , the_end , "Object" ) end - attr_reader :message , :passes , :space , :init , :main , :class_mappings + attr_reader :message , :passes , :space , :class_mappings def run_passes #TODO puts "INIT #{@init}"