Example usage for org.objectweb.asm MethodVisitor visitVarInsn

List of usage examples for org.objectweb.asm MethodVisitor visitVarInsn

Introduction

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

Prototype

public void visitVarInsn(final int opcode, final int var) 

Source Link

Document

Visits a local variable instruction.

Usage

From source file:com.toolazydogs.aunit.internal.LexerFactory.java

License:Apache License

private Class<L> loadClass() {
    final String parent = lexerClass.getName().replace('.', '/');
    final String name = "com/toolazydogs/aunit/asm/" + parent;

    ClassWriter cw = new ClassWriter(0);
    FieldVisitor fv;//from w ww  .j  a  v  a 2s  .c  o  m
    MethodVisitor mv;

    cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER, name, null, parent,
            new String[] { "com/toolazydogs/aunit/internal/LexerWrapper" });

    {
        fv = cw.visitField(ACC_PRIVATE + ACC_FINAL, "errors", "Ljava/util/List;",
                "Ljava/util/List<Ljava/lang/String;>;", null);
        fv.visitEnd();
    }
    {
        fv = cw.visitField(ACC_PRIVATE, "failOnError", "Z", null, null);
        fv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, parent, "<init>", "()V");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitTypeInsn(NEW, "java/util/ArrayList");
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, "java/util/ArrayList", "<init>", "()V");
        mv.visitFieldInsn(PUTFIELD, name, "errors", "Ljava/util/List;");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitInsn(ICONST_1);
        mv.visitFieldInsn(PUTFIELD, name, "failOnError", "Z");
        mv.visitInsn(RETURN);
        mv.visitMaxs(3, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(Lorg/antlr/runtime/CharStream;)V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKESPECIAL, parent, "<init>", "(Lorg/antlr/runtime/CharStream;)V");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitTypeInsn(NEW, "java/util/ArrayList");
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, "java/util/ArrayList", "<init>", "()V");
        mv.visitFieldInsn(PUTFIELD, name, "errors", "Ljava/util/List;");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitInsn(ICONST_1);
        mv.visitFieldInsn(PUTFIELD, name, "failOnError", "Z");
        mv.visitInsn(RETURN);
        mv.visitMaxs(3, 2);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>",
                "(Lorg/antlr/runtime/CharStream;Lorg/antlr/runtime/RecognizerSharedState;)V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKESPECIAL, parent, "<init>",
                "(Lorg/antlr/runtime/CharStream;Lorg/antlr/runtime/RecognizerSharedState;)V");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitTypeInsn(NEW, "java/util/ArrayList");
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, "java/util/ArrayList", "<init>", "()V");
        mv.visitFieldInsn(PUTFIELD, name, "errors", "Ljava/util/List;");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitInsn(ICONST_1);
        mv.visitFieldInsn(PUTFIELD, name, "failOnError", "Z");
        mv.visitInsn(RETURN);
        mv.visitMaxs(3, 3);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "emitErrorMessage", "(Ljava/lang/String;)V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, name, "errors", "Ljava/util/List;");
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "add", "(Ljava/lang/Object;)Z");
        mv.visitInsn(POP);
        mv.visitInsn(RETURN);
        mv.visitMaxs(2, 2);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "getErrors", "()Ljava/util/List;",
                "()Ljava/util/List<Ljava/lang/String;>;", null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, name, "errors", "Ljava/util/List;");
        mv.visitInsn(ARETURN);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "isFailOnError", "()Z", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, name, "failOnError", "Z");
        mv.visitInsn(IRETURN);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "setFailOnError", "(Z)V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ILOAD, 1);
        mv.visitFieldInsn(PUTFIELD, name, "failOnError", "Z");
        mv.visitInsn(RETURN);
        mv.visitMaxs(2, 2);
        mv.visitEnd();
    }
    cw.visitEnd();

    byte[] b = cw.toByteArray();

    AunitClassloader ac = new AunitClassloader(lexerClass.getClassLoader());
    return ac.defineClass(name.replace('/', '.'), b);
}

From source file:com.toolazydogs.aunit.internal.ParserFactory.java

License:Apache License

private Class<P> loadClass() {
    final String parent = parserClass.getName().replace('.', '/');
    final String name = "com/toolazydogs/aunit/asm/" + parent;

    ClassWriter cw = new ClassWriter(0);
    FieldVisitor fv;/* ww w  .j  a va2s . co  m*/
    MethodVisitor mv;

    cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER, name, null, parent,
            new String[] { "com/toolazydogs/aunit/internal/ParserWrapper" });

    {
        fv = cw.visitField(ACC_PRIVATE + ACC_FINAL, "errors", "Ljava/util/List;",
                "Ljava/util/List<Ljava/lang/String;>;", null);
        fv.visitEnd();
    }
    {
        fv = cw.visitField(ACC_PRIVATE, "failOnError", "Z", null, null);
        fv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(Lorg/antlr/runtime/TokenStream;)V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKESPECIAL, parent, "<init>", "(Lorg/antlr/runtime/TokenStream;)V");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitTypeInsn(NEW, "java/util/ArrayList");
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, "java/util/ArrayList", "<init>", "()V");
        mv.visitFieldInsn(PUTFIELD, name, "errors", "Ljava/util/List;");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitInsn(ICONST_1);
        mv.visitFieldInsn(PUTFIELD, name, "failOnError", "Z");
        mv.visitInsn(RETURN);
        mv.visitMaxs(3, 2);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>",
                "(Lorg/antlr/runtime/TokenStream;Lorg/antlr/runtime/RecognizerSharedState;)V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKESPECIAL, parent, "<init>",
                "(Lorg/antlr/runtime/TokenStream;Lorg/antlr/runtime/RecognizerSharedState;)V");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitTypeInsn(NEW, "java/util/ArrayList");
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, "java/util/ArrayList", "<init>", "()V");
        mv.visitFieldInsn(PUTFIELD, name, "errors", "Ljava/util/List;");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitInsn(ICONST_1);
        mv.visitFieldInsn(PUTFIELD, name, "failOnError", "Z");
        mv.visitInsn(RETURN);
        mv.visitMaxs(3, 3);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "emitErrorMessage", "(Ljava/lang/String;)V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, name, "errors", "Ljava/util/List;");
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "add", "(Ljava/lang/Object;)Z");
        mv.visitInsn(POP);
        mv.visitInsn(RETURN);
        mv.visitMaxs(2, 2);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "getErrors", "()Ljava/util/List;",
                "()Ljava/util/List<Ljava/lang/String;>;", null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, name, "errors", "Ljava/util/List;");
        mv.visitInsn(ARETURN);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "isFailOnError", "()Z", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, name, "failOnError", "Z");
        mv.visitInsn(IRETURN);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "setFailOnError", "(Z)V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ILOAD, 1);
        mv.visitFieldInsn(PUTFIELD, name, "failOnError", "Z");
        mv.visitInsn(RETURN);
        mv.visitMaxs(2, 2);
        mv.visitEnd();
    }
    cw.visitEnd();

    byte[] b = cw.toByteArray();

    AunitClassloader ac = new AunitClassloader(parserClass.getClassLoader());
    return ac.defineClass(name.replace('/', '.'), b);
}

