rubyx/lib/parfait/message.rb
Torsten Rüger 8ed013c2b9 Change Locals in calling convention
Just like the args, locals are now inlined into the Message.
Message is off course bigger, but as they are created at compile time, that hardly matters
Some programs did get somewhat smaller, especially with both changes, but not super much
2019-08-23 10:23:01 +03:00

65 lines
2.0 KiB
Ruby

# A message is what is created when a message is sent. Args and stuff are packed up in to a
# Message and the Message is activated (by swapping it into the machine).
# 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 compile-time
# 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
# (a pleasant stupor while we ignore closures and longer extended frames ).
module Parfait
class Message < Object
# :next_message => :Message, :receiver => :Object, :frame => :NamedList ,
# :return_address => :Integer, :return_value => :Integer,
# :caller => :Message , :name => :Word , :arguments => :NamedList
attr :type, :next_message
attr :receiver
attr :return_address, :return_value
attr :caller , :method
attr :arguments_given
attr :arg1 , :arg2, :arg3, :arg4, :arg5, :arg6
attr :locals_used
attr :local1 , :local2, :local3, :local4, :local5, :local6 ,:local7,:local8
attr :local9 ,:local10, :local11 , :local12, :local13, :local14
def self.type_length
31
end
def self.memory_size
32
end
def self.args_start_at
Parfait.object_space.get_type_by_class_name(:Message).variable_index(:arguments_given)
end
def self.locals_start_at
Parfait.object_space.get_type_by_class_name(:Message).variable_index(:locals_used)
end
def initialize( )
super()
self.locals_used = Parfait::Integer.new(0)
self.arguments_given = Parfait::Integer.new(0)
end
public :initialize
def set_receiver(rec)
self.receiver = rec
end
def set_caller(caller)
caller = caller
end
def get_type_for(name)
index = type.get_index(name)
get_at(index)
end
def to_s
"Message:#{method&.name}(#{arguments_given})"
end
end
end