correctly linking frames and messages

This commit is contained in:
Torsten Ruger 2015-06-28 22:02:07 +03:00
parent 31635d9747
commit 8674c322c4
6 changed files with 26 additions and 20 deletions

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 ] ,