From source file:com.toolazydogs.aunit.internal.TreeParserFactory.java

License:Apache License

private Class<T> loadClass() {
    final String parent = treeParserClass.getName().replace('.', '/');
    final String name = "com/toolazydogs/aunit/asm/" + parent;

    ClassWriter cw = new ClassWriter(0);
    FieldVisitor fv;//from   w ww.  j a va  2  s. c  o  m
    MethodVisitor mv;

    cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER, name, null, parent,
            new String[] { "com/toolazydogs/aunit/internal/TreeParserWrapper" });

    {
        fv = cw.visitField(ACC_PRIVATE + ACC_FINAL, "errors", "Ljava/util/List;",
                "Ljava/util/List<Ljava/lang/String;>;", null);
        fv.visitEnd();
    }
    {
        fv = cw.visitField(ACC_PRIVATE, "failOnError", "Z", null, null);
        fv.visitEnd();
    }

    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(Lorg/antlr/runtime/tree/TreeNodeStream;)V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKESPECIAL, parent, "<init>", "(Lorg/antlr/runtime/tree/TreeNodeStream;)V");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitTypeInsn(NEW, "java/util/ArrayList");
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, "java/util/ArrayList", "<init>", "()V");
        mv.visitFieldInsn(PUTFIELD, name, "errors", "Ljava/util/List;");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitInsn(ICONST_1);
        mv.visitFieldInsn(PUTFIELD, name, "failOnError", "Z");
        mv.visitInsn(RETURN);
        mv.visitMaxs(3, 2);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>",
                "(Lorg/antlr/runtime/tree/TreeNodeStream;Lorg/antlr/runtime/RecognizerSharedState;)V", null,
                null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKESPECIAL, parent, "<init>",
                "(Lorg/antlr/runtime/tree/TreeNodeStream;Lorg/antlr/runtime/RecognizerSharedState;)V");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitTypeInsn(NEW, "java/util/ArrayList");
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, "java/util/ArrayList", "<init>", "()V");
        mv.visitFieldInsn(PUTFIELD, name, "errors", "Ljava/util/List;");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitInsn(ICONST_1);
        mv.visitFieldInsn(PUTFIELD, name, "failOnError", "Z");
        mv.visitInsn(RETURN);
        mv.visitMaxs(3, 3);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "emitErrorMessage", "(Ljava/lang/String;)V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, name, "errors", "Ljava/util/List;");
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "add", "(Ljava/lang/Object;)Z");
        mv.visitInsn(POP);
        mv.visitInsn(RETURN);
        mv.visitMaxs(2, 2);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "getErrors", "()Ljava/util/List;",
                "()Ljava/util/List<Ljava/lang/String;>;", null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, name, "errors", "Ljava/util/List;");
        mv.visitInsn(ARETURN);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "isFailOnError", "()Z", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, name, "failOnError", "Z");
        mv.visitInsn(IRETURN);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "setFailOnError", "(Z)V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ILOAD, 1);
        mv.visitFieldInsn(PUTFIELD, name, "failOnError", "Z");
        mv.visitInsn(RETURN);
        mv.visitMaxs(2, 2);
        mv.visitEnd();
    }
    cw.visitEnd();

    byte[] b = cw.toByteArray();

    AunitClassloader ac = new AunitClassloader(treeParserClass.getClassLoader());
    return ac.defineClass(name.replace('/', '.'), b);
}

From source file:com.toolazydogs.maiden.agent.asm.IronClassVisitor.java

License:Apache License

