Example usage for org.objectweb.asm ClassVisitor ClassVisitor

List of usage examples for org.objectweb.asm ClassVisitor ClassVisitor

Introduction

In this page you can find the example usage for org.objectweb.asm ClassVisitor ClassVisitor.

Prototype

public ClassVisitor(final int api, final ClassVisitor classVisitor) 

Source Link

Document

Constructs a new ClassVisitor .

Usage

From source file:de.dynamicfiles.projects.gradle.plugins.javafx.tasks.internal.MonkeyPatcher.java

License:Apache License

private static void doMonkeyPatchFileHandleLeak(ClassReader classReader, ClassWriter classWriter) {
    classReader.accept(new ClassVisitor(Opcodes.ASM5, classWriter) {
        @Override/*from   w  w  w. j  a v  a2 s  .c  o m*/
        public MethodVisitor visitMethod(int access, String name, String desc, String signature,
                String[] exceptions) {
            if (!(name.equals(METHOD_TO_MONKEY_PATCH) && desc.equals(METHOD_SIGNATURE_TO_MONKEY_PATCH))) {
                return super.visitMethod(access, name, desc, signature, exceptions);
            }
            // helpful source: http://web.cs.ucla.edu/~msb/cs239-tutorial/
            // "We will do this using the Adapter Pattern. Adapters wrap an object, overriding some of its methods, and delegating to the others."
            // ugly adapter-pattern ... took me more time than I really can tell here <.<
            return getMonkeyPatchedFileHandleLeakMethodVisitor(access, name, desc, signature, exceptions);
        }

        private MethodVisitor getMonkeyPatchedFileHandleLeakMethodVisitor(int access, String name, String desc,
                String signature, String[] exceptions) {
            return new MethodVisitor(Opcodes.ASM5,
                    super.visitMethod(access, name, desc, signature, exceptions)) {

                /*
                 TODO improve detection of lambda-positions, numbers might vary on different compile-versions
                 */
                @Override
                public void visitCode() {
                    // This mostly got generated from ASM itself, except some adjustments for lambda-IDs and removed "visitMaxs()"-call
                    String javalangThrowable = "java/lang/Throwable";
                    String javaioFile = "java/io/File";
                    String javalangString = "java/lang/String";

                    Label l0 = new Label();
                    Label l1 = new Label();
                    Label l2 = new Label();
                    mv.visitTryCatchBlock(l0, l1, l2, javalangThrowable);
                    Label l3 = new Label();
                    Label l4 = new Label();
                    Label l5 = new Label();
                    mv.visitTryCatchBlock(l3, l4, l5, javalangThrowable);
                    Label l6 = new Label();
                    mv.visitTryCatchBlock(l3, l4, l6, null);
                    Label l7 = new Label();
                    Label l8 = new Label();
                    Label l9 = new Label();
                    mv.visitTryCatchBlock(l7, l8, l9, javalangThrowable);
                    Label l10 = new Label();
                    mv.visitTryCatchBlock(l5, l10, l6, null);
                    mv.visitInsn(Opcodes.ACONST_NULL);
                    mv.visitVarInsn(Opcodes.ASTORE, 3);
                    mv.visitVarInsn(Opcodes.ALOAD, 2);
                    Label l11 = new Label();
                    mv.visitJumpInsn(Opcodes.IFNULL, l11);
                    mv.visitVarInsn(Opcodes.ALOAD, 2);
                    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, javaioFile, "isDirectory", "()Z", false);
                    Label l12 = new Label();
                    mv.visitJumpInsn(Opcodes.IFNE, l12);
                    mv.visitLabel(l11);
                    mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] { javalangString }, 0, null);
                    mv.visitTypeInsn(Opcodes.NEW, javaioFile);
                    mv.visitInsn(Opcodes.DUP);
                    mv.visitLdcInsn("java.home");
                    mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/System", "getProperty",
                            "(Ljava/lang/String;)Ljava/lang/String;", false);
                    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, javaioFile, "<init>", "(Ljava/lang/String;)V",
                            false);
                    mv.visitVarInsn(Opcodes.ASTORE, 2);
                    mv.visitLabel(l12);
                    mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
                    mv.visitFieldInsn(Opcodes.GETSTATIC, "com/oracle/tools/packager/windows/WinAppBundler",
                            "VS_VERS", "[Ljava/lang/String;");
                    mv.visitVarInsn(Opcodes.ASTORE, 4);
                    mv.visitVarInsn(Opcodes.ALOAD, 4);
                    mv.visitInsn(Opcodes.ARRAYLENGTH);
                    mv.visitVarInsn(Opcodes.ISTORE, 5);
                    mv.visitInsn(Opcodes.ICONST_0);
                    mv.visitVarInsn(Opcodes.ISTORE, 6);
                    Label l13 = new Label();
                    mv.visitLabel(l13);
                    mv.visitFrame(Opcodes.F_APPEND, 3,
                            new Object[] { "[Ljava/lang/String;", Opcodes.INTEGER, Opcodes.INTEGER }, 0, null);
                    mv.visitVarInsn(Opcodes.ILOAD, 6);
                    mv.visitVarInsn(Opcodes.ILOAD, 5);
                    Label l14 = new Label();
                    mv.visitJumpInsn(Opcodes.IF_ICMPGE, l14);
                    mv.visitVarInsn(Opcodes.ALOAD, 4);
                    mv.visitVarInsn(Opcodes.ILOAD, 6);
                    mv.visitInsn(Opcodes.AALOAD);
                    mv.visitVarInsn(Opcodes.ASTORE, 7);
                    mv.visitVarInsn(Opcodes.ALOAD, 0);
                    mv.visitVarInsn(Opcodes.ALOAD, 1);
                    mv.visitVarInsn(Opcodes.ALOAD, 7);
                    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "com/oracle/tools/packager/windows/WinAppBundler",
                            "copyMSVCDLLs", "(Ljava/io/File;Ljava/lang/String;)Z", false);
                    Label l15 = new Label();
                    mv.visitJumpInsn(Opcodes.IFEQ, l15);
                    mv.visitVarInsn(Opcodes.ALOAD, 7);
                    mv.visitVarInsn(Opcodes.ASTORE, 3);
                    mv.visitJumpInsn(Opcodes.GOTO, l14);
                    mv.visitLabel(l15);
                    mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
                    mv.visitIincInsn(6, 1);
                    mv.visitJumpInsn(Opcodes.GOTO, l13);
                    mv.visitLabel(l14);
                    mv.visitFrame(Opcodes.F_CHOP, 3, null, 0, null);
                    mv.visitVarInsn(Opcodes.ALOAD, 3);
                    Label l16 = new Label();
                    mv.visitJumpInsn(Opcodes.IFNONNULL, l16);
                    mv.visitTypeInsn(Opcodes.NEW, "java/lang/RuntimeException");
                    mv.visitInsn(Opcodes.DUP);
                    mv.visitLdcInsn("Not found MSVC dlls");
                    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/RuntimeException", "<init>",
                            "(Ljava/lang/String;)V", false);
                    mv.visitInsn(Opcodes.ATHROW);
                    mv.visitLabel(l16);
                    mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
                    mv.visitTypeInsn(Opcodes.NEW, "java/util/concurrent/atomic/AtomicReference");
                    mv.visitInsn(Opcodes.DUP);
                    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/util/concurrent/atomic/AtomicReference",
                            "<init>", "()V", false);
                    mv.visitVarInsn(Opcodes.ASTORE, 4);
                    mv.visitVarInsn(Opcodes.ALOAD, 3);
                    mv.visitVarInsn(Opcodes.ASTORE, 5);
                    mv.visitVarInsn(Opcodes.ALOAD, 2);
                    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, javaioFile, "toPath", "()Ljava/nio/file/Path;",
                            false);
                    mv.visitLdcInsn("bin");
                    mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/nio/file/Path", "resolve",
                            "(Ljava/lang/String;)Ljava/nio/file/Path;", true);
                    mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/nio/file/Files", "list",
                            "(Ljava/nio/file/Path;)Ljava/util/stream/Stream;", false);
                    mv.visitVarInsn(Opcodes.ASTORE, 6);
                    mv.visitInsn(Opcodes.ACONST_NULL);
                    mv.visitVarInsn(Opcodes.ASTORE, 7);
                    mv.visitLabel(l3);
                    mv.visitVarInsn(Opcodes.ALOAD, 6);
                    mv.visitInvokeDynamicInsn("test", "()Ljava/util/function/Predicate;", new Handle(
                            Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory",
                            "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;"),
                            new Object[] { Type.getType("(Ljava/lang/Object;)Z"),
                                    new Handle(Opcodes.H_INVOKESTATIC,
                                            "com/oracle/tools/packager/windows/WinAppBundler",
                                            "lambda$copyMSVCDLLs$261", "(Ljava/nio/file/Path;)Z"),
                                    Type.getType("(Ljava/nio/file/Path;)Z") }); // modified lambda-name
                    mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/stream/Stream", "filter",
                            "(Ljava/util/function/Predicate;)Ljava/util/stream/Stream;", true);
                    mv.visitVarInsn(Opcodes.ALOAD, 5);
                    mv.visitInvokeDynamicInsn("test", "(Ljava/lang/String;)Ljava/util/function/Predicate;",
                            new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory",
                                    "metafactory",
                                    "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;"),
                            new Object[] { Type.getType("(Ljava/lang/Object;)Z"), new Handle(
                                    Opcodes.H_INVOKESTATIC, "com/oracle/tools/packager/windows/WinAppBundler",
                                    "lambda$copyMSVCDLLs$262", "(Ljava/lang/String;Ljava/nio/file/Path;)Z"),
                                    Type.getType("(Ljava/nio/file/Path;)Z") }); // modified lambda-name
                    mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/stream/Stream", "filter",
                            "(Ljava/util/function/Predicate;)Ljava/util/stream/Stream;", true);
                    mv.visitVarInsn(Opcodes.ALOAD, 1);
                    mv.visitVarInsn(Opcodes.ALOAD, 4);
                    mv.visitInvokeDynamicInsn("accept",
                            "(Ljava/io/File;Ljava/util/concurrent/atomic/AtomicReference;)Ljava/util/function/Consumer;",
                            new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory",
                                    "metafactory",
                                    "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;"),
                            new Object[] { Type.getType("(Ljava/lang/Object;)V"), new Handle(
                                    Opcodes.H_INVOKESTATIC, "com/oracle/tools/packager/windows/WinAppBundler",
                                    "lambda$copyMSVCDLLs$263",
                                    "(Ljava/io/File;Ljava/util/concurrent/atomic/AtomicReference;Ljava/nio/file/Path;)V"),
                                    Type.getType("(Ljava/nio/file/Path;)V") }); // modified lambda-name
                    mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/stream/Stream", "forEach",
                            "(Ljava/util/function/Consumer;)V", true);
                    mv.visitLabel(l4);
                    mv.visitVarInsn(Opcodes.ALOAD, 6);
                    Label l17 = new Label();
                    mv.visitJumpInsn(Opcodes.IFNULL, l17);
                    mv.visitVarInsn(Opcodes.ALOAD, 7);
                    Label l18 = new Label();
                    mv.visitJumpInsn(Opcodes.IFNULL, l18);
                    mv.visitLabel(l0);
                    mv.visitVarInsn(Opcodes.ALOAD, 6);
                    mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/stream/Stream", "close", "()V",
                            true);
                    mv.visitLabel(l1);
                    mv.visitJumpInsn(Opcodes.GOTO, l17);
                    mv.visitLabel(l2);
                    mv.visitFrame(Opcodes.F_FULL, 8,
                            new Object[] { "com/oracle/tools/packager/windows/WinAppBundler", javaioFile,
                                    javaioFile, javalangString, "java/util/concurrent/atomic/AtomicReference",
                                    javalangString, "java/util/stream/Stream", javalangThrowable },
                            1, new Object[] { javalangThrowable });
                    mv.visitVarInsn(Opcodes.ASTORE, 8);
                    mv.visitVarInsn(Opcodes.ALOAD, 7);
                    mv.visitVarInsn(Opcodes.ALOAD, 8);
                    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, javalangThrowable, "addSuppressed",
                            "(Ljava/lang/Throwable;)V", false);
                    mv.visitJumpInsn(Opcodes.GOTO, l17);
                    mv.visitLabel(l18);
                    mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
                    mv.visitVarInsn(Opcodes.ALOAD, 6);
                    mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/stream/Stream", "close", "()V",
                            true);
                    mv.visitJumpInsn(Opcodes.GOTO, l17);
                    mv.visitLabel(l5);
                    mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { javalangThrowable });
                    mv.visitVarInsn(Opcodes.ASTORE, 8);
                    mv.visitVarInsn(Opcodes.ALOAD, 8);
                    mv.visitVarInsn(Opcodes.ASTORE, 7);
                    mv.visitVarInsn(Opcodes.ALOAD, 8);
                    mv.visitInsn(Opcodes.ATHROW);
                    mv.visitLabel(l6);
                    mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { javalangThrowable });
                    mv.visitVarInsn(Opcodes.ASTORE, 9);
                    mv.visitLabel(l10);
                    mv.visitVarInsn(Opcodes.ALOAD, 6);
                    Label l19 = new Label();
                    mv.visitJumpInsn(Opcodes.IFNULL, l19);
                    mv.visitVarInsn(Opcodes.ALOAD, 7);
                    Label l20 = new Label();
                    mv.visitJumpInsn(Opcodes.IFNULL, l20);
                    mv.visitLabel(l7);
                    mv.visitVarInsn(Opcodes.ALOAD, 6);
                    mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/stream/Stream", "close", "()V",
                            true);
                    mv.visitLabel(l8);
                    mv.visitJumpInsn(Opcodes.GOTO, l19);
                    mv.visitLabel(l9);
                    mv.visitFrame(Opcodes.F_FULL, 10,
                            new Object[] { "com/oracle/tools/packager/windows/WinAppBundler", javaioFile,
                                    javaioFile, javalangString, "java/util/concurrent/atomic/AtomicReference",
                                    javalangString, "java/util/stream/Stream", javalangThrowable, Opcodes.TOP,
                                    javalangThrowable },
                            1, new Object[] { javalangThrowable });
                    mv.visitVarInsn(Opcodes.ASTORE, 10);
                    mv.visitVarInsn(Opcodes.ALOAD, 7);
                    mv.visitVarInsn(Opcodes.ALOAD, 10);
                    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, javalangThrowable, "addSuppressed",
                            "(Ljava/lang/Throwable;)V", false);
                    mv.visitJumpInsn(Opcodes.GOTO, l19);
                    mv.visitLabel(l20);
                    mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
                    mv.visitVarInsn(Opcodes.ALOAD, 6);
                    mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/stream/Stream", "close", "()V",
                            true);
                    mv.visitLabel(l19);
                    mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
                    mv.visitVarInsn(Opcodes.ALOAD, 9);
                    mv.visitInsn(Opcodes.ATHROW);
                    mv.visitLabel(l17);
                    mv.visitFrame(Opcodes.F_FULL, 6,
                            new Object[] { "com/oracle/tools/packager/windows/WinAppBundler", javaioFile,
                                    javaioFile, javalangString, "java/util/concurrent/atomic/AtomicReference",
                                    javalangString },
                            0, new Object[] {});
                    mv.visitVarInsn(Opcodes.ALOAD, 4);
                    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/concurrent/atomic/AtomicReference",
                            "get", "()Ljava/lang/Object;", false);
                    mv.visitTypeInsn(Opcodes.CHECKCAST, "java/io/IOException");
                    mv.visitVarInsn(Opcodes.ASTORE, 6);
                    mv.visitVarInsn(Opcodes.ALOAD, 6);
                    Label l21 = new Label();
                    mv.visitJumpInsn(Opcodes.IFNULL, l21);
                    mv.visitVarInsn(Opcodes.ALOAD, 6);
                    mv.visitInsn(Opcodes.ATHROW);
                    mv.visitLabel(l21);
                    mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] { "java/io/IOException" }, 0, null);
                    mv.visitInsn(Opcodes.RETURN);
                }

            };
        }

    }, ClassReader.EXPAND_FRAMES); // ClassReader.EXPAND_FRAMES required for Java 8
}

