This commit is contained in:
Torsten Ruger 2014-05-19 21:28:18 +03:00
parent e07682b6a3
commit f34fddd383
4 changed files with 9 additions and 7 deletions

View File

@ -14,18 +14,19 @@ module Ast
save_locals context , into save_locals context , into
call.load_args into call.load_args into
call.do_call into call.do_call into
resore_locals context , into restore_locals context , into
function.return_type
end end
def save_locals context , into def save_locals context , into
into.instance_eval do into.instance_eval do
push [:r0, :r1 , :r2] push [:r1 , :r2 , :r3]
end end
end end
def resore_locals context , into def restore_locals context , into
into.instance_eval do into.instance_eval do
pop [:r0, :r1 , :r2] pop [:r1, :r2 , :r3]
end end
end end

View File

@ -38,7 +38,7 @@ module Ast
body.each do |b| body.each do |b|
compiled = b.compile(context , into) compiled = b.compile(context , into)
function.return_type = compiled function.return_type = compiled
puts "compiled in function #{compiled.inspect}" puts "compiled in function #{compiled.class}"
raise "alarm #{compiled} \n #{b}" unless compiled.is_a? Vm::Word raise "alarm #{compiled} \n #{b}" unless compiled.is_a? Vm::Word
end end
context.locals = parent_locals context.locals = parent_locals

View File

@ -21,7 +21,8 @@ module Elf
binary = program.assemble(StringIO.new ) binary = program.assemble(StringIO.new )
blocks = program.functions.collect{ |f| [f.entry , f.exit , f.body] } # blocks = program.functions.collect{ |f| [f.entry , f.exit , f.body] }
blocks = program.functions.collect{ |f| [f.body] }
blocks += [program.entry , program.exit , program.main] blocks += [program.entry , program.exit , program.main]
blocks.flatten.each do |b| blocks.flatten.each do |b|
add_symbol b.name.to_s , b.position add_symbol b.name.to_s , b.position

View File

@ -5,9 +5,9 @@ def fibonaccit(n) # n == r0
tmp = a # r3 <- r1 tmp = a # r3 <- r1
a = b # r1 <- r2 a = b # r1 <- r2
b = tmp + b # r4 = r2 + r3 (r4 transient) r2 <- r4 b = tmp + b # r4 = r2 + r3 (r4 transient) r2 <- r4
putint(b)
n = n - 1 # r0 <- r2 for call, #call ok n = n - 1 # r0 <- r2 for call, #call ok
end #r5 <- r0 - 1 n=n-1 through r5 tmp end #r5 <- r0 - 1 n=n-1 through r5 tmp
putint(b)
end # r0 <- r5 end # r0 <- r5
fibonaccit( 10 ) fibonaccit( 10 )