public MethodVisitor visitMethod(int access, final String name, final String desc, String signature,
        String[] exceptions) {// w  w w  . ja va  2 s.  com
    LOGGER.entering(CLASS_NAME, "visitMethod", new Object[] { access, name, desc, signature, exceptions });

    boolean isNative = (access & ACC_NATIVE) != 0;
    boolean isSynchronized = (access & ACC_SYNCHRONIZED) != 0;
    boolean isStatic = (access & ACC_STATIC) != 0;
    MethodVisitor mv;

    /**
     * If native method prefix is supported we inject our own wrapper method.
     */
    if (nativeMethodPrefixSupported && isNative) {
        delegate.visitMethod(access, IronAgent.NATIVE_METHOD_PREFIX + name, desc, signature, exceptions);

        mv = delegate.visitMethod(access ^ (ACC_NATIVE | ACC_SYNCHRONIZED), name, desc, signature, exceptions);
    } else {
        mv = delegate.visitMethod((isSynchronized ? access ^ ACC_SYNCHRONIZED : access), name, desc, signature,
                exceptions);
    }

    mv = new WaitNotifyMethodVisitor(mv);

    BeginEndMethodVisitor bemv = new BeginEndMethodVisitor(mv, access, name, desc, signature, exceptions);

    if (isSynchronized) {
        LOGGER.finest("Method is synchronized");

        final Type classType = Type.getType("L" + clazz.replaceAll("\\.", "/") + ";.class");
        if (isStatic) {
            LOGGER.finest("Method is static");
            bemv.getListeners().add(new BeginEndMethodListener() {
                @Override
                public void begin(MethodVisitor visitor) {
                    push(visitor, line);
                    visitor.visitLdcInsn(classType);
                    visitor.visitMethodInsn(INVOKESTATIC, "com/toolazydogs/maiden/IronMaiden", "lockObject",
                            "(ILjava/lang/Object;)V");
                }

                @Override
                public void end(MethodVisitor visitor) {
                    push(visitor, line);
                    visitor.visitLdcInsn(classType);
                    visitor.visitMethodInsn(INVOKESTATIC, "com/toolazydogs/maiden/IronMaiden", "unlockObject",
                            "(ILjava/lang/Object;)V");
                }
            });
        } else {
            LOGGER.finest("Method is not static");
            bemv.getListeners().add(new BeginEndMethodListener() {
                @Override
                public void begin(MethodVisitor visitor) {
                    push(visitor, line);
                    visitor.visitVarInsn(ALOAD, 0);
                    visitor.visitMethodInsn(INVOKESTATIC, "com/toolazydogs/maiden/IronMaiden", "lockObject",
                            "(ILjava/lang/Object;)V");
                }

                @Override
                public void end(MethodVisitor visitor) {
                    push(visitor, line);
                    visitor.visitVarInsn(ALOAD, 0);
                    visitor.visitMethodInsn(INVOKESTATIC, "com/toolazydogs/maiden/IronMaiden", "unlockObject",
                            "(ILjava/lang/Object;)V");
                }
            });
        }
    }

    bemv.getListeners().add(new BeginEndMethodListener() {
        @Override
        public void begin(MethodVisitor visitor) {
            visitor.visitLdcInsn(clazz);
            visitor.visitLdcInsn(name);
            visitor.visitLdcInsn(desc);
            visitor.visitMethodInsn(INVOKESTATIC, "com/toolazydogs/maiden/IronMaiden", "push",
                    "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
        }

        @Override
        public void end(MethodVisitor visitor) {
            push(visitor, line);
            visitor.visitMethodInsn(INVOKESTATIC, "com/toolazydogs/maiden/IronMaiden", "pop", "(I)V");
        }
    });

    MethodVisitor result = new MonitorMethodVisitor(bemv);

    if (nativeMethodPrefixSupported && isNative) {
        MethodAdapter adapter = new MethodAdapter(result);
        adapter.visitCode();

        int args = 0;
        if (!isStatic)
            adapter.visitVarInsn(ALOAD, args++);
        for (Type param : Type.getArgumentTypes(desc)) {
            adapter.visitVarInsn(param.getOpcode(ILOAD), args);
            args += param.getSize();
        }
        adapter.visitMethodInsn((isStatic ? INVOKESTATIC : INVOKEVIRTUAL), clazz.replaceAll("\\.", "/"),
                IronAgent.NATIVE_METHOD_PREFIX + name, desc);

        Type returnType = Type.getReturnType(desc);
        adapter.visitInsn(returnType.getOpcode(Opcodes.IRETURN));
        adapter.visitMaxs(0, 0);
        adapter.visitEnd();

        result = null;
    }

    LOGGER.exiting(CLASS_NAME, "visitMethod", result);

    return result;
}

From source file:com.weibo.lodil.mmap.impl.GenerateHugeArrays.java

License:Apache License

public static byte[] dumpArrayList(final TypeModel tm) {
    final ClassWriter cw = new ClassWriter(0);
    FieldVisitor fv;//from  w ww. ja  v  a 2s .c  om
    MethodVisitor mv;

    final Class interfaceClass = tm.type();
    final String name = interfaceClass.getName().replace('.', '/');

    cw.visit(
            V1_5, ACC_PUBLIC + ACC_SUPER, name + "ArrayList", "L" + collections + "impl/AbstractHugeArrayList<L"
                    + name + ";L" + name + "Allocation;L" + name + "Element;>;",
            collections + "impl/AbstractHugeArrayList", null);

    cw.visitSource(tm.type().getSimpleName() + "ArrayList.java", null);

    for (final FieldModel fm : tm.fields()) {
        if (fm instanceof Enum8FieldModel) {
            fv = cw.visitField(ACC_FINAL, fm.fieldName() + "FieldModel",
                    "L" + collections + "model/Enum8FieldModel;",
                    "L" + collections + "model/Enum8FieldModel<Ljava/lang/annotation/ElementType;>;", null);
            fv.visitEnd();
        } else if (fm instanceof Enumerated16FieldModel) {
            fv = cw.visitField(ACC_FINAL, fm.fieldName() + "FieldModel",
                    "L" + collections + "model/Enumerated16FieldModel;",
                    "L" + collections + "model/Enumerated16FieldModel<Ljava/lang/String;>;", null);
            fv.visitEnd();
        }
    }
    final List<FieldModel> fields = new ArrayList<FieldModel>();
    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(L" + collections + "HugeArrayBuilder;)V", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(35, l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKESPECIAL, collections + "impl/AbstractHugeArrayList", "<init>",
                "(L" + collections + "HugeArrayBuilder;)V");
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLineNumber(29, l1);

        for (final FieldModel fm : tm.fields()) {
            if (fm instanceof Enum8FieldModel) {
                mv.visitVarInsn(ALOAD, 0);
                mv.visitTypeInsn(NEW, fm.bcModelType());
                mv.visitInsn(DUP);
                mv.visitLdcInsn(fm.fieldName());
                mv.visitIntInsn(BIPUSH, fm.fieldNumber());
                mv.visitLdcInsn(Type.getType(fm.bcLFieldType()));
                mv.visitMethodInsn(INVOKESTATIC, fm.bcFieldType(), "values", "()[" + fm.bcLFieldType());
                mv.visitMethodInsn(INVOKESPECIAL, fm.bcModelType(), "<init>",
                        "(Ljava/lang/String;ILjava/lang/Class;[Ljava/lang/Enum;)V");
                mv.visitFieldInsn(PUTFIELD, name + "ArrayList", fm.fieldName() + "FieldModel",
                        fm.bcLModelType());
                mv.visitVarInsn(ALOAD, 0);
                mv.visitFieldInsn(GETFIELD, name + "ArrayList", fm.fieldName() + "FieldModel",
                        fm.bcLModelType());
                mv.visitVarInsn(ALOAD, 1);
                mv.visitMethodInsn(INVOKEVIRTUAL, collections + "HugeArrayBuilder", "baseDirectory",
                        "()Ljava/lang/String;");
                mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcModelType(), "baseDirectory", "(Ljava/lang/String;)V");
                fields.add(fm);

            } else if (fm instanceof Enumerated16FieldModel) {
                mv.visitVarInsn(ALOAD, 0);
                mv.visitTypeInsn(NEW, fm.bcModelType());
                mv.visitInsn(DUP);
                mv.visitLdcInsn(fm.fieldName());
                mv.visitIntInsn(BIPUSH, fm.fieldNumber());
                mv.visitLdcInsn(Type.getType(fm.bcLFieldType()));
                mv.visitMethodInsn(INVOKESPECIAL, fm.bcModelType(), "<init>",
                        "(Ljava/lang/String;ILjava/lang/Class;)V");
                mv.visitFieldInsn(PUTFIELD, name + "ArrayList", fm.fieldName() + "FieldModel",
                        fm.bcLModelType());
                mv.visitVarInsn(ALOAD, 0);
                mv.visitFieldInsn(GETFIELD, name + "ArrayList", fm.fieldName() + "FieldModel",
                        fm.bcLModelType());
                mv.visitVarInsn(ALOAD, 1);
                mv.visitMethodInsn(INVOKEVIRTUAL, collections + "HugeArrayBuilder", "baseDirectory",
                        "()Ljava/lang/String;");
                mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcModelType(), "baseDirectory", "(Ljava/lang/String;)V");
                fields.add(fm);
            }
        }

        mv.visitInsn(RETURN);
        final Label l4 = new Label();
        mv.visitLabel(l4);
        mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l4, 0);
        mv.visitLocalVariable("hab", "L" + collections + "HugeArrayBuilder;", null, l0, l4, 1);
        mv.visitMaxs(7, 2);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PROTECTED, "createAllocation",
                "(L" + collections + "impl/MappedFileChannel;)L" + name + "Allocation;", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(43, l0);
        mv.visitTypeInsn(NEW, name + "Allocation");
        mv.visitInsn(DUP);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, name + "ArrayList", "allocationSize", "I");
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKESPECIAL, name + "Allocation", "<init>",
                "(IL" + collections + "impl/MappedFileChannel;)V");
        mv.visitInsn(ARETURN);
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l1, 0);
        mv.visitLocalVariable("mfc", "L" + collections + "impl/MappedFileChannel;", null, l0, l1, 1);
        mv.visitMaxs(4, 2);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PROTECTED, "createElement", "(J)L" + name + "Element;", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(48, l0);
        mv.visitTypeInsn(NEW, name + "Element");
        mv.visitInsn(DUP);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(LLOAD, 1);
        mv.visitMethodInsn(INVOKESPECIAL, name + "Element", "<init>",
                "(L" + collections + "impl/AbstractHugeArrayList;J)V");
        mv.visitInsn(ARETURN);
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l1, 0);
        mv.visitLocalVariable("n", "J", null, l0, l1, 1);
        mv.visitMaxs(5, 3);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PROTECTED, "createImpl", "()L" + name + ";", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(53, l0);
        mv.visitTypeInsn(NEW, name + "Impl");
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, name + "Impl", "<init>", "()V");
        mv.visitInsn(ARETURN);
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l1, 0);
        mv.visitMaxs(2, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PROTECTED, "compactStart", "()V", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(57, l0);
        for (final FieldModel fm : fields) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, name + "ArrayList", fm.fieldName() + "FieldModel", fm.bcLModelType());
            mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcModelType(), "compactStart", "()V");
        }
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLineNumber(58, l1);
        mv.visitInsn(RETURN);
        final Label l2 = new Label();
        mv.visitLabel(l2);
        mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l2, 0);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PROTECTED, "compactOnAllocation", "(L" + name + "Allocation;J)V", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(65, l0);
        for (final FieldModel fm : fields) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, name + "ArrayList", fm.fieldName() + "FieldModel", fm.bcLModelType());
            mv.visitVarInsn(ALOAD, 1);
            mv.visitFieldInsn(GETFIELD, name + "Allocation", "m_string", fm.bcLStoreType());
            mv.visitVarInsn(LLOAD, 2);
            mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcModelType(), "compactScan", "(" + fm.bcLStoreType() + "J)V");
        }
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLineNumber(66, l1);
        mv.visitInsn(RETURN);
        final Label l2 = new Label();
        mv.visitLabel(l2);
        mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l2, 0);
        mv.visitLocalVariable("allocation", "L" + name + "Allocation;", null, l0, l2, 1);
        mv.visitLocalVariable("thisSize", "J", null, l0, l2, 2);
        mv.visitMaxs(4, 4);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PROTECTED, "compactEnd", "()V", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(69, l0);
        for (final FieldModel fm : fields) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, name + "ArrayList", fm.fieldName() + "FieldModel", fm.bcLModelType());
            mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcModelType(), "compactEnd", "()V");
        }
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLineNumber(70, l1);
        mv.visitInsn(RETURN);
        final Label l2 = new Label();
        mv.visitLabel(l2);
        mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l2, 0);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "clear", "()V", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(74, l0);
        for (final FieldModel fm : fields) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, name + "ArrayList", fm.fieldName() + "FieldModel", fm.bcLModelType());
            mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcModelType(), "clear", "()V");
        }
        final Label l3 = new Label();
        mv.visitLabel(l3);
        mv.visitLineNumber(77, l3);
        mv.visitInsn(RETURN);
        final Label l4 = new Label();
        mv.visitLabel(l4);
        mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l4, 0);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PROTECTED + ACC_BRIDGE + ACC_SYNTHETIC, "createImpl", "()Ljava/lang/Object;",
                null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(29, l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKEVIRTUAL, name + "ArrayList", "createImpl", "()L" + name + ";");
        mv.visitInsn(ARETURN);
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l1, 0);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PROTECTED + ACC_BRIDGE + ACC_SYNTHETIC, "createElement",
                "(J)L" + collections + "impl/AbstractHugeElement;", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(29, l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(LLOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, name + "ArrayList", "createElement", "(J)L" + name + "Element;");
        mv.visitInsn(ARETURN);
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l1, 0);
        mv.visitLocalVariable("x0", "J", null, l0, l1, 1);
        mv.visitMaxs(3, 3);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PROTECTED + ACC_BRIDGE + ACC_SYNTHETIC, "compactOnAllocation",
                "(L" + collections + "api/HugeAllocation;J)V", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(29, l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitTypeInsn(CHECKCAST, name + "Allocation");
        mv.visitVarInsn(LLOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, name + "ArrayList", "compactOnAllocation",
                "(L" + name + "Allocation;J)V");
        mv.visitInsn(RETURN);
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l1, 0);
        mv.visitLocalVariable("x0", "L" + collections + "api/HugeAllocation;", null, l0, l1, 1);
        mv.visitLocalVariable("x1", "J", null, l0, l1, 2);
        mv.visitMaxs(4, 4);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PROTECTED + ACC_BRIDGE + ACC_SYNTHETIC, "createAllocation",
                "(L" + collections + "impl/MappedFileChannel;)L" + collections + "api/HugeAllocation;", null,
                null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(29, l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, name + "ArrayList", "createAllocation",
                "(L" + collections + "impl/MappedFileChannel;)L" + name + "Allocation;");
        mv.visitInsn(ARETURN);
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l1, 0);
        mv.visitLocalVariable("x0", "L" + collections + "impl/MappedFileChannel;", null, l0, l1, 1);
        mv.visitMaxs(2, 2);
        mv.visitEnd();
    }
    cw.visitEnd();
    final byte[] bytes = cw.toByteArray();
    // ClassReader cr = new ClassReader(bytes);
    // cr.accept(new ASMifierClassVisitor(new PrintWriter(System.out)), 0);
    return bytes;
}

