module SlotMachine class SlottedMessage < Slotted def known_name :message end alias :known_object :known_name def initialize(slots) super(slots) raise "Message must have slots, but none given" unless slots end # load the slots into a register # the code is added to compiler # the register returned def to_register(compiler, source) type = :Message right = compiler.use_reg( type ) slots = @slots left = Risc.message_reg left = left.resolve_and_add( slots.name , compiler) reg = compiler.current.register slots = slots.next_slot while( slots ) left = left.resolve_and_add( slots.name , compiler) slots = slots.next_slot end return reg end # load the data in const_reg into the slot that is named by slot symbols # actual lifting is done by RegisterValue resolve_and_add # # Note: this is the left hand case, the right hand being to_register # They are very similar (apart from the final reg_to_slot here) and should # most likely be united def reduce_and_load(const_reg , compiler , original_source ) raise "Not Message #{object}" unless known_object == :message left = Risc.message_reg slot = slots while( slot.next_slot ) left = left.resolve_and_add( slot.name , compiler) slot = slot.next_slot end compiler.add_code Risc.reg_to_slot(original_source, const_reg , left, slot.name) end end end