moved registers to machine, changed return to 0 (from 7) and erased all integer references to registers
This commit is contained in:
@ -27,27 +27,24 @@ module Vm
|
||||
|
||||
class Function < Code
|
||||
|
||||
TYPE_REG = :r0
|
||||
RECEIVER_REG = :r1
|
||||
RETURN_REG = :r7
|
||||
|
||||
def initialize(name , receiver = Vm::Integer , args = [] , return_type = Vm::Integer)
|
||||
super()
|
||||
@name = name.to_sym
|
||||
if receiver.is_a?(Value)
|
||||
@receiver = receiver
|
||||
raise "arg in non std register #{arg.inspect}" unless RECEIVER_REG == receiver.register_symbol
|
||||
raise "arg in non std register #{receiver.inspect}" unless RegisterMachine.instance.receiver_register == receiver.register_symbol
|
||||
else
|
||||
@receiver = receiver.new(RECEIVER_REG)
|
||||
@receiver = receiver.new(RegisterMachine.instance.receiver_register)
|
||||
end
|
||||
|
||||
@args = Array.new(args.length)
|
||||
args.each_with_index do |arg , i|
|
||||
shouldda = RegisterUse.new(RegisterMachine.instance.receiver_register).next_reg_use(i + 1)
|
||||
if arg.is_a?(Value)
|
||||
@args[i] = arg
|
||||
raise "arg #{i}in non std register #{arg.inspect}" unless RECEIVER_REG == arg.used_register.next_reg(-1-i)
|
||||
raise "arg #{i} in non std register #{arg.used_register}, expecting #{shouldda}" unless shouldda == arg.used_register
|
||||
else
|
||||
@args[i] = arg.new(RegisterUse.new(RECEIVER_REG).next_reg(i + 1))
|
||||
@args[i] = arg.new(shouldda)
|
||||
end
|
||||
end
|
||||
set_return return_type
|
||||
@ -64,9 +61,9 @@ module Vm
|
||||
def set_return type_or_value
|
||||
@return_type = type_or_value || Vm::Integer
|
||||
if @return_type.is_a?(Value)
|
||||
raise "return in non std register #{@return_type.inspect}" unless RETURN_REG == @return_type.register_symbol
|
||||
raise "return in non std register #{@return_type.inspect}" unless RegisterMachine.instance.return_register == @return_type.register_symbol
|
||||
else
|
||||
@return_type = @return_type.new(RETURN_REG)
|
||||
@return_type = @return_type.new(RegisterMachine.instance.return_register)
|
||||
end
|
||||
end
|
||||
def arity
|
||||
|
@ -63,13 +63,17 @@ module Vm
|
||||
@symbol = r
|
||||
end
|
||||
|
||||
#helper methods to calculate with register symbols
|
||||
def next_reg by = 1
|
||||
int = @symbol[1,3].to_i
|
||||
"r#{int + by}".to_sym
|
||||
def == other
|
||||
return false if other.nil?
|
||||
return false if other.class != RegisterUse
|
||||
symbol == other.symbol
|
||||
end
|
||||
|
||||
#helper method to calculate with register symbols
|
||||
def next_reg_use by = 1
|
||||
RegisterUse.new( next_reg(by) )
|
||||
int = @symbol[1,3].to_i
|
||||
sym = "r#{int + by}".to_sym
|
||||
RegisterUse.new( sym )
|
||||
end
|
||||
end
|
||||
|
||||
@ -152,7 +156,7 @@ module Vm
|
||||
block.mov( self , right ) #move the value
|
||||
elsif right.is_a? StringConstant
|
||||
block.add( self , right , nil) #move the address, by "adding" to pc, ie pc relative
|
||||
block.mov( Integer.new(self.used_register.next_reg) , right.length ) #and the length HACK TODO
|
||||
block.mov( Integer.new(self.used_register.next_reg_use) , right.length ) #and the length HACK TODO
|
||||
elsif right.is_a?(BootClass) or right.is_a?(MetaClass)
|
||||
block.add( self , right , nil) #move the address, by "adding" to pc, ie pc relative
|
||||
else
|
||||
|
Reference in New Issue
Block a user