From source file:de.scoopgmbh.copper.instrument.BuildStackInfoAdapter.java

License:Apache License

private static void testClass(File file, final String className) throws IOException, FileNotFoundException {
    ClassReader cr = new ClassReader(new FileInputStream(file));
    ClassWriter cw = new ClassWriter(0);
    final String cDesc = Type.getObjectType(className).getDescriptor();
    ClassVisitor cv = new ClassVisitor(ASM4, cw) {

        @Override//  w w  w  .  java2  s .  com
        public MethodVisitor visitMethod(int access, String name, String desc, String signature,
                String[] exceptions) {
            if (logger.isDebugEnabled())
                logger.debug("=======>" + access + " " + name + " " + desc + " " + signature);
            return new BuildStackInfoAdapter(cDesc, (access & Opcodes.ACC_STATIC) > 0, name, desc, signature);
        }

        @Override
        public void visitInnerClass(String arg0, String arg1, String arg2, int arg3) {
            if (logger.isDebugEnabled())
                logger.debug("== VISIT INNER =======>" + arg0 + " " + arg1 + " " + arg2 + " " + arg3);
            super.visitInnerClass(arg0, arg1, arg2, arg3);
        }

    };
    cr.accept(cv, 0);
}

From source file:io.machinecode.chainlink.tck.core.FieldInstrument.java

