Пример #1
0
 /** Prepares return value. */
 public static void prepareReturnValue(
     MethodVisitor mv, MethodSignatureVisitor msign, int varOffset) {
   varOffset += msign.getAllArgumentsSize();
   switch (msign.getReturnOpcodeType()) {
     case 'V':
       mv.visitInsn(ACONST_NULL);
       break;
     case 'B':
       AsmUtil.valueOfByte(mv);
       break;
     case 'C':
       AsmUtil.valueOfCharacter(mv);
       break;
     case 'S':
       AsmUtil.valueOfShort(mv);
       break;
     case 'I':
       AsmUtil.valueOfInteger(mv);
       break;
     case 'Z':
       AsmUtil.valueOfBoolean(mv);
       break;
     case 'J':
       AsmUtil.valueOfLong(mv);
       break;
     case 'F':
       AsmUtil.valueOfFloat(mv);
       break;
     case 'D':
       AsmUtil.valueOfDouble(mv);
       break;
   }
 }
Пример #2
0
  public static void castToReturnType(MethodVisitor mv, MethodSignatureVisitor msign) {
    final String returnType;

    char returnOpcodeType = msign.getReturnOpcodeType();

    switch (returnOpcodeType) {
      case 'I':
        returnType = AsmUtil.SIGNATURE_JAVA_LANG_INTEGER;
        break;
      case 'J':
        returnType = AsmUtil.SIGNATURE_JAVA_LANG_LONG;
        break;
      case 'S':
        returnType = AsmUtil.SIGNATURE_JAVA_LANG_SHORT;
        break;
      case 'B':
        returnType = AsmUtil.SIGNATURE_JAVA_LANG_BYTE;
        break;
      case 'Z':
        returnType = AsmUtil.SIGNATURE_JAVA_LANG_BOOLEAN;
        break;
      case 'F':
        returnType = AsmUtil.SIGNATURE_JAVA_LANG_FLOAT;
        break;
      case 'D':
        returnType = AsmUtil.SIGNATURE_JAVA_LANG_DOUBLE;
        break;
      case 'C':
        returnType = AsmUtil.SIGNATURE_JAVA_LANG_CHARACTER;
        break;
      case '[':
        returnType = msign.getReturnTypeName();
        break;
      default:
        returnType = msign.getReturnType().replace('.', '/');
        break;
    }

    mv.visitTypeInsn(CHECKCAST, returnType);
  }
Пример #3
0
 public static void loadMethodReturnClass(MethodVisitor mv, MethodSignatureVisitor msign) {
   loadClass(mv, msign.getReturnOpcodeType(), msign.getReturnTypeName());
 }
Пример #4
0
  /** Visits return opcodes. */
  public static void visitReturn(MethodVisitor mv, MethodSignatureVisitor msign, boolean isLast) {
    switch (msign.getReturnOpcodeType()) {
      case 'V':
        if (isLast == true) {
          mv.visitInsn(POP);
        }
        mv.visitInsn(RETURN);
        break;

      case 'B':
        if (isLast == true) {
          mv.visitInsn(DUP);
          Label label = new Label();
          mv.visitJumpInsn(IFNONNULL, label);
          mv.visitInsn(POP);
          mv.visitInsn(ICONST_0);
          mv.visitInsn(IRETURN);
          mv.visitLabel(label);

          AsmUtil.byteValue(mv);
        }
        mv.visitInsn(IRETURN);
        break;

      case 'C':
        if (isLast == true) {
          mv.visitInsn(DUP);
          Label label = new Label();
          mv.visitJumpInsn(IFNONNULL, label);
          mv.visitInsn(POP);
          mv.visitInsn(ICONST_0);
          mv.visitInsn(IRETURN);
          mv.visitLabel(label);

          AsmUtil.charValue(mv);
        }
        mv.visitInsn(IRETURN);
        break;

      case 'S':
        if (isLast == true) {
          mv.visitInsn(DUP);
          Label label = new Label();
          mv.visitJumpInsn(IFNONNULL, label);
          mv.visitInsn(POP);
          mv.visitInsn(ICONST_0);
          mv.visitInsn(IRETURN);
          mv.visitLabel(label);

          AsmUtil.shortValue(mv);
        }
        mv.visitInsn(IRETURN);
        break;

      case 'I':
        if (isLast == true) {
          mv.visitInsn(DUP);
          Label label = new Label();
          mv.visitJumpInsn(IFNONNULL, label);
          mv.visitInsn(POP);
          mv.visitInsn(ICONST_0);
          mv.visitInsn(IRETURN);
          mv.visitLabel(label);

          AsmUtil.intValue(mv);
        }
        mv.visitInsn(IRETURN);
        break;

      case 'Z':
        if (isLast == true) {
          mv.visitInsn(DUP);
          Label label = new Label();
          mv.visitJumpInsn(IFNONNULL, label);
          mv.visitInsn(POP);
          mv.visitInsn(ICONST_0);
          mv.visitInsn(IRETURN);
          mv.visitLabel(label);

          AsmUtil.booleanValue(mv);
        }
        mv.visitInsn(IRETURN);
        break;

      case 'J':
        if (isLast == true) {
          mv.visitInsn(DUP);
          Label label = new Label();
          mv.visitJumpInsn(IFNONNULL, label);
          mv.visitInsn(POP);
          mv.visitInsn(LCONST_0);
          mv.visitInsn(LRETURN);
          mv.visitLabel(label);

          AsmUtil.longValue(mv);
        }
        mv.visitInsn(LRETURN);
        break;

      case 'F':
        if (isLast == true) {
          mv.visitInsn(DUP);
          Label label = new Label();
          mv.visitJumpInsn(IFNONNULL, label);
          mv.visitInsn(POP);
          mv.visitInsn(FCONST_0);
          mv.visitInsn(FRETURN);
          mv.visitLabel(label);

          AsmUtil.floatValue(mv);
        }
        mv.visitInsn(FRETURN);
        break;

      case 'D':
        if (isLast == true) {
          mv.visitInsn(DUP);
          Label label = new Label();
          mv.visitJumpInsn(IFNONNULL, label);
          mv.visitInsn(POP);
          mv.visitInsn(DCONST_0);
          mv.visitInsn(DRETURN);
          mv.visitLabel(label);

          AsmUtil.doubleValue(mv);
        }
        mv.visitInsn(DRETURN);
        break;

      default:
        mv.visitInsn(ARETURN);
        break;
    }
  }