had to revert name method change
method is not known when message is created
This commit is contained in:
parent
7136450bde
commit
11997ef354
@ -17,7 +17,7 @@ module Parfait
|
|||||||
end
|
end
|
||||||
|
|
||||||
attr_reader :next_message , :frame , :caller # aka prev_message
|
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
|
def set_caller caller
|
||||||
@caller = caller
|
@caller = caller
|
||||||
|
@ -24,11 +24,13 @@ module Register
|
|||||||
case from
|
case from
|
||||||
when Virtual::Self , Virtual::NewSelf
|
when Virtual::Self , Virtual::NewSelf
|
||||||
return Register.resolve_index( :message , :receiver)
|
return Register.resolve_index( :message , :receiver)
|
||||||
when Virtual::MessageMethod , Virtual::NewMessageMethod
|
when Virtual::MessageName , Virtual::NewMessageName
|
||||||
return Register.resolve_index( :message , :method)
|
return Register.resolve_index( :message , :name)
|
||||||
|
when Virtual::Return
|
||||||
|
return Register.resolve_index( :message , :return_value)
|
||||||
when Virtual::NewArgSlot
|
when Virtual::NewArgSlot
|
||||||
puts "from: #{from.index}"
|
puts "from: #{from.index}"
|
||||||
return Register.resolve_index( :message , :method) + from.index
|
return Register.resolve_index( :message , :name) + from.index
|
||||||
else
|
else
|
||||||
raise "not implemented for #{from.class}"
|
raise "not implemented for #{from.class}"
|
||||||
end
|
end
|
||||||
|
@ -27,7 +27,7 @@ module Virtual
|
|||||||
:List => [] ,
|
:List => [] ,
|
||||||
# Assumtion is that name is the last of message
|
# Assumtion is that name is the last of message
|
||||||
:Message => [:next_message , :receiver , :frame , :return_address , :return_value,
|
:Message => [:next_message , :receiver , :frame , :return_address , :return_value,
|
||||||
:caller , :method ],
|
:caller , :name ],
|
||||||
:MetaClass => [],
|
:MetaClass => [],
|
||||||
:BinaryCode => [],
|
:BinaryCode => [],
|
||||||
:Space => [:classes , :first_message , :syscall_message],
|
:Space => [:classes , :first_message , :syscall_message],
|
||||||
|
@ -8,14 +8,14 @@ module Virtual
|
|||||||
me = Compiler.compile( expession.receiver , method )
|
me = Compiler.compile( expession.receiver , method )
|
||||||
method.info.add_code NewMessage.new
|
method.info.add_code NewMessage.new
|
||||||
method.info.add_code Set.new( me , NewSelf.new(me.type))
|
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 = []
|
compiled_args = []
|
||||||
expession.args.each_with_index do |arg , i|
|
expession.args.each_with_index do |arg , i|
|
||||||
#compile in the running method, ie before passing control
|
#compile in the running method, ie before passing control
|
||||||
val = Compiler.compile( arg , method)
|
val = Compiler.compile( arg , method)
|
||||||
# move the compiled value to it's slot in the new message
|
# 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.
|
# + 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)
|
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)
|
# (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 )
|
method.info.add_code Set.new( val , to )
|
||||||
|
@ -7,10 +7,6 @@ module Virtual
|
|||||||
new_codes = []
|
new_codes = []
|
||||||
# save return register to the message at instance return_address
|
# save return register to the message at instance return_address
|
||||||
new_codes << Register.save_return(:message , :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
|
# and create a new frame if needed
|
||||||
unless code.method.locals.empty? and code.method.tmps.empty?
|
unless code.method.locals.empty? and code.method.tmps.empty?
|
||||||
new_codes << Virtual::NewFrame.new
|
new_codes << Virtual::NewFrame.new
|
||||||
|
@ -31,8 +31,8 @@ module Virtual
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# MessageMethod of the current message
|
# MessageName of the current message
|
||||||
class MessageMethod < MessageSlot
|
class MessageName < MessageSlot
|
||||||
def initialize type = Unknown, value = nil
|
def initialize type = Unknown, value = nil
|
||||||
super( type , value )
|
super( type , value )
|
||||||
end
|
end
|
||||||
|
@ -31,14 +31,14 @@ module Virtual
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# NewMessageMethod of the next message
|
# NewMessageName of the next message
|
||||||
class NewMessageMethod < NewMessageSlot
|
class NewMessageName < NewMessageSlot
|
||||||
def initialize type = Unknown, value = nil
|
def initialize type = Unknown, value = nil
|
||||||
super( type , value )
|
super( type , value )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# NewMessageMethod of the next message
|
# NewMessageName of the next message
|
||||||
class NewArgSlot < NewMessageSlot
|
class NewArgSlot < NewMessageSlot
|
||||||
def initialize index , type = Unknown, value = nil
|
def initialize index , type = Unknown, value = nil
|
||||||
@index = index
|
@index = index
|
||||||
|
@ -20,7 +20,7 @@ def foo()
|
|||||||
end
|
end
|
||||||
foo()
|
foo()
|
||||||
HERE
|
HERE
|
||||||
@output = "-&7 Parfait::Method(:name => 'foo', :code => '')*^* :memory -0*^* -&1 ['name', 'code', 'arg_names', 'locals', 'tmps']*^* :arg_names []*^* :locals []*^* :tmps []*^* :info Virtual::CompiledMethodInfo()*^* :return_type Virtual::Return(:index => 5, :type => *6)*^* :blocks -Virtual::Block(:length => -1, :name => :enter)*^* :codes -Virtual::MethodEnter()*^* -Virtual::NewMessage()*^* -Virtual::Set()*^* :to Virtual::NewSelf(:index => 3)*^* :type &15 Virtual::Reference(:of_class => *2)*^* :from &17 Virtual::Self(:index => 3)*^* :type &15 Virtual::Reference(:of_class => *2)*^* -Virtual::Set(:from => 'puts')*^* :to Virtual::NewMessageMethod(:index => 4, :type => *6)*^* -Virtual::Set(:from => 'Hello')*^* :to &16 Virtual::Return(:index => 5, :type => &5 Virtual::Reference, :value => 'Hello')*^* -Virtual::Set()*^* :to &18 Virtual::NewMessageSlot(:index => 0, :type => &5 Virtual::Reference, :value => *16)*^* :from &16 Virtual::Return(:index => 5, :type => &5 Virtual::Reference, :value => 'Hello')*^* -Virtual::MessageSend(:name => :puts)*^* :me &17 Virtual::Self(:index => 3)*^* :type &15 Virtual::Reference(:of_class => *2)*^* :args [*18]*^* -Virtual::Block(:length => -1, :name => :return)*^* :codes [Virtual::MethodReturn()]*^* :receiver Virtual::Self(:index => 3, :type => *6)*^*-Virtual::Return(:index => 5, :type => &6 Virtual::Unknown)"
|
@output = "-&7 Parfait::Method(:name => 'foo', :code => '')*^* :memory -0*^* -&1 ['name', 'code', 'arg_names', 'locals', 'tmps']*^* :arg_names []*^* :locals []*^* :tmps []*^* :info Virtual::CompiledMethodInfo()*^* :return_type Virtual::Return(:index => 5, :type => *6)*^* :blocks -Virtual::Block(:length => -1, :name => :enter)*^* :codes -Virtual::MethodEnter()*^* -Virtual::NewMessage()*^* -Virtual::Set()*^* :to Virtual::NewSelf(:index => 3)*^* :type &15 Virtual::Reference(:of_class => *2)*^* :from &17 Virtual::Self(:index => 3)*^* :type &15 Virtual::Reference(:of_class => *2)*^* -Virtual::Set(:from => 'puts')*^* :to Virtual::NewMessageName(:index => 4, :type => *6)*^* -Virtual::Set(:from => 'Hello')*^* :to &16 Virtual::Return(:index => 5, :type => &5 Virtual::Reference, :value => 'Hello')*^* -Virtual::Set()*^* :to &18 Virtual::NewMessageSlot(:index => 0, :type => &5 Virtual::Reference, :value => *16)*^* :from &16 Virtual::Return(:index => 5, :type => &5 Virtual::Reference, :value => 'Hello')*^* -Virtual::MessageSend(:name => :puts)*^* :me &17 Virtual::Self(:index => 3)*^* :type &15 Virtual::Reference(:of_class => *2)*^* :args [*18]*^* -Virtual::Block(:length => -1, :name => :return)*^* :codes [Virtual::MethodReturn()]*^* :receiver Virtual::Self(:index => 3, :type => *6)*^*-Virtual::Return(:index => 5, :type => &6 Virtual::Unknown)"
|
||||||
check
|
check
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -41,7 +41,7 @@ def foo(x)
|
|||||||
2 + 5
|
2 + 5
|
||||||
end
|
end
|
||||||
HERE
|
HERE
|
||||||
@output = "-&7 Parfait::Method(:name => 'foo', :code => '')*^* :memory -0*^* -&1 ['name', 'code', 'arg_names', 'locals', 'tmps']*^* :arg_names [:x]*^* :locals ['abba']*^* :tmps []*^* :info Virtual::CompiledMethodInfo()*^* :return_type Virtual::Return(:index => 5, :type => &6 Virtual::Unknown)*^* :blocks -Virtual::Block(:length => -1, :name => :enter)*^* :codes -Virtual::MethodEnter()*^* -Virtual::Set()*^* :to &16 Virtual::Return(:index => 5, :type => &9 Virtual::Integer, :value => *15)*^* :from &15 Virtual::IntegerConstant(:integer => 5)*^* -Virtual::Set()*^* :to Virtual::Return(:index => 5, :type => *6)*^* :from Virtual::FrameSlot(:index => 1, :type => &9 Virtual::Integer, :value => *16)*^* -Virtual::Set()*^* :to &18 Virtual::Return(:index => 5, :type => &9 Virtual::Integer, :value => *17)*^* :from &17 Virtual::IntegerConstant(:integer => 2)*^* -Virtual::NewMessage()*^* -Virtual::Set()*^* :to Virtual::NewSelf(:index => 3, :type => &9 Virtual::Integer)*^* :from &18 Virtual::Return(:index => 5, :type => &9 Virtual::Integer, :value => *17)*^* -Virtual::Set(:from => '+')*^* :to Virtual::NewMessageMethod(:index => 4, :type => *6)*^* -Virtual::Set()*^* :to &20 Virtual::Return(:index => 5, :type => &9 Virtual::Integer, :value => *19)*^* :from &19 Virtual::IntegerConstant(:integer => 5)*^* -Virtual::Set()*^* :to &21 Virtual::NewMessageSlot(:index => 0, :type => &9 Virtual::Integer, :value => *20)*^* :from &20 Virtual::Return(:index => 5, :type => &9 Virtual::Integer, :value => *19)*^* -Virtual::MessageSend(:name => :+)*^* :me &18 Virtual::Return(:index => 5, :type => &9 Virtual::Integer, :value => *17)*^* :args [*21]*^* -Virtual::Block(:length => -1, :name => :return)*^* :codes [Virtual::MethodReturn()]*^* :receiver Virtual::Self(:index => 3, :type => &6 Virtual::Unknown)"
|
@output = "-&7 Parfait::Method(:name => 'foo', :code => '')*^* :memory -0*^* -&1 ['name', 'code', 'arg_names', 'locals', 'tmps']*^* :arg_names [:x]*^* :locals ['abba']*^* :tmps []*^* :info Virtual::CompiledMethodInfo()*^* :return_type Virtual::Return(:index => 5, :type => &6 Virtual::Unknown)*^* :blocks -Virtual::Block(:length => -1, :name => :enter)*^* :codes -Virtual::MethodEnter()*^* -Virtual::Set()*^* :to &16 Virtual::Return(:index => 5, :type => &9 Virtual::Integer, :value => *15)*^* :from &15 Virtual::IntegerConstant(:integer => 5)*^* -Virtual::Set()*^* :to Virtual::Return(:index => 5, :type => *6)*^* :from Virtual::FrameSlot(:index => 1, :type => &9 Virtual::Integer, :value => *16)*^* -Virtual::Set()*^* :to &18 Virtual::Return(:index => 5, :type => &9 Virtual::Integer, :value => *17)*^* :from &17 Virtual::IntegerConstant(:integer => 2)*^* -Virtual::NewMessage()*^* -Virtual::Set()*^* :to Virtual::NewSelf(:index => 3, :type => &9 Virtual::Integer)*^* :from &18 Virtual::Return(:index => 5, :type => &9 Virtual::Integer, :value => *17)*^* -Virtual::Set(:from => '+')*^* :to Virtual::NewMessageName(:index => 4, :type => *6)*^* -Virtual::Set()*^* :to &20 Virtual::Return(:index => 5, :type => &9 Virtual::Integer, :value => *19)*^* :from &19 Virtual::IntegerConstant(:integer => 5)*^* -Virtual::Set()*^* :to &21 Virtual::NewMessageSlot(:index => 0, :type => &9 Virtual::Integer, :value => *20)*^* :from &20 Virtual::Return(:index => 5, :type => &9 Virtual::Integer, :value => *19)*^* -Virtual::MessageSend(:name => :+)*^* :me &18 Virtual::Return(:index => 5, :type => &9 Virtual::Integer, :value => *17)*^* :args [*21]*^* -Virtual::Block(:length => -1, :name => :return)*^* :codes [Virtual::MethodReturn()]*^* :receiver Virtual::Self(:index => 3, :type => &6 Virtual::Unknown)"
|
||||||
check
|
check
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -51,7 +51,7 @@ def foo()
|
|||||||
2 + 5
|
2 + 5
|
||||||
end
|
end
|
||||||
HERE
|
HERE
|
||||||
@output = "-&7 Parfait::Method(:name => 'foo', :code => '')*^* :memory -0*^* -&1 ['name', 'code', 'arg_names', 'locals', 'tmps']*^* :arg_names []*^* :locals []*^* :tmps []*^* :info Virtual::CompiledMethodInfo()*^* :return_type Virtual::Return(:index => 5, :type => &6 Virtual::Unknown)*^* :blocks -Virtual::Block(:length => -1, :name => :enter)*^* :codes -Virtual::MethodEnter()*^* -Virtual::Set()*^* :to &16 Virtual::Return(:index => 5, :type => &9 Virtual::Integer, :value => *15)*^* :from &15 Virtual::IntegerConstant(:integer => 2)*^* -Virtual::NewMessage()*^* -Virtual::Set()*^* :to Virtual::NewSelf(:index => 3, :type => &9 Virtual::Integer)*^* :from &16 Virtual::Return(:index => 5, :type => &9 Virtual::Integer, :value => *15)*^* -Virtual::Set(:from => '+')*^* :to Virtual::NewMessageMethod(:index => 4, :type => *6)*^* -Virtual::Set()*^* :to &18 Virtual::Return(:index => 5, :type => &9 Virtual::Integer, :value => *17)*^* :from &17 Virtual::IntegerConstant(:integer => 5)*^* -Virtual::Set()*^* :to &19 Virtual::NewMessageSlot(:index => 0, :type => &9 Virtual::Integer, :value => *18)*^* :from &18 Virtual::Return(:index => 5, :type => &9 Virtual::Integer, :value => *17)*^* -Virtual::MessageSend(:name => :+)*^* :me &16 Virtual::Return(:index => 5, :type => &9 Virtual::Integer, :value => *15)*^* :args [*19]*^* -Virtual::Block(:length => -1, :name => :return)*^* :codes [Virtual::MethodReturn()]*^* :receiver Virtual::Self(:index => 3, :type => &6 Virtual::Unknown)"
|
@output = "-&7 Parfait::Method(:name => 'foo', :code => '')*^* :memory -0*^* -&1 ['name', 'code', 'arg_names', 'locals', 'tmps']*^* :arg_names []*^* :locals []*^* :tmps []*^* :info Virtual::CompiledMethodInfo()*^* :return_type Virtual::Return(:index => 5, :type => &6 Virtual::Unknown)*^* :blocks -Virtual::Block(:length => -1, :name => :enter)*^* :codes -Virtual::MethodEnter()*^* -Virtual::Set()*^* :to &16 Virtual::Return(:index => 5, :type => &9 Virtual::Integer, :value => *15)*^* :from &15 Virtual::IntegerConstant(:integer => 2)*^* -Virtual::NewMessage()*^* -Virtual::Set()*^* :to Virtual::NewSelf(:index => 3, :type => &9 Virtual::Integer)*^* :from &16 Virtual::Return(:index => 5, :type => &9 Virtual::Integer, :value => *15)*^* -Virtual::Set(:from => '+')*^* :to Virtual::NewMessageName(:index => 4, :type => *6)*^* -Virtual::Set()*^* :to &18 Virtual::Return(:index => 5, :type => &9 Virtual::Integer, :value => *17)*^* :from &17 Virtual::IntegerConstant(:integer => 5)*^* -Virtual::Set()*^* :to &19 Virtual::NewMessageSlot(:index => 0, :type => &9 Virtual::Integer, :value => *18)*^* :from &18 Virtual::Return(:index => 5, :type => &9 Virtual::Integer, :value => *17)*^* -Virtual::MessageSend(:name => :+)*^* :me &16 Virtual::Return(:index => 5, :type => &9 Virtual::Integer, :value => *15)*^* :args [*19]*^* -Virtual::Block(:length => -1, :name => :return)*^* :codes [Virtual::MethodReturn()]*^* :receiver Virtual::Self(:index => 3, :type => &6 Virtual::Unknown)"
|
||||||
check
|
check
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user