/** 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); }