externalize boot process
Booting is complicated, make an own file for it
This commit is contained in:
@ -36,7 +36,6 @@ module Virtual
|
||||
@parser = Parser::Salama.new
|
||||
#the_end = Halt.new
|
||||
@passes = [ "Virtual::SendImplementation" ]
|
||||
@space = Parfait::Space.new
|
||||
# @message = Message.new(the_end , the_end , "Object" )
|
||||
end
|
||||
attr_reader :message , :passes , :space , :init , :main
|
||||
@ -77,8 +76,8 @@ module Virtual
|
||||
|
||||
def self.boot
|
||||
instance = self.instance
|
||||
instance.boot_parfait! # boot is a verb here
|
||||
instance.boot
|
||||
# boot is a verb here. this is a somewhat tricky process which is in it's own file, boot.rb
|
||||
instance.boot_parfait!
|
||||
instance
|
||||
end
|
||||
def self.instance
|
||||
@ -91,73 +90,6 @@ module Virtual
|
||||
@instance = nil
|
||||
self.boot
|
||||
end
|
||||
# boot the classes, ie create a minimal set of classes with a minimal set of functions
|
||||
# minimal means only that which can not be coded in ruby
|
||||
# CompiledMethods are grabbed from respective modules by sending the method name. This should return the
|
||||
# implementation of the method (ie a method object), not actually try to implement it (as that's impossible in ruby)
|
||||
def boot_parfait!
|
||||
boot_classes!
|
||||
# very fiddly chicken 'n egg problem. Functions need to be in the right order, and in fact we
|
||||
# have to define some dummies, just for the other to compile
|
||||
# TODO: go through the virtual parfait layer and adjust function names to what they really are
|
||||
obj = @space.get_class_by_name "Object"
|
||||
[:index_of , :_get_instance_variable , :_set_instance_variable].each do |f|
|
||||
obj.add_instance_method Builtin::Object.send(f , nil)
|
||||
end
|
||||
obj = @space.get_class_by_name "Kernel"
|
||||
# create main first, __init__ calls it
|
||||
@main = Builtin::Kernel.send(:main , @context)
|
||||
obj.add_instance_method @main
|
||||
underscore_init = Builtin::Kernel.send(:__init__ ,nil) #store , so we don't have to resolve it below
|
||||
obj.add_instance_method underscore_init
|
||||
[:putstring,:exit,:__send].each do |f|
|
||||
obj.add_instance_method Builtin::Kernel.send(f , nil)
|
||||
end
|
||||
# and the @init block in turn _jumps_ to __init__
|
||||
# the point of which is that by the time main executes, all is "normal"
|
||||
@init = Block.new(:_init_ , nil )
|
||||
@init.add_code(Register::RegisterMain.new(underscore_init))
|
||||
obj = @space.get_class_by_name "Integer"
|
||||
[:putint,:fibo].each do |f|
|
||||
obj.add_instance_method Builtin::Integer.send(f , nil)
|
||||
end
|
||||
obj = @space.get_class_by_name "Word"
|
||||
[:get , :set , :puts].each do |f|
|
||||
obj.add_instance_method Builtin::Word.send(f , nil)
|
||||
end
|
||||
obj = space.get_class_by_name "List"
|
||||
[:get , :set , :push].each do |f|
|
||||
obj.add_instance_method Builtin::Array.send(f , nil)
|
||||
end
|
||||
end
|
||||
|
||||
def boot_classes!
|
||||
values = [ "Integer" , "Object" , "Value" , "Kernel"]
|
||||
rest = ["Word" , "Class" , "Dictionary" , "Space" , "List", "Layout"]
|
||||
(values + rest).each { |cl| @space.create_class(cl) }
|
||||
value_class = @space.get_class_by_name "Value"
|
||||
@space.get_class_by_name("Integer").set_super_class( value_class )
|
||||
object_class = @space.get_class_by_name("Object")
|
||||
object_class.set_super_class( value_class )
|
||||
rest.each do |name|
|
||||
cl = @space.get_class_by_name( name )
|
||||
cl.set_super_class(object_class)
|
||||
end
|
||||
boot_layouts!
|
||||
end
|
||||
def boot_layouts!
|
||||
|
||||
end
|
||||
def boot
|
||||
# read all the files needed for a minimal system at compile
|
||||
classes = ["object"]
|
||||
classes.each do |clazz|
|
||||
bytes = File.read(File.join( File.dirname( __FILE__ ) , ".." , "parfait" , "#{clazz}.rb") )
|
||||
bytes = 0 #shuts up my atom linter
|
||||
# expression = compile_main(bytes)
|
||||
end
|
||||
end
|
||||
|
||||
def compile_main bytes
|
||||
syntax = @parser.parse_with_debug(bytes)
|
||||
parts = Parser::Transform.new.apply(syntax)
|
||||
@ -165,5 +97,6 @@ module Virtual
|
||||
Compiler.compile( parts , main )
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
require_relative "boot"
|
||||
|
Reference in New Issue
Block a user