boot process 90 percent done

Creating the class and layout objects in the
right order was tricky, but  now mostly done
This commit is contained in:
Torsten Ruger
2015-05-23 12:15:06 +03:00
parent 94f49bf5c2
commit 1d9ef6d5c8
4 changed files with 36 additions and 35 deletions

View File

@ -19,37 +19,41 @@ module Virtual
values = [ "Value" , "Integer" , "Kernel" , "Object"].collect {|cl| Virtual.new_word(cl) }
value_classes = values.collect { |cl| @space.create_class(cl) }
rest = [ "Word", "Space", "Layout", "Module" ,
"Class" , "Dictionary", "List"]
rest_layouts = { Virtual.new_word("Word") => [] ,
Virtual.new_word("Space") => ["classes","objects"],
Virtual.new_word("Layout") => ["object_class"] ,
Virtual.new_word("Module") => ["name","instance_methods", "super_class", "meta_class"],
Virtual.new_word("Class") => ["object_layout"],
Virtual.new_word("Dictionary") => ["keys" , "values"],
Virtual.new_word("List") => [] }
rest_classes = rest_layouts.collect { |cl , lay| @space.create_class(cl) }
rest_classes[1].set_super_class( value_classes[0] ) # #set superclass for object
rest_classes[3].set_super_class( value_classes[0] ) # and integer
rest_classes.each do |cl| # and the rest
cl.set_super_class(value_classes[3])
layouts = { "Word" => [] ,
"Space" => ["classes","objects"],
"Layout" => ["object_class"] ,
"Method" => ["name" , "arg_names" , "locals" , "tmps"] ,
"Module" => ["name","instance_methods", "super_class", "meta_class"],
"Class" => ["object_layout"],
"Dictionary" => ["keys" , "values"],
"List" => [] }
# map from the vm - class_name to the Parfait class (which carries parfait name)
class_mappings = {}
layouts.each do |name , layout|
class_mappings[name] = @space.create_class(Virtual.new_word(name))
end
value_classes[1].set_super_class( value_classes[0] ) # #set superclass (value) for object
value_classes[3].set_super_class( value_classes[0] ) # and integer
class_mappings.each do |name , clazz| # and the rest
clazz.set_super_class(value_classes[3]) # superclasses are object
end
# next create layouts by adding instance variable names to the layouts
rest_classes.each do |cl|
name = cl.name
variables = rest_layouts[name]
class_mappings.each do |name , clazz|
variables = layouts[name]
variables.each do |var_name|
cl.object_layout.add_instance_variable Virtual.new_word(var_name)
clazz.object_layout.add_instance_variable Virtual.new_word(var_name)
end
end
# now store the classes so we can hand them out later during object creation
# this can not be done earlier, as parfait objects are all the time created and would
# lookup half created class info
# but it must be done before going through the objects (next step)
@class_mappings = class_mappings
# now update the layout on all objects created so far,
# go through objects in space
@space.objects.each do | o |
vm_name = o.class.name.split("::").last
index = rest.index(vm_name)
raise "Class not found #{o.class}" unless index
o.set_layout rest_classes[index].object_layout
puts "index #{index}"
o.init_layout
end
# and go through the space instance variables which get created before the object list
end