rubyx/lib/ast/while_expression.rb
2014-07-25 10:49:34 +03:00

52 lines
1.5 KiB
Ruby

module Ast
class WhileExpression < Expression
# attr_reader :condition, :body
def compile method , message
start = Virtual::Label.new("while_start")
method.add start
is = condition.compile(method,message)
branch = Virtual::ImplicitBranch.new "while"
merge = Virtual::Label.new(branch.name)
branch.other = merge #false jumps to end of while
method.add branch
last = is
body.each do |part|
last = part.compile(method,message )
raise part.inspect if last.nil?
end
# unconditionally brnach to the start
merge.next = method.current.next
method.current.next = start
# here we add the end of while that the branch jumps to
#but don't link it in (not using add)
method.current = merge
last
end
def old
into = context.function
ret = into.new_block "while_end"
while_block = into.new_block "while_start"
into.insert_at while_block
puts "compiling while condition #{condition}"
cond_val = condition.compile(context)
into.b ret , condition_code: cond_val.not_operator
into.insertion_point.branch = ret
last = nil
body.each do |part|
puts "compiling in while #{part}"
last = part.compile(context)
end
into.b while_block
into.insertion_point.branch = while_block
puts "compile while end"
into.insert_at ret
return last
end
end
end