This commit is contained in:
Torsten Ruger
2015-06-29 20:55:45 +03:00
parent 54dd37cb4d
commit 218fafca05
5 changed files with 27 additions and 17 deletions

View File

@ -7,14 +7,14 @@ module Virtual
def self.compile_callsite expession , method
me = Compiler.compile( expession.receiver , method )
method.info.add_code NewMessage.new
method.info.add_code Set.new( me , NextSelf.new(me.type))
method.info.add_code Set.new( expession.name.to_sym , NextMessageName.new())
method.info.add_code Set.new( me , NewSelf.new(me.type))
method.info.add_code Set.new( expession.name.to_sym , NewMessageName.new())
compiled_args = []
expession.args.each_with_index do |arg , i|
#compile in the running method, ie before passing control
val = Compiler.compile( arg , method)
# move the compiled value to it's slot in the new message
to = NextMessageSlot.new(i ,val.type , val)
to = NewArgSlot.new(i ,val.type , val)
# (doing this immediately, not after the loop, so if it's a return it won't get overwritten)
method.info.add_code Set.new( val , to )
compiled_args << to

View File

@ -2,11 +2,11 @@ module Virtual
# The next Message is one of four objects the virtual machine knows
#
# Slots represent instance variables of objects, so NextMessageSlots
# represent instance variables of NextMessage objects.
# Slots represent instance variables of objects, so NewMessageSlots
# represent instance variables of NewMessage objects.
# The Message has a layout as per the constant above
class NextMessageSlot < Slot
class NewMessageSlot < Slot
def initialize type = Unknown, value = nil
super( type , value )
end
@ -14,24 +14,34 @@ module Virtual
# named classes exist for slots that often accessed
# NextReturn is the return of NextMessageSlot
class NextReturn < NextMessageSlot
# NewReturn is the return of NewMessageSlot
class NewReturn < NewMessageSlot
def initialize type = Unknown, value = nil
super( type , value )
end
end
# NextSelf is the self of NextMessageSlot
class NextSelf < NextMessageSlot
# NewSelf is the self of NewMessageSlot
class NewSelf < NewMessageSlot
def initialize type = Unknown, value = nil
super( type , value )
end
end
# NextMessageName of the next message
class NextMessageName < NextMessageSlot
# NewMessageName of the next message
class NewMessageName < NewMessageSlot
def initialize type = Unknown, value = nil
super( type , value )
end
end
# NewMessageName of the next message
class NewArgSlot < NewMessageSlot
def initialize index , type = Unknown, value = nil
@index = index
super( type , value )
end
attr_reader :index
end
end

View File

@ -5,7 +5,7 @@ module Virtual
# want to send a message it puts the new self into the next_message.
#
# The slot in the Message is represented by instances of class Self
# (and slots in the next_message by instances of NextSelf)
# (and slots in the next_message by instances of NewSelf)
#
# Additionally the current Self is represented as it's own top-level object.
# If self is an Object one can refer to it's instance variables as Slots in SelfSlot

View File

@ -9,7 +9,7 @@ module Virtual
# - the message that has been received: MessageSlot
# - the frame of the method that is executing (local variables): FrameSlot
# - self as an object: SelfSlot
# - a message that will be sent, NextMessageSlot
# - a message that will be sent, NewMessageSlot
# additionally frame, self and return are slots in Message and NewMessage