License:Open Source License

private static ClassVisitor instrumentConstant(final String constant, final String value,
        final ClassWriter writer) throws IOException {
    return new ClassVisitor(Opcodes.ASM5, writer) {
        @Override/*from w w  w .  jav  a2 s . c  om*/
        public MethodVisitor visitMethod(final int access, final String name, final String desc,
                final String signature, final String[] exceptions) {
            return new MethodVisitor(Opcodes.ASM5,
                    super.visitMethod(access, name, desc, signature, exceptions)) {
                @Override
                public void visitLdcInsn(final Object cst) {
                    if (constant.equals(cst)) {
                        super.visitLdcInsn(value);
                    } else {
                        super.visitLdcInsn(cst);
                    }
                }
            };
        }
    };
}

From source file:jaspex.speculation.Cache.java

License:Open Source License

public static void saveClass(final Type className, byte[] classBytes) {
    new File(CACHE_DIR).mkdir();
    try {/* w ww.j  a va  2 s .com*/
        ClassReader cr = new ClassReader(classBytes);
        ClassWriter cw = new ClassWriter(cr, 0);

        cr.accept(new ClassVisitor(Opcodes.ASM4, cw) {
            @Override
            public void visitEnd() {
                visitField(Opcodes.ACC_FINAL | Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, CLASS_HASH_FIELD,
                        asmlib.Type.STRING.bytecodeName(), null, hashClass(className));
                cv.visitEnd();
            }
        }, 0);

        FileOutputStream fos = new FileOutputStream(CACHE_DIR + className.commonName() + ".class");
        fos.write(cw.toByteArray());
        fos.close();
    } catch (IOException e) {
        throw new Error(e);
    }
}

