seperate args from message (just like frame)

This commit is contained in:
Torsten Ruger
2016-12-21 22:35:36 +02:00
parent ed12108425
commit c3c52d36b8
12 changed files with 46 additions and 70 deletions

View File

@ -117,7 +117,7 @@ module Register
:List => {:indexed_length => :Integer} ,
:Message => { :next_message => :Message, :receiver => :Object, :locals => :NamedList ,
:return_address => :Integer, :return_value => :Integer,
:caller => :Message , :name => :Word , :indexed_length => :Integer },
:caller => :Message , :name => :Word , :arguments => :NamedList },
:MetaClass => {:object => :Object},
:Integer => {},
:Object => {},

View File

@ -3,12 +3,12 @@ module Register
module Builtin
module CompileHelper
def self_and_arg(compiler , source)
def self_and_int_arg(compiler , source)
#Load self by "calling" on_name
me = compiler.process( Typed::Tree::NameExpression.new( :self) )
# Load the argument
index = compiler.use_reg :Integer
compiler.add_code Register.get_slot(source , :message , Parfait::Message.get_indexed(1), index )
compiler.add_code Register.get_slot(source , :message , 1 , index )
return me , index
end
@ -18,9 +18,9 @@ module Register
end
# Load the value
def do_load(compiler, source)
def load_arg_at(compiler, source , at)
value = compiler.use_reg :Integer
compiler.add_code Register.get_slot(source , :message , Parfait::Message.get_indexed(2), value )
compiler.add_code Register.get_slot(source , :message , at , value )
value
end

View File

@ -12,7 +12,7 @@ module Register
def get_internal_word context
compiler = compiler_for(:Object , :get_internal_word )
source = "get_internal_word"
me , index = self_and_arg(compiler,source)
me , index = self_and_int_arg(compiler,source)
# reduce me to me[index]
compiler.add_code GetSlot.new( source , me , index , me)
# and put it back into the return value
@ -25,8 +25,8 @@ module Register
def set_internal_word context
compiler = compiler_for(:Object , :set_internal_word , {:value => :Object} )
source = "set_internal_word"
me , index = self_and_arg(compiler,source)
value = do_load(compiler,source)
me , index = self_and_int_arg(compiler,source)
value = load_arg_at(compiler,source , 2)
# do the set
compiler.add_code SetSlot.new( source , value , me , index)

View File

@ -21,7 +21,7 @@ module Register
def get_internal_byte context
compiler = compiler_for(:Word , :get_internal_byte)
source = "get_internal_byte"
me , index = self_and_arg(compiler,source)
me , index = self_and_int_arg(compiler,source)
# reduce me to me[index]
compiler.add_code GetByte.new( source , me , index , me)
# and put it back into the return value
@ -35,8 +35,8 @@ module Register
def set_internal_byte context
compiler = compiler_for(:Word, :set_internal_byte , {:value => :Integer} )
source = "set_internal_byte"
me , index = self_and_arg(compiler,source)
value = do_load(compiler,source)
me , index = self_and_int_arg(compiler,source)
value = load_arg_at(compiler , source , 2 )
# do the set
compiler.add_code SetByte.new( source , value , me , index)
return compiler.method