From source file:com.weibo.lodil.mmap.impl.GenerateHugeArrays.java

License:Apache License

public static byte[] dumpAllocation(final TypeModel tm) {

    final ClassWriter cw = new ClassWriter(0);
    FieldVisitor fv;//  w w w . j a  va2s  .c o m
    MethodVisitor mv;

    final Class interfaceClass = tm.type();
    final String name = interfaceClass.getName().replace('.', '/');

    cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER, name + "Allocation", null, "java/lang/Object",
            new String[] { collections + "api/HugeAllocation" });

    cw.visitSource(tm.type().getSimpleName() + "Allocation.java", null);

    for (final FieldModel fm : tm.fields()) {
        fv = cw.visitField(0, "m_" + fm.fieldName(), fm.bcLStoreType(), null, null);
        fv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(IL" + collections + "impl/MappedFileChannel;)V", null,
                null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(46, l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");

        for (final FieldModel fm : tm.fields()) {
            mv.visitVarInsn(ALOAD, 0);

            if (fm instanceof ObjectFieldModel) {
                mv.visitLdcInsn(Type.getType(fm.bcLFieldType()));
                mv.visitVarInsn(ILOAD, 1);
                mv.visitMethodInsn(INVOKESTATIC, fm.bcModelType(), "newArrayOfField",
                        "(Ljava/lang/Class;I)[Ljava/lang/Object;");
                mv.visitTypeInsn(CHECKCAST, fm.bcLStoreType());
            } else {
                mv.visitVarInsn(ILOAD, 1);
                mv.visitVarInsn(ALOAD, 2);
                mv.visitMethodInsn(INVOKESTATIC, fm.bcModelType(), "newArrayOfField",
                        "(IL" + collections + "impl/MappedFileChannel;)" + fm.bcLStoreType());
            }
            mv.visitFieldInsn(PUTFIELD, name + "Allocation", "m_" + fm.fieldName(), fm.bcLStoreType());
        }

        mv.visitInsn(RETURN);
        final Label l14 = new Label();
        mv.visitLabel(l14);
        mv.visitLocalVariable("this", "L" + name + "Allocation;", null, l0, l14, 0);
        mv.visitLocalVariable("allocationSize", "I", null, l0, l14, 1);
        mv.visitLocalVariable("mfc", "L" + collections + "impl/MappedFileChannel;", null, l0, l14, 2);
        mv.visitMaxs(3, 3);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "clear", "()V", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(62, l0);
        for (final FieldModel fm : tm.fields()) {
            if (fm instanceof ObjectFieldModel) {
                mv.visitVarInsn(ALOAD, 0);
                mv.visitFieldInsn(GETFIELD, name + "Allocation", "m_" + fm.fieldName(), fm.bcLStoreType());
                mv.visitInsn(ACONST_NULL);
                mv.visitMethodInsn(INVOKESTATIC, "java/util/Arrays", "fill",
                        "([Ljava/lang/Object;Ljava/lang/Object;)V");
            }
        }
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLineNumber(63, l1);
        mv.visitInsn(RETURN);
        final Label l2 = new Label();
        mv.visitLabel(l2);
        mv.visitLocalVariable("this", "L" + name + "Allocation;", null, l0, l2, 0);
        mv.visitMaxs(2, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "destroy", "()V", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(66, l0);
        for (final FieldModel fm : tm.fields()) {
            if (!fm.isBufferStore()) {
                continue;
            }
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, name + "Allocation", "m_" + fm.fieldName(), fm.bcLStoreType());
            mv.visitTypeInsn(CHECKCAST, "java/nio/Buffer");
            mv.visitMethodInsn(INVOKESTATIC, GenerateHugeArrays.class.getName().replace('.', '/'), "clean",
                    "(Ljava/nio/Buffer;)V");

        }
        final Label l3 = new Label();
        mv.visitLabel(l3);
        mv.visitLineNumber(69, l3);
        mv.visitInsn(RETURN);
        final Label l4 = new Label();
        mv.visitLabel(l4);
        mv.visitLocalVariable("this", "L" + name + "Allocation;", null, l0, l4, 0);
        mv.visitLocalVariable("m", "Ljava/lang/Object;", null, l3, l4, 1);
        mv.visitMaxs(1, 2);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PROTECTED, "finalize", "()V", null, new String[] { "java/lang/Throwable" });
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(76, l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "finalize", "()V");
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLineNumber(77, l1);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKEVIRTUAL, name + "Allocation", "destroy", "()V");
        final Label l2 = new Label();
        mv.visitLabel(l2);
        mv.visitLineNumber(78, l2);
        mv.visitInsn(RETURN);
        final Label l3 = new Label();
        mv.visitLabel(l3);
        mv.visitLocalVariable("this", "L" + name + "Allocation;", null, l0, l3, 0);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }

    cw.visitEnd();
    final byte[] bytes = cw.toByteArray();
    // ClassReader cr = new ClassReader(bytes);
    // cr.accept(new ASMifierClassVisitor(new PrintWriter(System.out)), 0);
    return bytes;
}

