module Soml
  Compiler.class_eval do

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

      condition_label = Register::Label.new(statement , "condition_label")
      # unconditionally branch to the condition upon entering the loop
      add_code Register::Branch.new(statement,condition_label)

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

      # This is where the loop starts, though in subsequent iterations it's in the middle
      add_code condition_label
      reset_regs
      process(condition)

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

      nil # statements don't return anything
    end
  end
end