module Soml
  Compiler.class_eval do

    def on_while_statement statement
      #puts statement.inspect
      branch_type , condition , statements = *statement
      condition = condition.first

      add_code  start = Register::Label.new(statement , "while_start" )

      reset_regs
      process(condition)

      branch_class = Object.const_get "Register::Is#{branch_type.capitalize}"
      # this is where the while ends and both branches meet
      merge = Register::Label.new(statement , "while_merge")
      add_code branch_class.new( condition , merge )

      reset_regs
      process_all(statements)

      # unconditionally branch to the start
      add_code Register::Branch.new(statement,start)

      # continue execution / compiling at the merge block
      add_code merge
      nil # statements don't return anything
    end
  end
end