module Soml Compiler.class_eval do # an if evaluates the condition and jumps to the true block if true # so the else block is automatically after that. # But then the else needs to jump over the true block unconditionally. def on_if_statement statement branch_type , condition , if_true , if_false = *statement condition = condition.first reset_regs process(condition) branch_class = Object.const_get "Register::Is#{branch_type.capitalize}" true_block = Register::Label.new(if_true, "if_true") add_code branch_class.new( condition , true_block ) # compile the false block reset_regs process_all(if_false) if if_false merge = Register::Label.new(statement , "if_merge") add_code Register::Branch.new(if_false, merge ) # compile the true block add_code true_block reset_regs process_all(if_true) #puts "compiled if: end" add_code merge nil # statements don't return anything end end end