# A message is what is sent when you invoke a method. Args and stuff are packed up in to a Message
# and the Message is sent to the receiver.

# Part of the housekeeping (see attributes) makes messages a double linked list (next_message and
#  caller) , and maybe surprisingly this means that we can create all messages at runtime
# and link them up and never have to touch that list again.
# All the args and receiver data changes, but the list of messages stays constant.

module Parfait
  class Message < Object
    attributes [:next_message , :receiver , :frame , :return_address ]
    attributes [:return_value, :caller , :name ]

    include Indexed
    self.offset(8)  # 8 == the seven attributes above + layout. (indexed_length gets added)

    def initialize next_m
      self.next_message = next_m
      self.frame = Frame.new()
      self.caller = nil
      super()
    end


    def set_caller caller
      self.caller = caller
    end

    def get_type_for(name)
      index = @layout.get_index(name)
      get_at(index)
    end
  end
end