@Override public BasicValue newValue(Type type) { BasicValue basicValue = super.newValue(type); if (basicValue == BasicValue.REFERENCE_VALUE) { basicValue = new BasicValue(type); // record the exact type and not just "Ljava/lang/Object" } return basicValue; }
@Override public BasicValue binaryOperation(final AbstractInsnNode insn, final BasicValue value1, final BasicValue value2) throws AnalyzerException { return createNode(insn, super.binaryOperation(insn, null, null), value1, value2); }
@Override @SuppressWarnings({"unchecked"}) public BasicValue naryOperation(AbstractInsnNode insn, List values) throws AnalyzerException { return createNode(insn, super.naryOperation(insn, null), (BasicValue[]) values.toArray(new BasicValue[values.size()])); }
@Override public BasicValue unaryOperation(final AbstractInsnNode insn, final BasicValue value) throws AnalyzerException { return createNode(insn, super.unaryOperation(insn, null), value); }
/** * Remove the dead code - or unreachable code - from a method. * * @param method the method to be updated */ private void removeDeadCode(MethodNode method) { try { // Analyze the method using the BasicInterpreter. // As a result, the computed frames are null for instructions // that cannot be reached. Analyzer analyzer = new Analyzer(new BasicInterpreter()); analyzer.analyze(specializedClassName, method); Frame[] frames = analyzer.getFrames(); AbstractInsnNode[] insns = method.instructions.toArray(); for (int i = 0; i < frames.length; i++) { AbstractInsnNode insn = insns[i]; if (frames[i] == null && insn.getType() != AbstractInsnNode.LABEL) { // This instruction was not reached by the analyzer method.instructions.remove(insn); insns[i] = null; } } } catch (AnalyzerException e) { // Ignore error } }
@Override public BasicValue newOperation(final AbstractInsnNode insn) throws AnalyzerException { return createNode(insn, super.newOperation(insn)); }
/** {@inheritDoc} */ @Override public BasicValue copyOperation(AbstractInsnNode insn, BasicValue value) throws AnalyzerException { if (insn.getOpcode() == Opcodes.ALOAD) { VarInsnNode varNode = (VarInsnNode) insn; if (varNode.var == 0) { return THIS_VALUE; } } return super.copyOperation(insn, value); }
@Override public BasicValue unaryOperation(AbstractInsnNode insn, BasicValue value) throws AnalyzerException { return createNode(insn, super.unaryOperation(insn, null), value); }
Analyzer analyzer = new Analyzer(new BasicInterpreter()) { @Override protected void newControlFlowEdge(int insn, int successor) {
@Override public BasicValue newOperation(AbstractInsnNode insn) throws AnalyzerException { return createNode(insn, super.newOperation(insn)); }
@Override public BasicValue copyOperation(final AbstractInsnNode insn, final BasicValue value) throws AnalyzerException { return createNode(insn, super.copyOperation(insn, value), value); }
@Override public BasicValue newValue(Type type) { if (type != null && type.getDescriptor().equals(VM_SECURE_RANDOM)) { return new BasicValue(type); } return super.newValue(type); } });
@Override public BasicValue naryOperation(final AbstractInsnNode insn, final List<? extends BasicValue> values) throws AnalyzerException { return createNode(insn, super.naryOperation(insn, null), (BasicValue[]) values.toArray(new BasicValue[values.size()])); }
@Override public BasicValue binaryOperation(AbstractInsnNode insn, BasicValue value1, BasicValue value2) throws AnalyzerException { return createNode(insn, super.binaryOperation(insn, null, null), value1, value2); }
/** {@inheritDoc} */ @Override public BasicValue unaryOperation(AbstractInsnNode insn, BasicValue value) throws AnalyzerException { if (insn.getOpcode() == Opcodes.INSTANCEOF) { return BOOLEAN_VALUE; } else if (insn.getOpcode() == Opcodes.GETFIELD) { FieldInsnNode fieldNode = (FieldInsnNode) insn; if (BooleanTestabilityTransformation.isTransformedField(fieldNode.owner, fieldNode.name, fieldNode.desc)) return BOOLEAN_VALUE; } return super.unaryOperation(insn, value); }
Analyzer analyzer = new Analyzer(new BasicInterpreter()) { @Override protected void newControlFlowEdge(int insn, int successor) {
@Override public BasicValue newOperation(AbstractInsnNode insn) throws AnalyzerException { if(insn.getOpcode() == Opcodes.NEW) { return new NewValue(Type.getObjectType(((TypeInsnNode) insn).desc), false, insn); } return super.newOperation(insn); }
@Override public BasicValue copyOperation(AbstractInsnNode insn, BasicValue value) throws AnalyzerException { return createNode(insn, super.copyOperation(insn, value), value); }
@Override public BasicValue newValue(final Type type) { BasicValue basicValue = super.newValue(type); if (basicValue == BasicValue.REFERENCE_VALUE) // record the exact type and not just "Ljava/lang/Object" basicValue = new BasicValue(type); return basicValue; }
/** {@inheritDoc} */ @Override public BasicValue naryOperation(AbstractInsnNode insn, @SuppressWarnings("rawtypes") List values) throws AnalyzerException { if (insn.getOpcode() == Opcodes.INVOKESTATIC) { MethodInsnNode mn = (MethodInsnNode) insn; if (mn.owner.equals(Type.getInternalName(StringHelper.class)) && mn.name.startsWith("String")) { return STRING_BOOLEAN; } } return super.naryOperation(insn, values); }