storing method, not just name in message
goes with a rename and other admin
This commit is contained in:
@ -24,11 +24,11 @@ module Register
|
||||
case from
|
||||
when Virtual::Self , Virtual::NewSelf
|
||||
return Register.resolve_index( :message , :receiver)
|
||||
when Virtual::MessageName , Virtual::NewMessageName
|
||||
return Register.resolve_index( :message , :name)
|
||||
when Virtual::MessageMethod , Virtual::NewMessageMethod
|
||||
return Register.resolve_index( :message , :method)
|
||||
when Virtual::NewArgSlot
|
||||
puts "from: #{from.index}"
|
||||
return Register.resolve_index( :message , :name) + from.index
|
||||
return Register.resolve_index( :message , :method) + from.index
|
||||
else
|
||||
raise "not implemented for #{from.class}"
|
||||
end
|
||||
|
@ -2,6 +2,7 @@ require_relative "instruction"
|
||||
require_relative "register_reference"
|
||||
require_relative "assembler"
|
||||
require_relative "passes/frame_implementation"
|
||||
require_relative "passes/message_implementation"
|
||||
require_relative "passes/set_implementation"
|
||||
require_relative "passes/return_implementation"
|
||||
require_relative "passes/call_implementation"
|
||||
|
@ -26,11 +26,11 @@ module Virtual
|
||||
layouts = { :Word => [] ,
|
||||
:List => [] ,
|
||||
# Assumtion is that name is the last of message
|
||||
:Message => [:next_message , :receiver , :frame , :return_address , :return_value,
|
||||
:caller , :name ],
|
||||
:Message => [:next_message , :receiver , :frame , :return_address , :return_value,
|
||||
:caller , :method ],
|
||||
:MetaClass => [],
|
||||
:BinaryCode => [],
|
||||
:Space => [:classes ,:init_message , :next_message ,:next_frame, :syscall_message],
|
||||
:Space => [:classes , :first_message , :syscall_message],
|
||||
:Frame => [:next_frame ],
|
||||
:Layout => [:object_class] ,
|
||||
:Class => [:object_layout ],
|
||||
|
@ -8,7 +8,7 @@ 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 , NewMessageName.new())
|
||||
method.info.add_code Set.new( expession.name.to_sym , NewMessageMethod.new())
|
||||
compiled_args = []
|
||||
expession.args.each_with_index do |arg , i|
|
||||
#compile in the running method, ie before passing control
|
||||
|
@ -7,6 +7,10 @@ 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
|
||||
|
@ -31,8 +31,8 @@ module Virtual
|
||||
end
|
||||
end
|
||||
|
||||
# MessageName of the current message
|
||||
class MessageName < MessageSlot
|
||||
# MessageMethod of the current message
|
||||
class MessageMethod < MessageSlot
|
||||
def initialize type = Unknown, value = nil
|
||||
super( type , value )
|
||||
end
|
||||
|
@ -31,14 +31,14 @@ module Virtual
|
||||
end
|
||||
end
|
||||
|
||||
# NewMessageName of the next message
|
||||
class NewMessageName < NewMessageSlot
|
||||
# NewMessageMethod of the next message
|
||||
class NewMessageMethod < NewMessageSlot
|
||||
def initialize type = Unknown, value = nil
|
||||
super( type , value )
|
||||
end
|
||||
end
|
||||
|
||||
# NewMessageName of the next message
|
||||
# NewMessageMethod of the next message
|
||||
class NewArgSlot < NewMessageSlot
|
||||
def initialize index , type = Unknown, value = nil
|
||||
@index = index
|
Reference in New Issue
Block a user