From source file:com.weibo.lodil.mmap.impl.GenerateHugeArrays.java

License:Apache License

public static byte[] dumpElement(final TypeModel tm) {

    final ClassWriter cw = new ClassWriter(0);
    FieldVisitor fv;//www . j  a  va2  s .  c o m
    MethodVisitor mv;

    final String name = tm.bcType();

    cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER, name + "Element",
            "L" + collections + "impl/AbstractHugeElement<L" + name + "Allocation;>;L" + name
                    + ";Ljava/io/Externalizable;",
            collections + "impl/AbstractHugeElement", new String[] { name, "java/io/Externalizable" });

    cw.visitSource(tm.type().getSimpleName() + "Element.java", null);

    {
        fv = cw.visitField(0, "allocation", "L" + name + "Allocation;", null, null);
        fv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(L" + collections + "impl/AbstractHugeArrayList;J)V",
                "(L" + collections + "impl/AbstractHugeArrayList<L" + name + ";L" + name + "Allocation;L" + name
                        + "Element;>;J)V",
                null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(34, l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(LLOAD, 2);
        mv.visitMethodInsn(INVOKESPECIAL, collections + "impl/AbstractHugeElement", "<init>",
                "(L" + collections + "impl/AbstractHugeContainer;J)V");
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLineNumber(35, l1);
        mv.visitInsn(RETURN);
        final Label l2 = new Label();
        mv.visitLabel(l2);
        mv.visitLocalVariable("this", "L" + name + "Element;", null, l0, l2, 0);
        mv.visitLocalVariable("list", "L" + collections + "impl/AbstractHugeArrayList;", "L" + collections
                + "impl/AbstractHugeArrayList<L" + name + ";L" + name + "Allocation;L" + name + "Element;>;",
                l0, l2, 1);
        mv.visitLocalVariable("n", "J", null, l0, l2, 2);
        mv.visitMaxs(4, 4);
        mv.visitEnd();
    }
    for (final FieldModel fm : tm.fields()) {
        // /////// SETTER //////////

        int maxLocals = 2 + fm.bcFieldSize();

        mv = cw.visitMethod(ACC_PUBLIC, "set" + fm.titleFieldName(), "(" + fm.bcLFieldType() + ")V", null,
                null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(39, l0);

        int invoke = INVOKESTATIC;
        if (fm.virtualGetSet()) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, name + "Element", "container",
                    "L" + collections + "impl/AbstractHugeContainer;");
            mv.visitTypeInsn(CHECKCAST, name + "ArrayList");
            mv.visitFieldInsn(GETFIELD, name + "ArrayList", fm.fieldName() + "FieldModel", fm.bcLModelType());
            invoke = INVOKEVIRTUAL;
            maxLocals++;
        }

        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, name + "Element", "allocation", "L" + name + "Allocation;");
        mv.visitFieldInsn(GETFIELD, name + "Allocation", "m_" + fm.fieldName(), fm.bcLStoreType());
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, name + "Element", "offset", "I");
        mv.visitVarInsn(loadFor(fm.bcType()), 1);

        mv.visitMethodInsn(invoke, fm.bcModelType(), "set",
                "(" + fm.bcLStoreType() + "I" + fm.bcLSetType() + ")V");
        mv.visitInsn(RETURN);
        final Label l2 = new Label();
        mv.visitLabel(l2);
        mv.visitLocalVariable("this", "L" + name + "Element;", null, l0, l2, 0);
        mv.visitLocalVariable("elementType", "Ljava/lang/annotation/ElementType;", null, l0, l2, 1);
        mv.visitMaxs(maxLocals, 1 + fm.bcFieldSize());
        mv.visitEnd();

        // /////// GETTER //////////

        mv = cw.visitMethod(ACC_PUBLIC, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType(), null, null);
        mv.visitCode();
        final Label l3 = new Label();
        mv.visitLabel(l3);
        mv.visitLineNumber(144, l3);

        BCType bcType = fm.bcType();
        if (fm.virtualGetSet()) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, name + "Element", "container",
                    "L" + collections + "impl/AbstractHugeContainer;");
            mv.visitTypeInsn(CHECKCAST, name + "ArrayList");
            mv.visitFieldInsn(GETFIELD, name + "ArrayList", fm.fieldName() + "FieldModel", fm.bcLModelType());
            bcType = BCType.Reference;
        }

        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, name + "Element", "allocation", "L" + name + "Allocation;");
        mv.visitFieldInsn(GETFIELD, name + "Allocation", "m_" + fm.fieldName(), fm.bcLStoreType());
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, name + "Element", "offset", "I");
        mv.visitMethodInsn(invoke, fm.bcModelType(), "get", "(" + fm.bcLStoreType() + "I)" + fm.bcLSetType());
        if (!fm.bcLSetType().equals(fm.bcLFieldType())) {
            mv.visitTypeInsn(CHECKCAST, fm.bcFieldType());
        }
        mv.visitInsn(returnFor(bcType));
        final Label l4 = new Label();
        mv.visitLabel(l4);
        mv.visitLocalVariable("this", "L" + name + "Element;", null, l3, l4, 0);
        mv.visitMaxs(4, 2);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PROTECTED, "updateAllocation0", "(I)V", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(170, l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, name + "Element", "container",
                "L" + collections + "impl/AbstractHugeContainer;");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, name + "Element", "index", "J");
        mv.visitMethodInsn(INVOKEVIRTUAL, collections + "impl/AbstractHugeContainer", "getAllocation",
                "(J)L" + collections + "api/HugeAllocation;");
        mv.visitTypeInsn(CHECKCAST, name + "Allocation");
        mv.visitFieldInsn(PUTFIELD, name + "Element", "allocation", "L" + name + "Allocation;");
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLineNumber(171, l1);
        mv.visitInsn(RETURN);
        final Label l2 = new Label();
        mv.visitLabel(l2);
        mv.visitLocalVariable("this", "L" + name + "Element;", null, l0, l2, 0);
        mv.visitLocalVariable("allocationSize", "I", null, l0, l2, 1);
        mv.visitMaxs(4, 2);
        mv.visitEnd();
    }
    appendToStringHashCodeEqualsCopyOf(tm, cw, name + "Element", true);
    cw.visitEnd();

    final byte[] bytes = cw.toByteArray();
    // ClassReader cr = new ClassReader(bytes);
    // cr.accept(new ASMifierClassVisitor(new PrintWriter(System.out)), 0);
    return bytes;
}

