Torsten Rüger
dced6b12e6
the "old" way of generating compilers is now obsolete we can use ruby code with mom macros to achieve the same Three step wip remove old builtin fix tests (including adding necessary methods) fixup and inclusion of builtin code to parfait
64 lines
2.3 KiB
Ruby
64 lines
2.3 KiB
Ruby
module Mom
|
|
# The Compiler/Collection for the Mom level is a collection of Mom level Method
|
|
# compilers These will transform to Risc MethodCompilers on the way down.
|
|
#
|
|
# As RubyCompiler pools source at the vool level, when several classes are compiled
|
|
# from vool to mom, several MomCompilers get instantiated. They must be merged before
|
|
# proceeding with translate. Thus we have a append method.
|
|
#
|
|
class MomCollection
|
|
attr_reader :method_compilers
|
|
|
|
# Initialize with an array of risc MethodCompilers
|
|
def initialize(compilers = [])
|
|
@method_compilers = compilers
|
|
end
|
|
|
|
# lazily instantiate the compiler for init function
|
|
def init_compiler
|
|
@init_compilers ||= create_init_compiler
|
|
end
|
|
|
|
# Return all compilers, namely the MethodCompilers passed in, plus the
|
|
# boot_function's compilers (boot_compilers)
|
|
def compilers
|
|
@method_compilers << init_compiler
|
|
end
|
|
|
|
# Append another MomCompilers method_compilers to this one.
|
|
def append(mom_compiler)
|
|
@method_compilers += mom_compiler.method_compilers
|
|
self
|
|
end
|
|
|
|
def to_risc( )
|
|
riscs = compilers.collect do | mom_c |
|
|
mom_c.to_risc
|
|
end
|
|
# to_risc all compilers
|
|
# for each suffling constnts and fist label, then all instructions (see below)
|
|
# then create risc collection
|
|
Risc::RiscCollection.new(riscs)
|
|
end
|
|
|
|
# this is the really really first place the machine starts (apart from the jump here)
|
|
# it isn't really a function, ie it is jumped to (not called), exits and may not return
|
|
# so it is responsible for initial setup:
|
|
# - load fist message, set up Space as receiver
|
|
# - call main, ie set up message for that etc
|
|
# - exit (exit_sequence) which passes a machine int out to c
|
|
def create_init_compiler
|
|
compiler = self.class.compiler_for(:Object,:__init__ ,{})
|
|
compiler._reset_for_init # no return, just for init
|
|
compiler.add_code Init.new("missing")
|
|
return compiler
|
|
end
|
|
def self.compiler_for( clazz_name , method_name , arguments , locals = {})
|
|
frame = Parfait::NamedList.type_for( locals )
|
|
args = Parfait::NamedList.type_for( arguments )
|
|
MethodCompiler.compiler_for_class(clazz_name , method_name , args, frame )
|
|
end
|
|
|
|
end
|
|
end
|