2014-06-29 18:05:35 +02:00
|
|
|
module Virtual
|
|
|
|
# A frame, or activation frame, represents a function call during calling. So not the static definition of the function
|
|
|
|
# but the dynamic invokation of it.
|
|
|
|
#
|
|
|
|
# In a minimal c world this would be just the return address, but with exceptions and continuations things get more
|
|
|
|
# complicated. How much more we shall see
|
|
|
|
#
|
|
|
|
# The current list comprises
|
|
|
|
# - next normal instruction
|
|
|
|
# - next exception instruction
|
|
|
|
# - self (me)
|
|
|
|
# - argument mappings
|
2014-07-01 17:58:25 +02:00
|
|
|
# - local variable mapping, together with last called binding
|
2014-06-29 18:05:35 +02:00
|
|
|
class Frame
|
2014-07-01 17:58:25 +02:00
|
|
|
def initialize normal , exceptional , me
|
|
|
|
@next_normal = normal
|
|
|
|
@next_exception = exceptional
|
|
|
|
@me = me
|
|
|
|
# a binding represents the local variables at a point in the program.
|
|
|
|
# The amount of local variables is assumed to be relatively small, and so the
|
|
|
|
# storage is a linked list. Has the same api as a ha
|
|
|
|
@binding = List.new
|
2014-06-29 18:05:35 +02:00
|
|
|
end
|
2014-07-01 17:58:25 +02:00
|
|
|
attr_reader :next_normal, :next_exception, :me, :binding
|
2014-07-10 16:14:38 +02:00
|
|
|
|
2014-07-14 13:29:33 +02:00
|
|
|
# dummy for the eventual
|
|
|
|
def new_frame
|
|
|
|
self
|
|
|
|
end
|
2014-07-10 16:14:38 +02:00
|
|
|
#
|
2014-07-13 15:00:48 +02:00
|
|
|
def compile_get method , name
|
2014-07-10 16:14:38 +02:00
|
|
|
method.add FrameGet.new(name)
|
|
|
|
end
|
|
|
|
|
2014-07-13 15:00:48 +02:00
|
|
|
def compile_send method , name , with = []
|
|
|
|
method.add FrameSend.new(name , with )
|
2014-07-10 16:14:38 +02:00
|
|
|
end
|
2014-07-14 20:28:21 +02:00
|
|
|
|
|
|
|
def compile_set method , name , val
|
|
|
|
method.add FrameSet.new(name , val )
|
|
|
|
end
|
2014-06-29 18:05:35 +02:00
|
|
|
end
|
|
|
|
end
|