From source file:com.weibo.lodil.mmap.impl.GenerateHugeArrays.java

License:Apache License

private static void appendToStringHashCodeEqualsCopyOf(final TypeModel tm, final ClassWriter cw,
        final String name2, final boolean hasListField) {
    final String name = tm.bcType();
    MethodVisitor mv;
    {//from   w w w .  j  a  v a  2 s  . co m
        mv = cw.visitMethod(ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(176, l0);
        mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V");
        mv.visitLdcInsn(tm.type().getSimpleName() + "{");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                "(Ljava/lang/String;)Ljava/lang/StringBuilder;");

        String sep = "";
        for (final FieldModel fm : tm.fields()) {
            final boolean text = CharSequence.class.isAssignableFrom(tm.type());

            mv.visitLdcInsn(sep + fm.fieldName() + "=" + (text ? "'" : ""));
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                    "(Ljava/lang/String;)Ljava/lang/StringBuilder;");
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKEVIRTUAL, name2, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType());
            String appendType = "Ljava/lang/Object;";
            final Class fmType = fm.type();
            if (fmType.isPrimitive()) {
                if ((fmType == byte.class) || (fmType == short.class)) {
                    appendType = "I";
                } else {
                    appendType = fm.bcLFieldType();
                }
            }
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                    "(" + appendType + ")Ljava/lang/StringBuilder;");
            sep = text ? "', " : ", ";
        }
        if (sep.startsWith("'")) {
            mv.visitIntInsn(BIPUSH, 39);
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                    "(C)Ljava/lang/StringBuilder;");
        }
        mv.visitIntInsn(BIPUSH, 125);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(C)Ljava/lang/StringBuilder;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;");
        mv.visitInsn(ARETURN);
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLocalVariable("this", "L" + name2 + ";", null, l0, l1, 0);
        mv.visitMaxs(3, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "equals", "(Ljava/lang/Object;)Z", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(194, l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        final Label l1 = new Label();
        mv.visitJumpInsn(IF_ACMPNE, l1);
        mv.visitInsn(ICONST_1);
        mv.visitInsn(IRETURN);
        mv.visitLabel(l1);
        mv.visitLineNumber(195, l1);
        mv.visitVarInsn(ALOAD, 1);
        final Label l2 = new Label();
        mv.visitJumpInsn(IFNULL, l2);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;");
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;");
        final Label l3 = new Label();
        mv.visitJumpInsn(IF_ACMPEQ, l3);
        mv.visitLabel(l2);
        mv.visitInsn(ICONST_0);
        mv.visitInsn(IRETURN);
        mv.visitLabel(l3);
        mv.visitLineNumber(197, l3);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitTypeInsn(CHECKCAST, name2);
        mv.visitVarInsn(ASTORE, 2);
        final Label l4 = new Label();
        mv.visitLabel(l4);
        mv.visitLineNumber(199, l4);
        final FieldModel[] fieldModels = tm.fields().clone();
        Arrays.sort(fieldModels, new Comparator<FieldModel>() {
            // reverse sort the preferences to optimise the
            public int compare(final FieldModel o1, final FieldModel o2) {
                return o2.equalsPreference() - o1.equalsPreference();
            }
        });
        for (final FieldModel fm : fieldModels) {
            // System.out.println(fm.fieldName());
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKEVIRTUAL, name2, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType());
            mv.visitVarInsn(ALOAD, 2);
            mv.visitMethodInsn(INVOKEVIRTUAL, name2, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType());
            final Label l5 = new Label();
            if (fm.isCallsNotEquals()) {
                mv.visitMethodInsn(INVOKESTATIC, fm.bcLModelType(), "notEquals",
                        "(" + fm.bcLSetType() + fm.bcLSetType() + ")Z");
                mv.visitJumpInsn(IFEQ, l5);
            } else {
                mv.visitJumpInsn(IF_ICMPEQ, l5);
            }
            mv.visitInsn(ICONST_0);
            mv.visitInsn(IRETURN);
            mv.visitLabel(l5);
        }

        mv.visitInsn(ICONST_1);
        mv.visitInsn(IRETURN);
        final Label l17 = new Label();
        mv.visitLabel(l17);
        mv.visitLocalVariable("this", "L" + name2 + ";", null, l0, l17, 0);
        mv.visitLocalVariable("o", "Ljava/lang/Object;", null, l0, l17, 1);
        mv.visitLocalVariable("that", "L" + name2 + ";", null, l4, l17, 2);
        mv.visitMaxs(4, 3);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "hashCode", "()I", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        int count = 0;
        for (final FieldModel fm : tm.fields()) {
            // if (count > 5) break;
            // System.out.println(fm.fieldName());
            if (count > 0) {
                mv.visitIntInsn(BIPUSH, 31);
                mv.visitInsn(IMUL);
            }
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKEVIRTUAL, name2, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType());
            if (fm.isCallsHashCode()) {
                mv.visitMethodInsn(INVOKESTATIC, fm.bcLModelType(), "hashCode", "(" + fm.bcLSetType() + ")I");
            }

            if (count > 0) {
                mv.visitInsn(IADD);
            }
            count++;
        }
        mv.visitInsn(IRETURN);
        final Label l3 = new Label();
        mv.visitLabel(l3);
        mv.visitLocalVariable("this", "L" + name2 + ";", null, l0, l3, 0);
        mv.visitMaxs(6, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "copyOf", "(L" + name + ";)V", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(240, l0);

        boolean copySimpleValues = false;
        for (final FieldModel fm : tm.fields()) {
            if (!fm.copySimpleValue() || !hasListField) {
                // if (true) {
                mv.visitVarInsn(ALOAD, 0);
                mv.visitVarInsn(ALOAD, 1);
                mv.visitMethodInsn(INVOKEINTERFACE, name, "get" + fm.titleFieldName(),
                        "()" + fm.bcLFieldType());
                mv.visitMethodInsn(INVOKEVIRTUAL, name2, "set" + fm.titleFieldName(),
                        "(" + fm.bcLFieldType() + ")V");
            } else {
                copySimpleValues = true;
            }
        }
        final Label l4 = new Label();
        final Label l6 = new Label();
        if (copySimpleValues) {
            final Label l3 = new Label();
            mv.visitLabel(l3);
            mv.visitLineNumber(243, l3);
            mv.visitVarInsn(ALOAD, 1);
            mv.visitTypeInsn(INSTANCEOF, name2);
            mv.visitJumpInsn(IFEQ, l4);
            final Label l5 = new Label();
            mv.visitLabel(l5);
            mv.visitLineNumber(238, l5);
            mv.visitVarInsn(ALOAD, 1);
            mv.visitTypeInsn(CHECKCAST, name2);
            mv.visitVarInsn(ASTORE, 2);
            mv.visitLabel(l6);
            mv.visitLineNumber(239, l6);
            mv.visitVarInsn(ALOAD, 2);
            mv.visitFieldInsn(GETFIELD, name2, "container", "L" + collections + "impl/AbstractHugeContainer;");
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, name2, "container", "L" + collections + "impl/AbstractHugeContainer;");
            mv.visitJumpInsn(IF_ACMPNE, l4);
            for (final FieldModel fm : tm.fields()) {
                if (fm.copySimpleValue()) {
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitFieldInsn(GETFIELD, name2, "allocation", "L" + name + "Allocation;");
                    mv.visitFieldInsn(GETFIELD, name + "Allocation", "m_" + fm.fieldName(), fm.bcLStoreType());
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitFieldInsn(GETFIELD, name2, "offset", "I");
                    mv.visitVarInsn(ALOAD, 2);
                    mv.visitFieldInsn(GETFIELD, name2, "allocation", "L" + name + "Allocation;");
                    mv.visitFieldInsn(GETFIELD, name + "Allocation", "m_" + fm.fieldName(), fm.bcLStoreType());
                    mv.visitVarInsn(ALOAD, 2);
                    mv.visitFieldInsn(GETFIELD, name2, "offset", "I");
                    mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcStoreType(), "get", "(I)" + fm.bcLStoredType());
                    mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcStoreType(), "put",
                            "(I" + fm.bcLStoredType() + ")" + fm.bcLStoreType());
                    mv.visitInsn(POP);
                }
            }
        }
        final Label l16 = new Label();
        mv.visitLabel(l16);
        mv.visitLineNumber(238, l16);
        final Label l17 = new Label();
        mv.visitJumpInsn(GOTO, l17);
        mv.visitLabel(l4);
        mv.visitLineNumber(241, l4);
        for (final FieldModel fm : tm.fields()) {
            if (fm.copySimpleValue()) {
                mv.visitVarInsn(ALOAD, 0);
                mv.visitVarInsn(ALOAD, 1);
                mv.visitMethodInsn(INVOKEINTERFACE, name, "get" + fm.titleFieldName(),
                        "()" + fm.bcLFieldType());
                mv.visitMethodInsn(INVOKEVIRTUAL, name2, "set" + fm.titleFieldName(),
                        "(" + fm.bcLFieldType() + ")V");
            }
        }
        mv.visitLabel(l17);
        mv.visitLineNumber(251, l17);
        mv.visitInsn(RETURN);
        final Label l27 = new Label();
        mv.visitLabel(l27);
        mv.visitLocalVariable("this", "L" + name2 + ";", null, l0, l27, 0);
        mv.visitLocalVariable("t", "L" + name + ";", null, l0, l27, 1);
        if (copySimpleValues) {
            mv.visitLocalVariable("mte", "L" + name + "Element;", null, l6, l4, 2);
        }
        mv.visitMaxs(4, 3);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC + ACC_BRIDGE + ACC_SYNTHETIC, "copyOf", "(Ljava/lang/Object;)V", null,
                null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(275, l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitTypeInsn(CHECKCAST, name);
        mv.visitMethodInsn(INVOKEVIRTUAL, name2, "copyOf", "(L" + name + ";)V");
        mv.visitInsn(RETURN);
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLocalVariable("this", "L" + name2 + ";", null, l0, l1, 0);
        mv.visitLocalVariable("x0", "Ljava/lang/Object;", null, l0, l1, 1);
        mv.visitMaxs(2, 2);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "writeExternal", "(Ljava/io/ObjectOutput;)V", null,
                new String[] { "java/io/IOException" });
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(185, l0);
        for (final FieldModel fm : tm.fields()) {
            mv.visitVarInsn(ALOAD, 1);
            if (fm.bcLSetType().equals(fm.bcLFieldType())) {
                mv.visitVarInsn(ALOAD, 0);
                mv.visitMethodInsn(INVOKEVIRTUAL, name2, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType());
                mv.visitMethodInsn(INVOKESTATIC, fm.bcModelType(), "write",
                        "(Ljava/io/ObjectOutput;" + fm.bcLSetType() + ")V");
            } else {
                mv.visitLdcInsn(Type.getType(fm.bcLFieldType()));
                mv.visitVarInsn(ALOAD, 0);
                mv.visitMethodInsn(INVOKEVIRTUAL, name2, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType());
                mv.visitMethodInsn(INVOKESTATIC, fm.bcModelType(), "write",
                        "(Ljava/io/ObjectOutput;Ljava/lang/Class;" + fm.bcLSetType() + ")V");
            }
        }
        final Label l13 = new Label();
        mv.visitLabel(l13);
        mv.visitLineNumber(288, l13);
        mv.visitInsn(RETURN);
        final Label l14 = new Label();
        mv.visitLabel(l14);
        mv.visitLocalVariable("this", "L" + name2 + ';', null, l0, l14, 0);
        mv.visitLocalVariable("out", "Ljava/io/ObjectOutput;", null, l0, l14, 1);
        mv.visitMaxs(4, 2);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "readExternal", "(Ljava/io/ObjectInput;)V", null,
                new String[] { "java/io/IOException", "java/lang/ClassNotFoundException" });
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(287, l0);
        for (final FieldModel fm : tm.fields()) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitVarInsn(ALOAD, 1);
            if (fm.bcLSetType().equals(fm.bcLFieldType())) {
                mv.visitMethodInsn(INVOKESTATIC, fm.bcModelType(), "read",
                        "(Ljava/io/ObjectInput;)" + fm.bcLSetType());
            } else {
                mv.visitLdcInsn(Type.getType(fm.bcLFieldType()));
                mv.visitMethodInsn(INVOKESTATIC, fm.bcModelType(), "read",
                        "(Ljava/io/ObjectInput;Ljava/lang/Class;)" + fm.bcLSetType());
                mv.visitTypeInsn(CHECKCAST, fm.bcFieldType());
            }
            mv.visitMethodInsn(INVOKEVIRTUAL, name2, "set" + fm.titleFieldName(),
                    "(" + fm.bcLFieldType() + ")V");
        }
        final Label l13 = new Label();
        mv.visitLabel(l13);
        mv.visitLineNumber(305, l13);
        mv.visitInsn(RETURN);
        final Label l14 = new Label();
        mv.visitLabel(l14);
        mv.visitLocalVariable("this", "L" + name2 + ";", null, l0, l14, 0);
        mv.visitLocalVariable("in", "Ljava/io/ObjectInput;", null, l0, l14, 1);
        mv.visitMaxs(3, 2);
        mv.visitEnd();
    }
}

