@Override public void visitTypeInsn(final int opcode, final String type) { mv.visitTypeInsn(opcode, type); // ANEWARRAY, CHECKCAST or INSTANCEOF don't change stack if (constructor && opcode == NEW) { pushValue(OTHER); } }
@Override public void visitIntInsn(final int opcode, final int operand) { super.visitIntInsn(opcode, operand); if (isConstructor && !superClassConstructorCalled && opcode != NEWARRAY) { pushValue(OTHER); } }
@Override public void visitLdcInsn(final Object value) { super.visitLdcInsn(value); if (isConstructor && !superClassConstructorCalled) { pushValue(OTHER); if (value instanceof Double || value instanceof Long || (value instanceof ConstantDynamic && ((ConstantDynamic) value).getSize() == 2)) { pushValue(OTHER); } } }
@Override public void visitTypeInsn(final int opcode, final String type) { super.visitTypeInsn(opcode, type); // ANEWARRAY, CHECKCAST or INSTANCEOF don't change stack. if (isConstructor && !superClassConstructorCalled && opcode == NEW) { pushValue(OTHER); } }
@Override public void visitLdcInsn(final Object value) { super.visitLdcInsn(value); if (isConstructor && !superClassConstructorCalled) { pushValue(OTHER); if (value instanceof Double || value instanceof Long || (value instanceof ConstantDynamic && ((ConstantDynamic) value).getSize() == 2)) { pushValue(OTHER); } } }
@Override public void visitIntInsn(final int opcode, final int operand) { mv.visitIntInsn(opcode, operand); if (constructor && opcode != NEWARRAY) { pushValue(OTHER); } }
@Override public void visitTypeInsn(final int opcode, final String type) { super.visitTypeInsn(opcode, type); // ANEWARRAY, CHECKCAST or INSTANCEOF don't change stack. if (isConstructor && !superClassConstructorCalled && opcode == NEW) { pushValue(OTHER); } }
@Override public void visitIntInsn(final int opcode, final int operand) { super.visitIntInsn(opcode, operand); if (isConstructor && !superClassConstructorCalled && opcode != NEWARRAY) { pushValue(OTHER); } }
@Override public void visitIntInsn(final int opcode, final int operand) { super.visitIntInsn(opcode, operand); if (isConstructor && !superClassConstructorCalled && opcode != NEWARRAY) { pushValue(OTHER); } }
@Override public void visitLdcInsn(final Object value) { super.visitLdcInsn(value); if (isConstructor && !superClassConstructorCalled) { pushValue(OTHER); if (value instanceof Double || value instanceof Long || (value instanceof ConstantDynamic && ((ConstantDynamic) value).getSize() == 2)) { pushValue(OTHER); } } }
@Override public void visitTypeInsn(final int opcode, final String type) { super.visitTypeInsn(opcode, type); // ANEWARRAY, CHECKCAST or INSTANCEOF don't change stack. if (isConstructor && !superClassConstructorCalled && opcode == NEW) { pushValue(OTHER); } }
@Override public void visitVarInsn(final int opcode, final int var) { super.visitVarInsn(opcode, var); if (constructor) { switch (opcode) { case ILOAD: case FLOAD: pushValue(OTHER); break; case LLOAD: case DLOAD: pushValue(OTHER); pushValue(OTHER); break; case ALOAD: pushValue(var == 0 ? THIS : OTHER); break; case ASTORE: case ISTORE: case FSTORE: popValue(); break; case LSTORE: case DSTORE: popValue(); popValue(); break; } } }
@Override public void visitMultiANewArrayInsn(final String descriptor, final int numDimensions) { super.visitMultiANewArrayInsn(descriptor, numDimensions); if (isConstructor && !superClassConstructorCalled) { for (int i = 0; i < numDimensions; i++) { popValue(); } pushValue(OTHER); } }
@Override public void visitMultiANewArrayInsn(final String desc, final int dims) { mv.visitMultiANewArrayInsn(desc, dims); if (constructor) { for (int i = 0; i < dims; i++) { popValue(); } pushValue(OTHER); } }
@Override public void visitMultiANewArrayInsn(final String descriptor, final int numDimensions) { super.visitMultiANewArrayInsn(descriptor, numDimensions); if (isConstructor && !superClassConstructorCalled) { for (int i = 0; i < numDimensions; i++) { popValue(); } pushValue(OTHER); } }
@Override public void visitMultiANewArrayInsn(final String descriptor, final int numDimensions) { super.visitMultiANewArrayInsn(descriptor, numDimensions); if (isConstructor && !superClassConstructorCalled) { for (int i = 0; i < numDimensions; i++) { popValue(); } pushValue(OTHER); } }
@Override public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) { mv.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs); if (constructor) { Type[] types = Type.getArgumentTypes(desc); for (int i = 0; i < types.length; i++) { popValue(); if (types[i].getSize() == 2) { popValue(); } } Type returnType = Type.getReturnType(desc); if (returnType != Type.VOID_TYPE) { pushValue(OTHER); if (returnType.getSize() == 2) { pushValue(OTHER); } } } }