@Override
  public void generate(Method m) {
    // Optimize code generation for constant loop conditions
    if (condition instanceof ConstantExpression) {
      if (((ConstantBooleanExpression) condition).getBoolean()) {
        // Loop executed just once
        loopStatements.generate(m);
      } else {
        // Infinite loop (unless there is an Exit-Statement somewhere)
        Method.Label loopLabel = Method.newLabel();
        m.setLabel(loopLabel);
        loopStatements.generate(m);
        generateLineNumberInformation(m);
        m.generateInstrGoto(loopLabel);
      }
    } else {
      // Regular loop
      Method.Label loopLabel = Method.newLabel();
      m.setLabel(loopLabel);
      loopStatements.generate(m);
      generateLineNumberInformation(m);
      condition.generateBranchOnFalse(m, loopLabel);
    }

    m.setLabel(exitLabel);
  }
 @Override
 public void generate(Method m) {
   super.generate(m);
   Method.Label trueLabel = Method.newLabel();
   Method.Label contLabel = Method.newLabel();
   leftOperand.type.generateBranchIfCmpLess(m, trueLabel);
   m.generateInstrLdc(0);
   m.generateInstrGoto(contLabel);
   m.setLabel(trueLabel);
   m.generateInstrLdc(1);
   m.setLabel(contLabel);
 }
Beispiel #3
0
  @Override
  public void generateConversion(Method m, Type toType) {
    switch (toType.getKind()) {
      default:
        // COV_NF_START
        Compiler.internalError();
        break;
        // COV_NF_END

      case BOOLEAN:
        m.generateInstrInvokestatic(CONVERSION_HELPERS_INTERNAL_NAME, "double2boolean", "(D)Z");
        break;

      case BYTE:
        m.generateInstrInvokestatic(CONVERSION_HELPERS_INTERNAL_NAME, "double2byte", "(D)B");
        break;

      case SHORT:
        m.generateInstrInvokestatic(CONVERSION_HELPERS_INTERNAL_NAME, "double2short", "(D)S");
        break;

      case INTEGER:
        m.generateInstrD2i();
        break;

      case LONG:
        m.generateInstrD2l();
        break;

      case SINGLE:
        m.generateInstrD2f();
        break;

      case DOUBLE:
        break;

      case STRING:
        generateToString(m);
        break;

      case VARIANT:
        m.generateInstrInvokestatic(
            DOUBLE_VARIANT_INTERNAL_NAME,
            "getDoubleVariant",
            "(D)L" + DOUBLE_VARIANT_INTERNAL_NAME + ";");
        break;
    }
  }
Beispiel #4
0
 @Override
 public void generateBranchIfCmpLess(Method m, Method.Label label) {
   m.generateInstrDcmpg();
   m.generateInstrIflt(label);
 }
Beispiel #5
0
 @Override
 public void generateModulo(Method m) {
   m.generateInstrDrem();
 }
Beispiel #6
0
 @Override
 public void generateExponentiation(Method m) {
   m.generateInstrInvokestatic("java/lang/Math", "pow", "(DD)D");
 }
Beispiel #7
0
 @Override
 public void generateDivision(Method m) {
   m.generateInstrDdiv();
 }
Beispiel #8
0
 @Override
 public void generateIntegerDivision(Method m) {
   m.generateInstrInvokestatic(EXPRESSION_HELPERS_INTERNAL_NAME, "idiv", "(DD)D");
 }
Beispiel #9
0
 @Override
 public void generateDefaultInitializationValue(Method m) {
   m.generateInstrLdc2(0d);
 }
Beispiel #10
0
 @Override
 public void generateStoreLocal(Method m, short varIndex) {
   m.generateInstrDstore(varIndex);
 }
Beispiel #11
0
 @Override
 public void generateNegation(Method m) {
   m.generateInstrDneg();
 }
Beispiel #12
0
 @Override
 public void generateToString(Method m) {
   m.generateInstrInvokestatic("java/lang/Double", "toString", "(D)Ljava/lang/String;");
 }
Beispiel #13
0
 @Override
 public void generateReturn(Method m) {
   m.generateInstrDreturn();
 }
Beispiel #14
0
 @Override
 public void generatePop(Method m) {
   m.generateInstrPop2();
 }
Beispiel #15
0
 @Override
 public void generateConstM1(Method m) {
   m.generateInstrLdc2(-1D);
 }
Beispiel #16
0
 @Override
 public void generateStoreArray(Method m) {
   m.generateInstrDastore();
 }
Beispiel #17
0
 @Override
 public void generateLoadArray(Method m) {
   m.generateInstrDaload();
 }
Beispiel #18
0
 @Override
 public void generateBranchIfCmpGreaterOrEqual(Method m, Method.Label label) {
   m.generateInstrDcmpg();
   m.generateInstrIfge(label);
 }
Beispiel #19
0
 @Override
 public void generateSubtraction(Method m) {
   m.generateInstrDsub();
 }
Beispiel #20
0
 @Override
 public void generateJavaBox(Method m) {
   m.generateInstrInvokestatic("java/lang/Double", "valueOf", "(D)Ljava/lang/Double;");
 }
Beispiel #21
0
 @Override
 public void generateMultiplication(Method m) {
   m.generateInstrDmul();
 }
Beispiel #22
0
 @Override
 public void generateAddition(Method m) {
   m.generateInstrDadd();
 }
Beispiel #23
0
 @Override
 public void generateLoadLocal(Method m, short varIndex) {
   m.generateInstrDload(varIndex);
 }