module Virtual

  #TODO : this constant approach is a bit old, from before PArfait adapter
  #      nowadays these are unneccessary as we can resolve the names by using the
  #      layout of the class. (get Class from space)
  TYPE_INDEX = 0
  LAYOUT_INDEX = 1
  CALLER_INDEX = 2
  RETURN_INDEX = 3
  EXCEPTION_INDEX = 4
  SELF_INDEX = 5
  NAME_INDEX = 6
  FRAME_INDEX = 7
  ARGUMENT_START = 8

  # The current Message is one of four objects the virtual machine knows
  #
  # Slots represent instance variables of objects, so MessageSlots
  # represent instance variables of Message objects.
  # The Message has a layout as per the constant above

  class MessageSlot < Slot
    def initialize index , type = Unknown , value = nil
      super(index ,type , value )
    end
  end

  # named classes exist for slots that often accessed

  # Return is the MessageSlot(RETURN_INDEX)
  class Return < MessageSlot
    def initialize type = Unknown, value = nil
      super( RETURN_INDEX , type , value  )
    end
  end

  # Self is the MessageSlot(SELF_INDEX)
  class Self < MessageSlot
    def initialize type = Unknown, value = nil
      super( SELF_INDEX , type , value  )
    end
  end

  # MessageName of the current message
  class MessageName < MessageSlot
    def initialize type = Unknown, value = nil
      super( NAME_INDEX , type , value  )
    end
  end
end