From source file:jaspex.speculation.SpeculativeTransformer.java

License:Open Source License

public static byte[] removeLineNumber(byte[] output) {
    ClassWriter cw = new ClassWriter(0);

    new ClassReader(output).accept(new ClassVisitor(Opcodes.ASM4, cw) {
        @Override//from   w  w w . jav a 2s  . c  o  m
        public MethodVisitor visitMethod(int access, String name, String desc, String signature,
                String[] exceptions) {
            return new MethodVisitor(Opcodes.ASM4, cv.visitMethod(access, name, desc, signature, exceptions)) {
                @Override
                public void visitLineNumber(int line, Label start) {
                }
            };
        }
    }, 0);

    return cw.toByteArray();
}

From source file:jaspex.speculation.SpeculativeTransformer.java

License:Open Source License

public byte[] createSpeculativeMethods(ClassReader cr) {
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    ClassVisitor cv = cw;//from  w  ww  .j a  v a  2  s  .c  o m

    // Tornar classe public: para o codegen funcionar, todas as classes tm que ser pblicas
    // (todos os mtodos $speculative tambm j so public)
    if (!_JDKClass)
        cv = new ClassVisitor(Opcodes.ASM4, cv) {
            @Override
            public void visit(int version, int access, String name, String signature, String superName,
                    String[] interfaces) {
                access = access & ~Opcodes.ACC_PRIVATE & ~Opcodes.ACC_PROTECTED | Opcodes.ACC_PUBLIC;
                cv.visit(version, access, name, signature, superName, interfaces);
            }
        };

    // Visitor que adiciona fields e mtodos para o -detectlocal
    cv = new InjectDetectLocalClassVisitor(cv);

    // Criar verses $speculative de mtodos
    cv = new GenericMethodVisitorAdapter(cv, CreateSpeculativeMethodVisitor.class, currentClass, _JDKClass);

    // Marcar constructores com SpeculativeCtorMarker
    cv = new GenericMethodVisitorAdapter(cv, SpeculativeCtorMethodVisitor.class);

    // Potencialmente substituir alguns dos mtodos com verses internas do JaSPEx
    cv = new GenericMethodVisitorAdapter(cv, MethodReplacerMethodVisitor.class, currentClass, _JDKClass);

    // Resolver problema com o acesso a mtodos privados
    cv = new GenericMethodVisitorAdapter(cv, FixPrivateMethodAccessMethodVisitor.class, currentClass,
            _JDKClass);

    // Injectar overloads para a todos os mtodos que so herdados de superclasses no-transactificveis
    // Nota: Deve estar na pipeline *antes* do CreateSpeculativeMethodVisitor
    if (!_JDKClass)
        cv = new InjectOverloadsClassVisitor(cv, currentClass);

    cr.accept(cv, 0);

    // Criar verses non-speculative dos mtodos, que funcionam transaccionalmente, mas no
    // fazem spawn de especulaes
    new ClassReader(cw.toByteArray()).accept(new CreateNonSpeculativeMethodsClassVisitor(cw), 0);

    return cw.toByteArray();
}

