Example #1
0
 /** Shortcut */
 @Override
 public void writeAsmType(Type asmType) {
   if (asmType.getSort() != Type.OBJECT && asmType.getSort() != Type.ARRAY) {
     signatureVisitor().visitBaseType(asmType.getDescriptor().charAt(0));
   }
   super.writeAsmType(asmType);
 }
  @Override
  @Nullable
  public StrictBasicValue newValue(@Nullable Type type) {
    if (type == null) {
      return UNINITIALIZED_VALUE;
    }

    switch (type.getSort()) {
      case Type.VOID:
        return null;
      case Type.INT:
        return INT_VALUE;
      case Type.FLOAT:
        return FLOAT_VALUE;
      case Type.LONG:
        return LONG_VALUE;
      case Type.DOUBLE:
        return DOUBLE_VALUE;
      case Type.BOOLEAN:
        return BOOLEAN_VALUE;
      case Type.CHAR:
        return CHAR_VALUE;
      case Type.BYTE:
        return BYTE_VALUE;
      case Type.SHORT:
        return SHORT_VALUE;
      case Type.OBJECT:
      case Type.ARRAY:
        return new StrictBasicValue(type);
      default:
        throw new IllegalArgumentException("Unknown type sort " + type.getSort());
    }
  }
 @NotNull
 private static TypeInfo fieldTypeViaDescription(@NotNull String desc) {
   Type type = Type.getType(desc);
   final int dim = type.getSort() == Type.ARRAY ? type.getDimensions() : 0;
   if (dim > 0) {
     type = type.getElementType();
   }
   return new TypeInfo(
       getTypeText(type),
       (byte) dim,
       false,
       PsiAnnotationStub.EMPTY_ARRAY); // todo read annos from .class file
 }
 private static boolean isReferenceType(final Type type) {
   return type.getSort() == Type.OBJECT || type.getSort() == Type.ARRAY;
 }
  @Override
  public BasicValue binaryOperation(
      @NotNull AbstractInsnNode insn, @NotNull BasicValue value1, @NotNull BasicValue value2)
      throws AnalyzerException {
    if (insn.getOpcode() == Opcodes.AALOAD) {
      Type arrayType = value1.getType();
      if (arrayType != null && arrayType.getSort() == Type.ARRAY) {
        return new StrictBasicValue(arrayType.getElementType());
      }
    }

    switch (insn.getOpcode()) {
      case IALOAD:
      case BALOAD:
      case CALOAD:
      case SALOAD:
      case IADD:
      case ISUB:
      case IMUL:
      case IDIV:
      case IREM:
      case ISHL:
      case ISHR:
      case IUSHR:
      case IAND:
      case IOR:
      case IXOR:
        return StrictBasicValue.INT_VALUE;
      case FALOAD:
      case FADD:
      case FSUB:
      case FMUL:
      case FDIV:
      case FREM:
        return StrictBasicValue.FLOAT_VALUE;
      case LALOAD:
      case LADD:
      case LSUB:
      case LMUL:
      case LDIV:
      case LREM:
      case LSHL:
      case LSHR:
      case LUSHR:
      case LAND:
      case LOR:
      case LXOR:
        return StrictBasicValue.LONG_VALUE;
      case DALOAD:
      case DADD:
      case DSUB:
      case DMUL:
      case DDIV:
      case DREM:
        return StrictBasicValue.DOUBLE_VALUE;
      case AALOAD:
        return StrictBasicValue.REFERENCE_VALUE;
      case LCMP:
      case FCMPL:
      case FCMPG:
      case DCMPL:
      case DCMPG:
        return StrictBasicValue.INT_VALUE;
      case IF_ICMPEQ:
      case IF_ICMPNE:
      case IF_ICMPLT:
      case IF_ICMPGE:
      case IF_ICMPGT:
      case IF_ICMPLE:
      case IF_ACMPEQ:
      case IF_ACMPNE:
      case PUTFIELD:
        return null;
      default:
        throw new Error("Internal error.");
    }
  }
 private static boolean isStringType(Type type) {
   return type.getSort() == Type.OBJECT && type.getDescriptor().equals(JAVA_LANG_STRING);
 }