module Virtual # A slot is a slot in an object. It is the storage location for a value. # (Remember, values are typed) # From a memory perspective a slot is an index into an array (the object) # The mapping into arrays is a straightforward matter, but happens in the # next level down, the register machine. # Four known objects exist and those correspond to subclasses: # - the message that has been received: MessageSlot # - the frame of the method that is executing (local variables): FrameSlot # - self as an object: SelfSlot # - a message that will be sent, NewMessageSlot # additionally frame, self and return are slots in Message and NewMessage # Slot has a lot of small subclasses # Names for the slots avoid indexes class Slot < Object # the name of the object of a slot is a symbol that represents what the class name describes # ie it is one of :message , :self , :frame , :new_message # one of the objects the machine works on. def object_name raise "abstract called #{self}" end attr_accessor :type , :value def to_s "#{self.class.name}.new(#{type}, #{value})" end private #abstract base class def initialize type , value @type = type @value = value end end end require_relative "message_slot" require_relative "self_slot" require_relative "frame_slot" require_relative "new_message_slot"