From source file:jaspex.transactifier.Transactifier.java

License:Open Source License

private Transactifier(ClassReader classReader, boolean JDKClass) throws IOException {
    // Forar a gerao de FRAMES para todas as classes, logo no inicio de toda a cadeia,
    // para evitar possveis problemas em tudo o que se segue e que vai processar esta classe
    ClassWriter cw = new jaspex.util.ClassWriter(ClassWriter.COMPUTE_FRAMES);
    try {/*from   w  w  w. j  av a 2  s .c  om*/
        classReader.accept(cw, ClassReader.EXPAND_FRAMES);
    } catch (RuntimeException e) {
        if (!e.getMessage().equals("JSR/RET are not supported with computeFrames option"))
            throw e;

        Log.debug("Class " + classReader.getClassName() + " uses JSR/RET. Inlining...");
        // Repetir processo, fazendo inline de JSR/RET primeiro
        cw = new jaspex.util.ClassWriter(ClassWriter.COMPUTE_FRAMES);

        classReader.accept(new ClassVisitor(Opcodes.ASM4, cw) {
            @Override
            public MethodVisitor visitMethod(int access, String name, String desc, String signature,
                    String[] exceptions) {
                return new JSRInlinerAdapter(cv.visitMethod(access, name, desc, signature, exceptions), access,
                        name, desc, signature, exceptions);
            }
        }, ClassReader.EXPAND_FRAMES);
    }

    cr = new ClassReader(cw.toByteArray());
    currentClass = InfoClass.fromType(Type.fromAsm(cr.getClassName()));
    _JDKClass = JDKClass;
}

