function now returns locals, not free registers

This commit is contained in:
Torsten Ruger
2014-05-21 16:42:36 +03:00
parent e1f889fd10
commit 2df2dcc528
7 changed files with 22 additions and 26 deletions

View File

@ -20,14 +20,15 @@ module Vm
class Block < Code
def initialize(name)
def initialize(name , function)
super()
@function = function
@name = name.to_sym
@next = nil
@codes = []
end
attr_reader :name , :next , :codes
attr_reader :name , :next , :codes , :function
def length
@codes.inject(0) {| sum , item | sum + item.length}

View File

@ -37,15 +37,10 @@ module Vm
else
@return_type = @return_type.new(0)
end
@entry = Core::Kernel::function_entry( Vm::Block.new("#{name}_entry") ,name )
@exit = Core::Kernel::function_exit( Vm::Block.new("#{name}_exit") , name )
@body = Block.new("#{name}_body")
@reg_count = 0
branch_body
@entry = Core::Kernel::function_entry( Vm::Block.new("#{name}_entry") ,name )
@exit = Core::Kernel::function_exit( Vm::Block.new("#{name}_exit") , name )
@body = Block.new("#{name}_body")
@reg_count = 0
@entry = Core::Kernel::function_entry( Vm::Block.new("#{name}_entry" , self) ,name )
@exit = Core::Kernel::function_exit( Vm::Block.new("#{name}_exit", self) , name )
@body = Block.new("#{name}_body", self)
@locals = []
branch_body
end
attr_reader :args , :entry , :exit , :body , :name
@ -55,10 +50,11 @@ module Vm
@args.length
end
def next_register
next_free = @reg_count
@reg_count += 1
next_free + args.length
def new_local type = Vm::Integer
register = args.length + @locals.length
l = type.new(register)
@locals << l
l
end
def link_at address , context

View File

@ -23,7 +23,7 @@ module Vm
# Initialize with a string for cpu. Naming conventions are: for Machine XXX there exists a module XXX
# with a XXXMachine in it that derives from Vm::CMachine
def initialize machine = nil
super("start")
super("start" , nil)
machine = RbConfig::CONFIG["host_cpu"] unless machine
machine = "intel" if machine == "x86_64"
machine = machine.capitalize
@ -33,10 +33,10 @@ module Vm
@objects = []
# global functions
@functions = []
@entry = Core::Kernel::main_start Vm::Block.new("main_entry")
@entry = Core::Kernel::main_start Vm::Block.new("main_entry",nil)
#main gets executed between entry and exit
@main = Block.new("main")
@exit = Core::Kernel::main_exit Vm::Block.new("main_exit")
@main = Block.new("main",nil)
@exit = Core::Kernel::main_exit Vm::Block.new("main_exit",nil)
end
attr_reader :context , :main , :functions , :entry , :exit