module Mom

  # The funny thing about the ruby truth is that it is anything but false or nil
  #
  # To implement the normal ruby logic, we check for false or nil and jump
  # to the false branch. true_block follows implicitly
  #
  class TruthCheck < Check
    attr_reader :condition

    def initialize(condition , false_jump)
      super(false_jump)
      @condition  = condition
      raise "condition must be slot_definition #{condition}" unless condition.is_a?(SlotDefinition)
    end

    def to_s
      "TruthCheck #{@condition} -> #{false_jump}"
    end

    def to_risc(compiler)
      false_label = @false_jump.risc_label(compiler)
      builder = compiler.builder("TruthCheck")
      condition_reg = @condition.to_register(compiler,self)
      builder.build do
        object! << Parfait.object_space.false_object
        object.op :- , condition_reg
        if_zero false_label
        object << Parfait.object_space.nil_object
        object.op :- , condition_reg
        if_zero false_label
      end
    end

  end
end