From source file:lombok.bytecode.AsmUtil.java

License:Open Source License

static byte[] fixJSRInlining(byte[] byteCode) {
    ClassReader reader = new ClassReader(byteCode);
    ClassWriter writer = new FixedClassWriter(reader, 0);

    ClassVisitor visitor = new ClassVisitor(Opcodes.ASM5, writer) {
        @Override/* w w  w .ja  va  2  s. c  o m*/
        public MethodVisitor visitMethod(int access, String name, String desc, String signature,
                String[] exceptions) {
            return new JSRInlinerAdapter(super.visitMethod(access, name, desc, signature, exceptions), access,
                    name, desc, signature, exceptions);
        }
    };

    reader.accept(visitor, 0);
    return writer.toByteArray();
}

From source file:lombok.bytecode.PreventNullAnalysisRemover.java

License:Open Source License

@Override
public byte[] applyTransformations(byte[] original, String fileName, DiagnosticsReceiver diagnostics) {
    if (!new ClassFileMetaData(original).usesMethod("lombok/Lombok", "preventNullAnalysis"))
        return null;

    byte[] fixedByteCode = fixJSRInlining(original);

    ClassReader reader = new ClassReader(fixedByteCode);
    ClassWriter writer = new FixedClassWriter(reader, 0);

    final AtomicBoolean changesMade = new AtomicBoolean();

    class PreventNullAnalysisVisitor extends MethodVisitor {
        PreventNullAnalysisVisitor(MethodVisitor mv) {
            super(Opcodes.ASM5, mv);
        }//from w  ww. j  av a 2 s  . co  m

        @Override
        public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
            boolean hit = true;
            if (hit && opcode != Opcodes.INVOKESTATIC)
                hit = false;
            if (hit && !"preventNullAnalysis".equals(name))
                hit = false;
            if (hit && !"lombok/Lombok".equals(owner))
                hit = false;
            if (hit && !"(Ljava/lang/Object;)Ljava/lang/Object;".equals(desc))
                hit = false;
            if (hit) {
                changesMade.set(true);
                if (System.getProperty("lombok.debugAsmOnly", null) != null)
                    super.visitMethodInsn(opcode, owner, name, desc, itf); // DEBUG for issue 470!
            } else {
                super.visitMethodInsn(opcode, owner, name, desc, itf);
            }
        }
    }

    reader.accept(new ClassVisitor(Opcodes.ASM5, writer) {
        @Override
        public MethodVisitor visitMethod(int access, String name, String desc, String signature,
                String[] exceptions) {
            return new PreventNullAnalysisVisitor(super.visitMethod(access, name, desc, signature, exceptions));
        }
    }, 0);
    return changesMade.get() ? writer.toByteArray() : null;
}

