public MethodVisitor visitMethod()

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