rubyx/lib/slot_machine/slot_collection.rb
Torsten Rüger d1f8733623 Rename Vool to Sol
Simple is really the descriptive name for the layer
Sure, it is "virtual" but that is not as important as the fact that it is simple (or simplified)
Also objct (based really) is better, since orientated implies it is a little like that, but only orientated, not really it. Sol only has objects, nothing else
Just cause i was renaming anyway
2019-10-04 00:38:47 +03:00

83 lines
2.6 KiB
Ruby

module SlotMachine
# The Compiler/Collection for the SlotMachine level is a collection of SlotMachine level Method
# compilers These will transform to Risc MethodCompilers on the way down.
#
# As RubyCompiler pools source at the sol level, when several classes are compiled
# from sol to slot, several SlotMachineCompilers get instantiated. They must be merged before
# proceeding with translate. Thus we have a append method.
#
class SlotCollection
attr_reader :method_compilers
# Initialize with an array of risc MethodCompilers
def initialize(compilers = [])
@method_compilers = nil
compilers.each{|c| add_compiler(c)}
end
# lazily instantiate the compiler for __init__ function and __method_missing__
def init_compilers
return if @init_compilers
@init_compilers = true
add_compiler SlotCollection.create_init_compiler
add_compiler SlotCollection.create_mm_compiler
self
end
# Return all compilers, namely the MethodCompilers instanc,
# plus the init_compilers
def compilers
init_compilers
@method_compilers
end
def add_compiler(compiler)
if(@method_compilers)
@method_compilers.add_method_compiler(compiler)
else
@method_compilers = compiler
end
self
end
# Append another SlotMachineCompilers method_compilers to this one.
def append(collection)
@method_compilers.add_method_compiler( collection.method_compilers)
self
end
def to_risc( )
init_compilers
riscs =[]
@method_compilers.each_compiler do | slot_c |
riscs << slot_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
# See Init instruction. We must have an init (ie we need it in code), so it is created in code
def self.create_init_compiler
compiler = compiler_for(:Object,:__init__ ,{})
compiler._reset_for_init # no return, just for init
compiler.add_code Init.new("missing")
return compiler
end
def self.create_mm_compiler
compiler = compiler_for(:Object,:__method_missing__ ,{})
compiler.add_code MethodMissing.new("missing" , :r1)
return compiler
end
def self.compiler_for( clazz_name , method_name , arguments , locals = {})
frame = Parfait::Type.for_hash( locals )
args = Parfait::Type.for_hash( arguments )
MethodCompiler.compiler_for_class(clazz_name , method_name , args, frame )
end
end
end