Class: Java::OrgJrubyAst::WhileNode

Inherits:
Object
  • Object
show all
Defined in:
lib/duby/old/compiler_old.rb

Instance Method Summary collapse

Instance Method Details

#compile(builder) ⇒ Object



749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
# File 'lib/duby/old/compiler_old.rb', line 749

def compile(builder)
  begin_lbl = builder.label
  end_lbl = builder.label
  cond_lbl = builder.label
  
  case body_node.type(builder)
  when Jint
    builder.iconst_0
  else
    builder.aconst_null
  end
  
  if evaluate_at_start
    builder.goto cond_lbl
  end
  
  begin_lbl.set!
  builder.pop
  body_node.compile(builder)
  
  cond_lbl.set!
  compile_condition(builder, begin_lbl)
  end_lbl.set!
end

#compile_condition(builder, begin_lbl) ⇒ Object



774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
# File 'lib/duby/old/compiler_old.rb', line 774

def compile_condition(builder, begin_lbl)
  condition = condition_node
  condition = condition.next_node while NewlineNode === condition
  
  case condition
  when CallNode
    args = condition.args_node
    receiver_type = condition.receiver_node.type(builder)
    
    if receiver_type.primitive?
      case condition.name
      when "<"
        raise CompileError.new(position, "Primitive < must have exactly one argument") if !args || args.size != 1

        condition.receiver_node.compile(builder)
        args.get(0).compile(builder)

        case receiver_type
        when Jint
          builder.if_icmplt(begin_lbl)
        else
          raise CompileError.new(position, "Primitive < is only supported for int")
        end
      when ">"
        raise CompileError.new(position, "Primitive > must have exactly one argument") if !args || args.size != 1

        condition.receiver_node.compile(builder)
        args.get(0).compile(builder)

        case receiver_type
        when Jint
          builder.if_icmpgt(begin_lbl)
        else
          raise CompileError.new(position, "Primitive < is only supported for int")
        end
      else
        raise CompileError.new(position, "Conditional not supported: #{condition.inspect}")
      end
    else
      raise CompileError.new(position, "Conditional on non-primitives not supported: #{condition.inspect}")
    end
  else
    raise CompileError.new(position, "Non-call conditional not supported: #{condition.inspect}")
  end
end