in src/main/java/com/intellij/rt/debugger/agent/CaptureAgent.java [225:271]
private void generateWrapper(int access,
String name,
String desc,
String signature,
String[] exceptions,
InstrumentPoint insertPoint,
String methodDisplayName) {
MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
Label start = new Label();
mv.visitLabel(start);
boolean isStatic = (access & Opcodes.ACC_STATIC) != 0;
Type[] argumentTypes = Type.getMethodType(desc).getArgumentTypes();
insertEnter(mv, insertPoint.myKeyProvider, isStatic, argumentTypes, methodDisplayName);
// this
mv.visitVarInsn(Opcodes.ALOAD, 0);
// params
int index = isStatic ? 0 : 1;
for (Type t : argumentTypes) {
mv.visitVarInsn(t.getOpcode(Opcodes.ILOAD), index);
index += t.getSize();
}
// original call
mv.visitMethodInsn(isStatic ? Opcodes.INVOKESTATIC : Opcodes.INVOKESPECIAL,
insertPoint.myClassName, getNewName(insertPoint.myMethodName), desc, myIsInterface);
Label end = new Label();
mv.visitLabel(end);
// regular exit
insertExit(mv, insertPoint.myKeyProvider, isStatic, argumentTypes, methodDisplayName);
mv.visitInsn(Type.getReturnType(desc).getOpcode(Opcodes.IRETURN));
Label catchLabel = new Label();
mv.visitLabel(catchLabel);
mv.visitTryCatchBlock(start, end, catchLabel, null);
// exception exit
insertExit(mv, insertPoint.myKeyProvider, isStatic, argumentTypes, methodDisplayName);
mv.visitInsn(Opcodes.ATHROW);
mv.visitMaxs(0, 0);
mv.visitEnd();
}