From source file:com.weibo.lodil.mmap.impl.GenerateHugeArrays.java

License:Apache License

public static byte[] dumpImpl(final TypeModel tm) {

    final ClassWriter cw = new ClassWriter(0);
    FieldVisitor fv;//from  w  w  w  .  ja  v  a 2  s  .co m
    MethodVisitor mv;

    final String name = tm.bcType();

    cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER, name + "Impl",
            "Ljava/lang/Object;L" + name + ";L" + collections + "api/HugeElement<L" + name
                    + ";>;Ljava/io/Externalizable;",
            "java/lang/Object",
            new String[] { name, collections + "api/HugeElement", "java/io/Externalizable" });

    cw.visitSource(tm.getClass().getSimpleName() + "Impl.java", null);

    for (final FieldModel fm : tm.fields()) {
        fv = cw.visitField(ACC_PRIVATE, "m_" + fm.fieldName(), fm.bcLFieldType(), null, null);
        fv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(30, l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
        mv.visitInsn(RETURN);
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLocalVariable("this", "L" + name + "Impl;", null, l0, l1, 0);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    for (final FieldModel fm : tm.fields()) {
        mv = cw.visitMethod(ACC_PUBLIC, "set" + fm.titleFieldName(), "(" + fm.bcLFieldType() + ")V", null,
                null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(47, l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(loadFor(fm.bcType()), 1);
        mv.visitFieldInsn(PUTFIELD, name + "Impl", "m_" + fm.fieldName(), fm.bcLFieldType());
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLineNumber(48, l1);
        mv.visitInsn(RETURN);
        final Label l2 = new Label();
        mv.visitLabel(l2);
        mv.visitLocalVariable("this", "L" + name + "Impl;", null, l0, l2, 0);
        mv.visitLocalVariable("b", fm.bcLFieldType(), null, l0, l2, 1);
        mv.visitMaxs(1 + fm.bcFieldSize(), 1 + fm.bcFieldSize());
        mv.visitEnd();

        mv = cw.visitMethod(ACC_PUBLIC, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType(), null, null);
        mv.visitCode();
        final Label l3 = new Label();
        mv.visitLabel(l3);
        mv.visitLineNumber(45, l3);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, name + "Impl", "m_" + fm.fieldName(), fm.bcLFieldType());
        mv.visitInsn(returnFor(fm.bcType()));
        final Label l4 = new Label();
        mv.visitLabel(l4);
        mv.visitLocalVariable("this", "L" + name + "Impl;", null, l3, l4, 0);
        mv.visitMaxs(1 + fm.bcFieldSize(), 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "index", "(J)V", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(175, l0);
        mv.visitTypeInsn(NEW, "java/lang/UnsupportedOperationException");
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/UnsupportedOperationException", "<init>", "()V");
        mv.visitInsn(ATHROW);
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLocalVariable("this", "L" + name + "Impl;", null, l0, l1, 0);
        mv.visitLocalVariable("n", "J", null, l0, l1, 1);
        mv.visitMaxs(2, 3);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "index", "()J", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(180, l0);
        mv.visitInsn(LCONST_0);
        mv.visitInsn(LRETURN);
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLocalVariable("this", "L" + name + "Impl;", null, l0, l1, 0);
        mv.visitMaxs(2, 1);
        mv.visitEnd();
    }
    appendToStringHashCodeEqualsCopyOf(tm, cw, name + "Impl", false);

    {
        mv = cw.visitMethod(ACC_PUBLIC, "hugeElementType", "()L" + collections + "api/HugeElementType;", null,
                null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(236, l0);
        mv.visitFieldInsn(GETSTATIC, collections + "api/HugeElementType", "BeanImpl",
                "L" + collections + "api/HugeElementType;");
        mv.visitInsn(ARETURN);
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLocalVariable("this", "L" + name + "Impl;", null, l0, l1, 0);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    cw.visitEnd();

    final byte[] bytes = cw.toByteArray();
    // ClassReader cr = new ClassReader(bytes);
    // cr.accept(new ASMifierClassVisitor(new PrintWriter(System.out)), 0);

    return bytes;
}

From source file:de.chimos.property.compiler.passtwo.javafx.PassTwoJFXClassVisitor.java

License:Open Source License

protected void generatePropertyMethod(PropertyInfo property) {
    MethodVisitor mv = cv.visitMethod(property.writeAccessLevel + ACC_FINAL, property.propertyMethodName,
            "()" + property.propertyInterfaceSignature,
            property.propertyInterfaceSignatureGeneric != null
                    ? "()" + property.propertyInterfaceSignatureGeneric
                    : null,//from  w  w w . j  ava  2 s.co m
            null);
    {
        AnnotationVisitor av0 = mv.visitAnnotation("L" + Property.class.getName().replace('.', '/') + ";",
                true);
        av0.visit("writeable", Boolean.TRUE);
        av0.visit("name", property.propertyName);
        av0.visit("dataSignature", property.dataSignature);
        av0.visit("dataSignatureGeneric",
                property.dataSignatureGeneric != null ? property.dataSignatureGeneric : "");
        av0.visit("humanReadableName",
                property.humanReadablePropertyName != null ? property.humanReadablePropertyName : "");
        av0.visitEnd();
    }
    mv.visitCode();
    Label l0 = new Label();
    mv.visitLabel(l0);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, className, property.propertyFieldName, property.propertyDataSignature);
    Label l1 = new Label();
    mv.visitJumpInsn(IFNONNULL, l1);
    Label l2 = new Label();
    mv.visitLabel(l2);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitTypeInsn(NEW, property.propertyDataType);
    mv.visitInsn(DUP);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitLdcInsn(property.propertyName);
    mv.visitMethodInsn(INVOKESPECIAL, property.propertyDataType, "<init>",
            "(Ljava/lang/Object;Ljava/lang/String;)V");
    mv.visitFieldInsn(PUTFIELD, className, property.propertyFieldName, property.propertyDataSignature);
    mv.visitLabel(l1);
    mv.visitFrame(F_SAME, 0, null, 0, null);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, className, property.propertyFieldName, property.propertyDataSignature);
    mv.visitTypeInsn(CHECKCAST, property.propertyInterfaceType);
    mv.visitInsn(ARETURN);
    Label l3 = new Label();
    mv.visitLabel(l3);
    mv.visitLocalVariable("this", "L" + className + ";", null, l0, l3, 0);
    mv.visitMaxs(5, 1);
    mv.visitEnd();
}