예제 #1
0
 @Override
 public BasicValue newOperation(final AbstractInsnNode insn) throws AnalyzerException {
   switch (insn.getOpcode()) {
     case ACONST_NULL:
       return newValue(Type.getObjectType("null"));
     case ICONST_M1:
     case ICONST_0:
     case ICONST_1:
     case ICONST_2:
     case ICONST_3:
     case ICONST_4:
     case ICONST_5:
       return BasicValue.INT_VALUE;
     case LCONST_0:
     case LCONST_1:
       return BasicValue.LONG_VALUE;
     case FCONST_0:
     case FCONST_1:
     case FCONST_2:
       return BasicValue.FLOAT_VALUE;
     case DCONST_0:
     case DCONST_1:
       return BasicValue.DOUBLE_VALUE;
     case BIPUSH:
     case SIPUSH:
       return BasicValue.INT_VALUE;
     case LDC:
       Object cst = ((LdcInsnNode) insn).cst;
       if (cst instanceof Integer) {
         return BasicValue.INT_VALUE;
       } else if (cst instanceof Float) {
         return BasicValue.FLOAT_VALUE;
       } else if (cst instanceof Long) {
         return BasicValue.LONG_VALUE;
       } else if (cst instanceof Double) {
         return BasicValue.DOUBLE_VALUE;
       } else if (cst instanceof String) {
         return newValue(Type.getObjectType("java/lang/String"));
       } else if (cst instanceof Type) {
         int sort = ((Type) cst).getSort();
         if (sort == Type.OBJECT || sort == Type.ARRAY) {
           return newValue(Type.getObjectType("java/lang/Class"));
         } else if (sort == Type.METHOD) {
           return newValue(Type.getObjectType("java/lang/invoke/MethodType"));
         } else {
           throw new IllegalArgumentException("Illegal LDC constant " + cst);
         }
       } else if (cst instanceof Handle) {
         return newValue(Type.getObjectType("java/lang/invoke/MethodHandle"));
       } else {
         throw new IllegalArgumentException("Illegal LDC constant " + cst);
       }
     case JSR:
       return BasicValue.RETURNADDRESS_VALUE;
     case GETSTATIC:
       return newValue(Type.getType(((FieldInsnNode) insn).desc));
     case NEW:
       return newValue(Type.getObjectType(((TypeInsnNode) insn).desc));
     default:
       throw new Error("Internal error.");
   }
 }
예제 #2
0
 @Override
 public BasicValue unaryOperation(final AbstractInsnNode insn, final BasicValue value)
     throws AnalyzerException {
   switch (insn.getOpcode()) {
     case INEG:
     case IINC:
     case L2I:
     case F2I:
     case D2I:
     case I2B:
     case I2C:
     case I2S:
       return BasicValue.INT_VALUE;
     case FNEG:
     case I2F:
     case L2F:
     case D2F:
       return BasicValue.FLOAT_VALUE;
     case LNEG:
     case I2L:
     case F2L:
     case D2L:
       return BasicValue.LONG_VALUE;
     case DNEG:
     case I2D:
     case L2D:
     case F2D:
       return BasicValue.DOUBLE_VALUE;
     case IFEQ:
     case IFNE:
     case IFLT:
     case IFGE:
     case IFGT:
     case IFLE:
     case TABLESWITCH:
     case LOOKUPSWITCH:
     case IRETURN:
     case LRETURN:
     case FRETURN:
     case DRETURN:
     case ARETURN:
     case PUTSTATIC:
       return null;
     case GETFIELD:
       return newValue(Type.getType(((FieldInsnNode) insn).desc));
     case NEWARRAY:
       switch (((IntInsnNode) insn).operand) {
         case T_BOOLEAN:
           return newValue(Type.getType("[Z"));
         case T_CHAR:
           return newValue(Type.getType("[C"));
         case T_BYTE:
           return newValue(Type.getType("[B"));
         case T_SHORT:
           return newValue(Type.getType("[S"));
         case T_INT:
           return newValue(Type.getType("[I"));
         case T_FLOAT:
           return newValue(Type.getType("[F"));
         case T_DOUBLE:
           return newValue(Type.getType("[D"));
         case T_LONG:
           return newValue(Type.getType("[J"));
         default:
           throw new AnalyzerException(insn, "Invalid array type");
       }
     case ANEWARRAY:
       String desc = ((TypeInsnNode) insn).desc;
       return newValue(Type.getType("[" + Type.getObjectType(desc)));
     case ARRAYLENGTH:
       return BasicValue.INT_VALUE;
     case ATHROW:
       return null;
     case CHECKCAST:
       desc = ((TypeInsnNode) insn).desc;
       return newValue(Type.getObjectType(desc));
     case INSTANCEOF:
       return BasicValue.INT_VALUE;
     case MONITORENTER:
     case MONITOREXIT:
     case IFNULL:
     case IFNONNULL:
       return null;
     default:
       throw new Error("Internal error.");
   }
 }