From source file:lombok.bytecode.SneakyThrowsRemover.java

License:Open Source License

@Override
public byte[] applyTransformations(byte[] original, String fileName, final DiagnosticsReceiver diagnostics) {
    if (!new ClassFileMetaData(original).usesMethod("lombok/Lombok", "sneakyThrow"))
        return null;

    byte[] fixedByteCode = fixJSRInlining(original);

    ClassReader reader = new ClassReader(fixedByteCode);
    ClassWriter writer = new ClassWriter(reader, 0);

    final AtomicBoolean changesMade = new AtomicBoolean();

    class SneakyThrowsRemoverVisitor extends MethodVisitor {
        SneakyThrowsRemoverVisitor(MethodVisitor mv) {
            super(Opcodes.ASM5, mv);
        }//from w w w .jav a2s  .  co m

        private boolean methodInsnQueued = false;

        @Override
        public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
            if (opcode == Opcodes.INVOKESTATIC && "sneakyThrow".equals(name) && "lombok/Lombok".equals(owner)
                    && "(Ljava/lang/Throwable;)Ljava/lang/RuntimeException;".equals(desc)) {

                if (System.getProperty("lombok.debugAsmOnly", null) != null) {
                    super.visitMethodInsn(opcode, owner, name, desc, itf); // DEBUG for issue 470!
                } else {
                    methodInsnQueued = true;
                }
            } else {
                super.visitMethodInsn(opcode, owner, name, desc, itf);
            }
        }

        private void handleQueue() {
            if (!methodInsnQueued)
                return;
            super.visitMethodInsn(Opcodes.INVOKESTATIC, "lombok/Lombok", "sneakyThrow",
                    "(Ljava/lang/Throwable;)Ljava/lang/RuntimeException;", false);
            methodInsnQueued = false;
            diagnostics.addWarning(
                    "Proper usage is: throw lombok.Lombok.sneakyThrow(someException);. You did not 'throw' it. Because of this, the call to sneakyThrow "
                            + "remains in your classfile and you will need lombok.jar on the classpath at runtime.");
        }

        @Override
        public void visitInsn(int arg0) {
            if (methodInsnQueued && arg0 == Opcodes.ATHROW) {
                changesMade.set(true);
                // As expected, the required ATHROW. We can now safely 'eat' the previous call.
                methodInsnQueued = false;
            }
            handleQueue();
            super.visitInsn(arg0);
        }

        @Override
        public void visitFrame(int arg0, int arg1, Object[] arg2, int arg3, Object[] arg4) {
            handleQueue();
            super.visitFrame(arg0, arg1, arg2, arg3, arg4);
        }

        @Override
        public void visitIincInsn(int arg0, int arg1) {
            handleQueue();
            super.visitIincInsn(arg0, arg1);
        }

        @Override
        public void visitFieldInsn(int arg0, String arg1, String arg2, String arg3) {
            handleQueue();
            super.visitFieldInsn(arg0, arg1, arg2, arg3);
        }

        @Override
        public void visitIntInsn(int arg0, int arg1) {
            handleQueue();
            super.visitIntInsn(arg0, arg1);
        }

        @Override
        public void visitEnd() {
            handleQueue();
            super.visitEnd();
        }

        @Override
        public void visitInvokeDynamicInsn(String arg0, String arg1, Handle arg2, Object... arg3) {
            handleQueue();
            super.visitInvokeDynamicInsn(arg0, arg1, arg2, arg3);
        }

        @Override
        public void visitLabel(Label arg0) {
            handleQueue();
            super.visitLabel(arg0);
        }

        @Override
        public void visitJumpInsn(int arg0, Label arg1) {
            handleQueue();
            super.visitJumpInsn(arg0, arg1);
        }

        @Override
        public void visitLdcInsn(Object arg0) {
            handleQueue();
            super.visitLdcInsn(arg0);
        }

        @Override
        public void visitLocalVariable(String arg0, String arg1, String arg2, Label arg3, Label arg4,
                int arg5) {
            handleQueue();
            super.visitLocalVariable(arg0, arg1, arg2, arg3, arg4, arg5);
        }

        @Override
        public void visitMaxs(int arg0, int arg1) {
            handleQueue();
            super.visitMaxs(arg0, arg1);
        }

        @Override
        public void visitLookupSwitchInsn(Label arg0, int[] arg1, Label[] arg2) {
            handleQueue();
            super.visitLookupSwitchInsn(arg0, arg1, arg2);
        }

        @Override
        public void visitMultiANewArrayInsn(String arg0, int arg1) {
            handleQueue();
            super.visitMultiANewArrayInsn(arg0, arg1);
        }

        @Override
        public void visitVarInsn(int arg0, int arg1) {
            handleQueue();
            super.visitVarInsn(arg0, arg1);
        }

        @Override
        public void visitTryCatchBlock(Label arg0, Label arg1, Label arg2, String arg3) {
            handleQueue();
            super.visitTryCatchBlock(arg0, arg1, arg2, arg3);
        }

        @Override
        public void visitTableSwitchInsn(int arg0, int arg1, Label arg2, Label... arg3) {
            handleQueue();
            super.visitTableSwitchInsn(arg0, arg1, arg2, arg3);
        }

        @Override
        public void visitTypeInsn(int arg0, String arg1) {
            handleQueue();
            super.visitTypeInsn(arg0, arg1);
        }
    }

    reader.accept(new ClassVisitor(Opcodes.ASM5, writer) {
        @Override
        public MethodVisitor visitMethod(int access, String name, String desc, String signature,
                String[] exceptions) {
            return new SneakyThrowsRemoverVisitor(super.visitMethod(access, name, desc, signature, exceptions));
        }
    }, 0);
    return changesMade.get() ? writer.toByteArray() : null;
}