had to revert name method change

method is not known when message is created
This commit is contained in:
Torsten Ruger
2015-07-02 09:48:41 +03:00
parent 7136450bde
commit 11997ef354
8 changed files with 17 additions and 19 deletions

View File

@ -17,7 +17,7 @@ module Parfait
end
attr_reader :next_message , :frame , :caller # aka prev_message
attr_reader :receiver , :return_address , :return_value , :method
attr_reader :receiver , :return_address , :return_value , :name
def set_caller caller
@caller = caller

View File

@ -24,11 +24,13 @@ module Register
case from
when Virtual::Self , Virtual::NewSelf
return Register.resolve_index( :message , :receiver)
when Virtual::MessageMethod , Virtual::NewMessageMethod
return Register.resolve_index( :message , :method)
when Virtual::MessageName , Virtual::NewMessageName
return Register.resolve_index( :message , :name)
when Virtual::Return
return Register.resolve_index( :message , :return_value)
when Virtual::NewArgSlot
puts "from: #{from.index}"
return Register.resolve_index( :message , :method) + from.index
return Register.resolve_index( :message , :name) + from.index
else
raise "not implemented for #{from.class}"
end

View File

@ -27,7 +27,7 @@ module Virtual
:List => [] ,
# Assumtion is that name is the last of message
:Message => [:next_message , :receiver , :frame , :return_address , :return_value,
:caller , :method ],
:caller , :name ],
:MetaClass => [],
:BinaryCode => [],
:Space => [:classes , :first_message , :syscall_message],

View File

@ -8,14 +8,14 @@ module Virtual
me = Compiler.compile( expession.receiver , method )
method.info.add_code NewMessage.new
method.info.add_code Set.new( me , NewSelf.new(me.type))
method.info.add_code Set.new( expession.name.to_sym , NewMessageMethod.new())
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
# + 1 as this is a ruby 0-start , but 0 is the last message ivar.
# so the next free is +1
# so the next free is +1
to = NewArgSlot.new(i + 1 ,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 )

View File

@ -7,10 +7,6 @@ module Virtual
new_codes = []
# save return register to the message at instance return_address
new_codes << Register.save_return(:message , :return_address)
# set the method instance on message, have to load first
tmp = Register.tmp_reg
new_codes << Register::LoadConstant.new( code.method , tmp )
new_codes << Register.set_slot( tmp , :message , :method)
# and create a new frame if needed
unless code.method.locals.empty? and code.method.tmps.empty?
new_codes << Virtual::NewFrame.new

View File

@ -31,8 +31,8 @@ module Virtual
end
end
# MessageMethod of the current message
class MessageMethod < MessageSlot
# MessageName of the current message
class MessageName < MessageSlot
def initialize type = Unknown, value = nil
super( type , value )
end

View File

@ -31,14 +31,14 @@ module Virtual
end
end
# NewMessageMethod of the next message
class NewMessageMethod < NewMessageSlot
# NewMessageName of the next message
class NewMessageName < NewMessageSlot
def initialize type = Unknown, value = nil
super( type , value )
end
end
# NewMessageMethod of the next message
# NewMessageName of the next message
class NewArgSlot < NewMessageSlot
def initialize index , type = Unknown, value = nil
@index = index