in src/main/java/com/intellij/rt/debugger/agent/LogCaptureTransformer.java [49:85]
public MethodVisitor visitMethod(final int access, String name, String descriptor, String signature, String[] exceptions) {
MethodVisitor superMethodVisitor = super.visitMethod(access, name, descriptor, signature, exceptions);
if (!"write".equals(name)) return superMethodVisitor;
// There are also versions like (B)V, but they are uninteresting in terms of logging capture.
final boolean isWithOffset;
switch (descriptor) {
case "([B)V":
isWithOffset = false;
break;
case "([BII)V":
isWithOffset = true;
break;
default:
return superMethodVisitor;
}
return new MethodVisitor(api, superMethodVisitor) {
@Override
public void visitCode() {
super.visitCode();
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitFieldInsn(Opcodes.GETFIELD,
"java/io/FileOutputStream",
"fd", "Ljava/io/FileDescriptor;");
mv.visitVarInsn(Opcodes.ALOAD, 1);
if (isWithOffset) {
mv.visitVarInsn(Opcodes.ILOAD, 2);
mv.visitVarInsn(Opcodes.ILOAD, 3);
}
mv.visitMethodInsn(Opcodes.INVOKESTATIC,
getInternalClsName(LogCaptureStorage.class),
"capture", "(Ljava/io/FileDescriptor;[B" + (isWithOffset ? "II" : "") + ")V",
false);
}
};
}