while coded
This commit is contained in:
parent
ccf88319e0
commit
8596fb312d
@ -14,15 +14,16 @@ module Ast
|
||||
[:condition, :body]
|
||||
end
|
||||
def compile context , into
|
||||
cond_val = condition.compile(context , into)
|
||||
#set up branches for bodies
|
||||
# jump to end if done
|
||||
ret = into.new_block "#{into.name}_return_#{hash}"
|
||||
while_block = into.new_block "#{into.name}_while_#{hash}"
|
||||
cond_val = condition.compile(context , while_block)
|
||||
while_block.beq ret
|
||||
last = nil
|
||||
body.each do |part|
|
||||
last = part.compile(context , into )
|
||||
last = part.compile(context , while_block )
|
||||
puts "compiled in while #{last.inspect}"
|
||||
end
|
||||
#jump back to test
|
||||
while_block.b while_block
|
||||
return last
|
||||
end
|
||||
end
|
||||
|
@ -21,8 +21,8 @@ module Elf
|
||||
|
||||
binary = program.assemble(StringIO.new )
|
||||
|
||||
# blocks = program.functions.collect{ |f| [f.entry , f.exit , f.body] }
|
||||
blocks = program.functions.collect{ |f| [f.entry] }
|
||||
blocks = []
|
||||
program.functions.each {|f| blocks += f.blocks }
|
||||
blocks += [program.entry , program.exit , program.main]
|
||||
blocks.flatten.each do |b|
|
||||
add_symbol b.name.to_s , b.position
|
||||
|
@ -73,6 +73,17 @@ module Vm
|
||||
block
|
||||
end
|
||||
|
||||
# return a list of the blocks that are addressable, ie entry and @blocks and all next
|
||||
def blocks
|
||||
ret = []
|
||||
(@blocks << @entry).each do |b|
|
||||
while b
|
||||
ret << b
|
||||
b = b.next
|
||||
end
|
||||
end
|
||||
ret
|
||||
end
|
||||
# following id the Code interface
|
||||
|
||||
# to link we link the entry and then any blocks. The entry links the straight line
|
||||
|
Loading…
Reference in New Issue
Block a user