rubyx/lib/virtual/message.rb

57 lines
1.8 KiB
Ruby
Raw Normal View History

module Virtual
2014-07-24 20:56:31 +02:00
# So when an object calls a method, or sends a message, this is what it sends: a Message
# A message contains the sender, return and exceptional return addresses,the arguments, and a slot for the frame.
# As such it is a very run-time object, deep in the machinery as it were, and does not have meaningful
# methods you could call at compile time.
# The methods that are there, are nevertheless meant to be called at compile time and generate code, rather than
# executing it.
2015-05-05 14:11:09 +02:00
# The caller creates the Message and passes control to the receiver's method
# The receiver create a new Frame to hold local and temporary variables and (later) creates default values for
# arguments that were not passed
2015-05-05 14:11:09 +02:00
# How the actual finding of the method takes place (acording to the ruby rules) is not simple, but as there is a
# guaranteed result (be it method_missing) it does not matter to the passing mechanism described
# During compilation Message and frame objects are created to do type analysis
class Message
2014-09-11 20:26:22 +02:00
SELF_REG = :r0
MESSAGE_REG = :r1
FRAME_REG = :r2
NEW_MESSAGE_REG = :r3
TMP_REG = :r4
2015-05-05 14:11:09 +02:00
def initialize me , normal , exceptional
@me = me
@next_normal = normal
@next_exception = exceptional
2014-07-24 20:56:31 +02:00
@arguments = arguments
# a frame represents the local and temporary variables at a point in the program.
2014-07-24 20:56:31 +02:00
@frame = nil
end
2014-07-24 20:56:31 +02:00
attr_reader :me, :next_normal, :next_exception, :arguments , :frame
# dummy for the eventual
def new_frame
2014-07-24 20:56:31 +02:00
raise self.inspect
end
2015-05-05 14:11:09 +02:00
#
def compile_get method , name
raise "CALLED"
2014-07-25 19:28:38 +02:00
if method.has_arg(name)
method.add_code MessageGet.new(name)
2014-07-25 19:28:38 +02:00
else
method.add_code FrameGet.new(name)
2014-07-25 19:28:38 +02:00
end
method.get_var(name)
end
end
end