コード例 #1
0
 @Override
 public BasicValue naryOperation(
     final AbstractInsnNode insn, final List<? extends BasicValue> values)
     throws AnalyzerException {
   int opcode = insn.getOpcode();
   if (opcode == MULTIANEWARRAY) {
     return newValue(Type.getType(((MultiANewArrayInsnNode) insn).desc));
   } else if (opcode == INVOKEDYNAMIC) {
     return newValue(Type.getReturnType(((InvokeDynamicInsnNode) insn).desc));
   } else {
     return newValue(Type.getReturnType(((MethodInsnNode) insn).desc));
   }
 }
コード例 #2
0
 @Override
 public BasicValue newValue(final Type type) {
   if (type == null) {
     return BasicValue.UNINITIALIZED_VALUE;
   }
   switch (type.getSort()) {
     case Type.VOID:
       return null;
     case Type.BOOLEAN:
     case Type.CHAR:
     case Type.BYTE:
     case Type.SHORT:
     case Type.INT:
       return BasicValue.INT_VALUE;
     case Type.FLOAT:
       return BasicValue.FLOAT_VALUE;
     case Type.LONG:
       return BasicValue.LONG_VALUE;
     case Type.DOUBLE:
       return BasicValue.DOUBLE_VALUE;
     case Type.ARRAY:
     case Type.OBJECT:
       return BasicValue.REFERENCE_VALUE;
     default:
       throw new Error("Internal error");
   }
 }
コード例 #3
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.");
   }
 }
コード例 #4
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.");
   }
 }