Example usage for org.objectweb.asm MethodVisitor visitFrame

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

Introduction

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

Prototype

public void visitFrame(final int type, final int numLocal, final Object[] local, final int numStack,
        final Object[] stack) 

Source Link

Document

Visits the current state of the local variables and operand stack elements.

Usage

From source file:com.cinnober.msgcodec.blink.BaseByteCodeGenerator.java

License:Open Source License

protected void generateDecodeRefValue(GroupDef refGroup, boolean required, MethodVisitor mv, int byteSourceVar,
        String genClassInternalName, Class<?> javaClass, TypeDef type, boolean javaClassCodec)
        throws IllegalArgumentException {
    if (refGroup != null) {
        String groupDescriptor = getTypeDescriptor(javaClass, javaClassCodec);
        if (required) {
            mv.visitInsn(POP); // input stream
            mv.visitVarInsn(ALOAD, 0);/*from   w  w w . j  a v  a2s  . c om*/
            mv.visitVarInsn(ALOAD, byteSourceVar);
            mv.visitMethodInsn(INVOKEVIRTUAL, genClassInternalName, "readStaticGroup_" + refGroup.getName(),
                    "(Lcom/cinnober/msgcodec/io/ByteSource;)" + groupDescriptor, false);
        } else {
            mv.visitMethodInsn(INVOKESTATIC, blinkInputIName, "readPresenceByte",
                    "(Lcom/cinnober/msgcodec/io/ByteSource;)Z", false);
            Label nonNullLabel = new Label();
            Label endLabel = new Label();
            mv.visitJumpInsn(IFNE, nonNullLabel); // not false, i.e. true
            // null
            mv.visitInsn(ACONST_NULL);
            mv.visitJumpInsn(GOTO, endLabel);

            // not null
            mv.visitLabel(nonNullLabel);
            mv.visitFrame(F_SAME, 0, null, 0, null);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitVarInsn(ALOAD, byteSourceVar);
            mv.visitMethodInsn(INVOKEVIRTUAL, genClassInternalName, "readStaticGroup_" + refGroup.getName(),
                    "(Lcom/cinnober/msgcodec/io/ByteSource;)" + groupDescriptor, false);

            mv.visitLabel(endLabel);
            // PENDING: mv.visitFrame?
            mv.visitFrame(F_SAME, 0, null, 0, null);
        }
    } else {
        throw new IllegalArgumentException("Illegal reference: " + type);
    }
}

From source file:com.cinnober.msgcodec.blink.BaseByteCodeGenerator.java

License:Open Source License

protected void generateDecodeSequenceValue(Class<?> javaClass, LocalVariable nextVar, boolean required,
        MethodVisitor mv, Class<?> componentJavaClass, int byteSourceVar, TypeDef type, Schema schema,
        String genClassInternalName, String fieldIdentifier, String debugValueLabel, boolean javaClassCodec)
        throws IllegalArgumentException {
    if (!javaClass.isArray() && javaClass != List.class) {
        throw new IllegalArgumentException("Illegal sequence javaClass: " + javaClass);
    }/*from  w ww .jav  a 2 s. co  m*/

    int lengthVar = nextVar.next();
    int sequenceVar = nextVar.next();
    Label finalEndLabel = new Label();
    if (required) {
        mv.visitMethodInsn(INVOKESTATIC, blinkInputIName, "readUInt32",
                "(Lcom/cinnober/msgcodec/io/ByteSource;)I", false);
        mv.visitVarInsn(ISTORE, lengthVar);
    } else {
        mv.visitMethodInsn(INVOKESTATIC, blinkInputIName, "readUInt32Null",
                "(Lcom/cinnober/msgcodec/io/ByteSource;)Ljava/lang/Integer;", false);
        mv.visitInsn(DUP);
        mv.visitJumpInsn(IFNULL, finalEndLabel);
        unbox(mv, Integer.class);
        mv.visitVarInsn(ISTORE, lengthVar);
    }

    if (javaClass.isArray()) {
        mv.visitVarInsn(ILOAD, lengthVar);
        generateNewArray(mv, componentJavaClass);
    } else {
        mv.visitTypeInsn(NEW, "java/util/ArrayList");
        mv.visitInsn(DUP);
        mv.visitVarInsn(ILOAD, lengthVar);
        mv.visitMethodInsn(INVOKESPECIAL, "java/util/ArrayList", "<init>", "(I)V", false);
    }
    mv.visitVarInsn(ASTORE, sequenceVar);

    // for loop
    Label endLabel = new Label();
    int loopVar = nextVar.next();
    mv.visitInsn(ICONST_0);
    mv.visitVarInsn(ISTORE, loopVar);
    Label loopLabel = new Label();
    mv.visitLabel(loopLabel);
    // PENDING: mv.visitFrame?
    mv.visitFrame(F_SAME, 0, null, 0, null);
    mv.visitVarInsn(ILOAD, loopVar);
    mv.visitVarInsn(ILOAD, lengthVar);
    mv.visitJumpInsn(IF_ICMPGE, endLabel);

    mv.visitVarInsn(ALOAD, sequenceVar);
    mv.visitVarInsn(ILOAD, loopVar);
    mv.visitVarInsn(ALOAD, byteSourceVar);

    // decode the element
    TypeDef.Sequence seqType = (TypeDef.Sequence) type;
    generateDecodeValue(mv, byteSourceVar, nextVar, true, seqType.getComponentType(), componentJavaClass, null,
            schema, genClassInternalName, fieldIdentifier, debugValueLabel + ".component", javaClassCodec);

    // store the value
    if (javaClass.isArray()) {
        generateArrayStore(mv, componentJavaClass);
    } else {
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/util/ArrayList", "add", "(ILjava/lang/Object;)V", false);
    }

    mv.visitIincInsn(loopVar, 1);
    mv.visitJumpInsn(GOTO, loopLabel);
    mv.visitLabel(endLabel);
    mv.visitFrame(F_SAME, 0, null, 0, null);
    mv.visitVarInsn(ALOAD, sequenceVar);
    mv.visitLabel(finalEndLabel);
    mv.visitFrame(F_SAME, 0, null, 0, null);
    if (javaClass.isArray()) {
        mv.visitTypeInsn(CHECKCAST, Type.getInternalName(javaClass));
    }
}

From source file:com.github.wolf480pl.mias4j.MakeTestMH.java

License:Open Source License

public static byte[] dump() throws Exception {

    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
    MethodVisitor mv;

    cw.visit(V1_7, ACC_PUBLIC + ACC_SUPER, "TestMH", null, "java/lang/Object", null);

    cw.visitInnerClass("java/lang/invoke/MethodHandles$Lookup", "java/lang/invoke/MethodHandles", "Lookup",
            ACC_PUBLIC + ACC_FINAL + ACC_STATIC);

    {/*from ww w.  ja  v a  2 s. co m*/
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
        mv.visitInsn(RETURN);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);
        mv.visitCode();
        Label l0 = new Label();
        Label l1 = new Label();
        Label l2 = new Label();
        mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Throwable");
        mv.visitLabel(l0);
        /*mv.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodHandles", "lookup", "()Ljava/lang/invoke/MethodHandles$Lookup;", false);
        mv.visitLdcInsn(Type.getType("Ljava/io/PrintStream;"));
        mv.visitLdcInsn("println");
        mv.visitFieldInsn(GETSTATIC, "java/lang/Void", "TYPE", "Ljava/lang/Class;");
        mv.visitLdcInsn(Type.getType("Ljava/lang/String;"));
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodType", "methodType", "(Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/invoke/MethodType;", false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandles$Lookup", "findVirtual", "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;", false);*/
        mv.visitLdcInsn(new Handle(H_INVOKEVIRTUAL, "java/io/PrintStream", "println",
                Type.getMethodDescriptor(Type.VOID_TYPE, Type.getType(String.class))));
        mv.visitVarInsn(ASTORE, 1);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
        mv.visitLdcInsn("hey");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invoke",
                "(Ljava/io/PrintStream;Ljava/lang/String;)V", false);
        mv.visitLabel(l1);
        Label l3 = new Label();
        mv.visitJumpInsn(GOTO, l3);
        mv.visitLabel(l2);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/Throwable" });
        mv.visitVarInsn(ASTORE, 1);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Throwable", "printStackTrace", "()V", false);
        mv.visitLabel(l3);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitInsn(RETURN);
        mv.visitMaxs(5, 2);
        mv.visitEnd();
    }
    cw.visitEnd();

    return cw.toByteArray();
}

From source file:com.google.devtools.build.android.desugar.Bug62060793TestDataGenerator.java

License:Open Source License

private static byte[] createClass() {
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    MethodVisitor mv;
    cw.visit(V1_8, ACC_PUBLIC | ACC_SUPER, CLASS_NAME, null, "java/lang/Object", null);

    cw.visitInnerClass(INTERFACE_TYPE_NAME, CLASS_NAME, "Interface",
            ACC_PUBLIC | ACC_STATIC | ACC_ABSTRACT | ACC_INTERFACE);

    cw.visitInnerClass("java/lang/invoke/MethodHandles$Lookup", "java/lang/invoke/MethodHandles", "Lookup",
            ACC_PUBLIC | ACC_FINAL | ACC_STATIC);

    {/*w w w.  j  a v  a2s  .c  o m*/
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
        mv.visitInsn(RETURN);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PRIVATE | ACC_STATIC, "method", "(Ljava/lang/String;)Ljava/lang/String;", null,
                null);
        mv.visitParameter("str", 0);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitInsn(ARETURN);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PRIVATE | ACC_STATIC, "method",
                "(ZCBFDJISLjava/lang/Object;[Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/String;", null,
                null);
        mv.visitParameter("bool", 0);
        mv.visitParameter("c", 0);
        mv.visitParameter("b", 0);
        mv.visitParameter("f", 0);
        mv.visitParameter("d", 0);
        mv.visitParameter("l", 0);
        mv.visitParameter("i", 0);
        mv.visitParameter("s", 0);
        mv.visitParameter("o", 0);
        mv.visitParameter("array", 0);
        mv.visitParameter("str", 0);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 10);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/String", "valueOf",
                "(Ljava/lang/Object;)Ljava/lang/String;", false);
        mv.visitVarInsn(ASTORE, 13);
        mv.visitVarInsn(ALOAD, 11);
        Label l0 = new Label();
        mv.visitJumpInsn(IFNONNULL, l0);
        mv.visitInsn(ICONST_1);
        Label l1 = new Label();
        mv.visitJumpInsn(GOTO, l1);
        mv.visitLabel(l0);
        mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] { "java/lang/String" }, 0, null);
        mv.visitInsn(ICONST_0);
        mv.visitLabel(l1);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { Opcodes.INTEGER });
        mv.visitVarInsn(ISTORE, 14);
        mv.visitIntInsn(BIPUSH, 91);
        mv.visitVarInsn(ALOAD, 12);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/String", "valueOf",
                "(Ljava/lang/Object;)Ljava/lang/String;", false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "length", "()I", false);
        mv.visitInsn(IADD);
        mv.visitVarInsn(ALOAD, 13);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/String", "valueOf",
                "(Ljava/lang/Object;)Ljava/lang/String;", false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "length", "()I", false);
        mv.visitInsn(IADD);
        mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
        mv.visitInsn(DUP_X1);
        mv.visitInsn(SWAP);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(I)V", false);
        mv.visitVarInsn(ALOAD, 12);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
        mv.visitVarInsn(ILOAD, 0);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Z)Ljava/lang/StringBuilder;",
                false);
        mv.visitVarInsn(ILOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(C)Ljava/lang/StringBuilder;",
                false);
        mv.visitVarInsn(ILOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(I)Ljava/lang/StringBuilder;",
                false);
        mv.visitVarInsn(FLOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(F)Ljava/lang/StringBuilder;",
                false);
        mv.visitVarInsn(DLOAD, 4);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(D)Ljava/lang/StringBuilder;",
                false);
        mv.visitVarInsn(LLOAD, 6);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(J)Ljava/lang/StringBuilder;",
                false);
        mv.visitVarInsn(ILOAD, 8);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(I)Ljava/lang/StringBuilder;",
                false);
        mv.visitVarInsn(ILOAD, 9);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(I)Ljava/lang/StringBuilder;",
                false);
        mv.visitVarInsn(ALOAD, 13);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
        mv.visitVarInsn(ILOAD, 14);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Z)Ljava/lang/StringBuilder;",
                false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
        mv.visitInsn(ARETURN);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "lambdaWithConstantArguments",
                "()L" + INTERFACE_TYPE_NAME + ";", null, null);
        mv.visitCode();
        mv.visitInsn(ICONST_0);
        mv.visitInsn(ICONST_1);
        mv.visitInsn(ICONST_2);
        mv.visitInsn(FCONST_0);
        mv.visitInsn(DCONST_0);
        mv.visitInsn(LCONST_0);
        mv.visitInsn(ICONST_4);
        mv.visitIntInsn(SIPUSH, 9);
        mv.visitInsn(ACONST_NULL);
        mv.visitInsn(ACONST_NULL);
        mv.visitInvokeDynamicInsn("call",
                "(ZCBFDJISLjava/lang/Object;[Ljava/lang/Object;)L" + INTERFACE_TYPE_NAME + ";",
                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;",
                        false),
                new Object[] { Type.getType("(Ljava/lang/String;)Ljava/lang/String;"),
                        new Handle(Opcodes.H_INVOKESTATIC, CLASS_NAME, "method",
                                "(ZCBFDJISLjava/lang/Object;[Ljava/lang/Object;Ljava/lang/String;"
                                        + ")Ljava/lang/String;",
                                false),
                        Type.getType("(Ljava/lang/String;)Ljava/lang/String;") });
        mv.visitInsn(ARETURN);
        mv.visitEnd();
    }

    cw.visitEnd();

    return cw.toByteArray();
}

From source file:com.google.devtools.build.android.desugar.CoreLibrarySupport.java

License:Open Source License

private void makeDispatchHelperMethod(ClassVisitor helper, EmulatedMethod method,
        ImmutableList<Class<?>> typechecks) {
    checkArgument(method.owner().isInterface());
    String owner = method.owner().getName().replace('.', '/');
    Type methodType = Type.getMethodType(method.descriptor());
    String companionDesc = InterfaceDesugaring.companionDefaultMethodDescriptor(owner, method.descriptor());
    MethodVisitor dispatchMethod = helper.visitMethod(method.access() | Opcodes.ACC_STATIC, method.name(),
            companionDesc, /*signature=*/ null, // signature is invalid due to extra "receiver" argument
            method.exceptions().toArray(EMPTY_LIST));

    dispatchMethod.visitCode();//from  w w w. j av a2 s . c o m
    {
        // See if the receiver might come with its own implementation of the method, and call it.
        // We do this by testing for the interface type created by EmulatedInterfaceRewriter
        Label fallthrough = new Label();
        String emulationInterface = renameCoreLibrary(owner);
        dispatchMethod.visitVarInsn(Opcodes.ALOAD, 0); // load "receiver"
        dispatchMethod.visitTypeInsn(Opcodes.INSTANCEOF, emulationInterface);
        dispatchMethod.visitJumpInsn(Opcodes.IFEQ, fallthrough);
        dispatchMethod.visitVarInsn(Opcodes.ALOAD, 0); // load "receiver"
        dispatchMethod.visitTypeInsn(Opcodes.CHECKCAST, emulationInterface);

        visitLoadArgs(dispatchMethod, methodType, 1 /* receiver already loaded above */);
        dispatchMethod.visitMethodInsn(Opcodes.INVOKEINTERFACE, emulationInterface, method.name(),
                method.descriptor(), /*itf=*/ true);
        dispatchMethod.visitInsn(methodType.getReturnType().getOpcode(Opcodes.IRETURN));

        dispatchMethod.visitLabel(fallthrough);
        // Trivial frame for the branch target: same empty stack as before
        dispatchMethod.visitFrame(Opcodes.F_SAME, 0, EMPTY_FRAME, 0, EMPTY_FRAME);
    }

    // Next, check for subtypes with specialized implementations and call them
    for (Class<?> tested : typechecks) {
        Label fallthrough = new Label();
        String testedName = tested.getName().replace('.', '/');
        // In case of a class this must be a member move; for interfaces use the companion.
        String target = tested.isInterface() ? InterfaceDesugaring.getCompanionClassName(testedName)
                : checkNotNull(memberMoves.get(rewriter.unprefix(testedName) + '#' + method.name()));
        dispatchMethod.visitVarInsn(Opcodes.ALOAD, 0); // load "receiver"
        dispatchMethod.visitTypeInsn(Opcodes.INSTANCEOF, testedName);
        dispatchMethod.visitJumpInsn(Opcodes.IFEQ, fallthrough);
        dispatchMethod.visitVarInsn(Opcodes.ALOAD, 0); // load "receiver"
        dispatchMethod.visitTypeInsn(Opcodes.CHECKCAST, testedName); // make verifier happy

        visitLoadArgs(dispatchMethod, methodType, 1 /* receiver already loaded above */);
        dispatchMethod.visitMethodInsn(Opcodes.INVOKESTATIC, target, method.name(),
                InterfaceDesugaring.companionDefaultMethodDescriptor(testedName, method.descriptor()),
                /*itf=*/ false);
        dispatchMethod.visitInsn(methodType.getReturnType().getOpcode(Opcodes.IRETURN));

        dispatchMethod.visitLabel(fallthrough);
        // Trivial frame for the branch target: same empty stack as before
        dispatchMethod.visitFrame(Opcodes.F_SAME, 0, EMPTY_FRAME, 0, EMPTY_FRAME);
    }

    // Call static type's default implementation in companion class
    dispatchMethod.visitVarInsn(Opcodes.ALOAD, 0); // load "receiver"
    visitLoadArgs(dispatchMethod, methodType, 1 /* receiver already loaded above */);
    dispatchMethod.visitMethodInsn(Opcodes.INVOKESTATIC, InterfaceDesugaring.getCompanionClassName(owner),
            method.name(), companionDesc, /*itf=*/ false);
    dispatchMethod.visitInsn(methodType.getReturnType().getOpcode(Opcodes.IRETURN));

    dispatchMethod.visitMaxs(0, 0);
    dispatchMethod.visitEnd();
}

From source file:com.googlecode.ddom.weaver.asm.MethodVisitorTee.java

License:Apache License

public void visitFrame(int type, int nLocal, Object[] local, int nStack, Object[] stack) {
    for (MethodVisitor visitor : visitors) {
        visitor.visitFrame(type, nLocal, local, nStack, stack);
    }/*from  w  w w  .  j  av a 2  s  . c  o m*/
}

From source file:com.ibm.layout.GenArray1D.java

License:Open Source License

/**
 * Generate bytecodes for runtime class//from  w ww  .ja  v  a2s  .  com
 * 
 * @return byte array containing bytecodes for runtime class
 * @throws Exception
 */
public byte[] genBytecode() throws Exception {
    ClassWriter cw = new ClassWriter(0);
    MethodVisitor mv;
    FieldVisitor fv;
    final boolean itf = false;

    /* If user-defined array class is supplied, use it as superclass, and use its name instead of generating it */
    cw.visit(V1_8, ACC_FINAL + ACC_SUPER, arrayImplClassName, arrayInterfaceClassSig, "java/lang/Object",
            new String[] { arrayInterfaceClassName });
    {
        fv = cw.visitField(ACC_PROTECTED + ACC_FINAL, "elementSize", "J", null, null);
        fv.visitEnd();
    }
    {
        fv = cw.visitField(ACC_PRIVATE + ACC_FINAL, "arraySize", "J", null, null);
        fv.visitEnd();
    }
    {
        fv = cw.visitField(ACC_PROTECTED + ACC_FINAL, "length", "J", null, null);
        fv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PROTECTED, "<init>", "(JJ)V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(LLOAD, 1);
        mv.visitFieldInsn(PUTFIELD, arrayImplClassName, "length", "J");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(LLOAD, 3);
        mv.visitFieldInsn(PUTFIELD, arrayImplClassName, "elementSize", "J");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(LLOAD, 1);
        mv.visitVarInsn(LLOAD, 3);
        mv.visitInsn(LMUL);
        mv.visitFieldInsn(PUTFIELD, arrayImplClassName, "arraySize", "J");
        mv.visitInsn(RETURN);
        mv.visitMaxs(5, 5);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "sizeof", "()J", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, arrayImplClassName, "arraySize", "J");
        mv.visitInsn(LRETURN);
        mv.visitMaxs(2, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null);
        mv.visitCode();
        mv.visitTypeInsn(NEW, "java/lang/StringBuffer");
        mv.visitInsn(DUP);
        mv.visitLdcInsn("[");
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuffer", "<init>", "(Ljava/lang/String;)V", false);
        mv.visitVarInsn(ASTORE, 1);
        mv.visitInsn(LCONST_0);
        mv.visitVarInsn(LSTORE, 2);
        Label l0 = new Label();
        mv.visitJumpInsn(GOTO, l0);
        Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitFrame(Opcodes.F_APPEND, 2, new Object[] { "java/lang/StringBuffer", Opcodes.LONG }, 0, null);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
        mv.visitInsn(DUP);
        mv.visitLdcInsn(" ");
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V", false);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(LLOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, arrayImplClassName, "at", "(J)L" + elementInterfaceClassName + ";",
                false);
        mv.visitMethodInsn(INVOKEINTERFACE, elementInterfaceClassName, "toString", "()Ljava/lang/String;",
                true);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuffer", "append",
                "(Ljava/lang/String;)Ljava/lang/StringBuffer;", false);
        mv.visitInsn(POP);
        mv.visitVarInsn(LLOAD, 2);
        mv.visitInsn(LCONST_1);
        mv.visitInsn(LADD);
        mv.visitVarInsn(LSTORE, 2);
        mv.visitLabel(l0);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitVarInsn(LLOAD, 2);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, arrayImplClassName, "length", "J");
        mv.visitInsn(LCMP);
        mv.visitJumpInsn(IFLT, l1);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitLdcInsn(" ]");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuffer", "append",
                "(Ljava/lang/String;)Ljava/lang/StringBuffer;", false);
        mv.visitInsn(POP);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuffer", "toString", "()Ljava/lang/String;", false);
        mv.visitInsn(ARETURN);
        mv.visitMaxs(5, 4);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "getComponentType", "()Ljava/lang/Class;",
                "()Ljava/lang/Class<*>;", null);
        mv.visitCode();
        mv.visitLdcInsn(Type.getType("L" + elementInterfaceClassName + ";"));
        mv.visitInsn(ARETURN);
        mv.visitMaxs(1, 0);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "getLength", "()J", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, arrayImplClassName, "length", "J");
        mv.visitInsn(LRETURN);
        mv.visitMaxs(2, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "at", "(J)L" + elementInterfaceClassName + ";", null, null);
        mv.visitCode();
        mv.visitTypeInsn(NEW, elementImplClassName);
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, elementImplClassName, "<init>", "()V", itf);
        mv.visitVarInsn(ASTORE, 3);
        mv.visitTypeInsn(NEW, "com/ibm/layout/Location");
        mv.visitInsn(DUP);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
        mv.visitVarInsn(LLOAD, 1);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, elementImplClassName, "sizeof", "()J", itf);
        mv.visitInsn(LMUL);
        mv.visitMethodInsn(INVOKESPECIAL, "com/ibm/layout/Location", "<init>", "(Lcom/ibm/layout/Location;J)V",
                itf);
        mv.visitVarInsn(ASTORE, 4);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitMethodInsn(INVOKEVIRTUAL, elementImplClassName, "bindLocation", "(Lcom/ibm/layout/Location;)V",
                itf);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitInsn(ARETURN);
        mv.visitMaxs(7, 5);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "range", "(JJ)Lcom/ibm/layout/Array1D;",
                "(JJ)Lcom/ibm/layout/Array1D<" + elementInterfaceClassName + ";>;", null);
        mv.visitCode();
        mv.visitTypeInsn(NEW, arrayImplClassName);
        mv.visitInsn(DUP);
        mv.visitVarInsn(LLOAD, 3);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "elementSize", "J");
        mv.visitMethodInsn(INVOKESPECIAL, this.arrayImplClassName, "<init>", "(JJ)V", itf);
        mv.visitVarInsn(ASTORE, 5);
        mv.visitTypeInsn(NEW, "com/ibm/layout/Location");
        mv.visitInsn(DUP);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
        mv.visitVarInsn(LLOAD, 1);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, arrayImplClassName, "elementSize", "J");
        mv.visitInsn(LMUL);
        mv.visitMethodInsn(INVOKESPECIAL, "com/ibm/layout/Location", "<init>", "(Lcom/ibm/layout/Location;J)V",
                itf);
        mv.visitVarInsn(ASTORE, 6);
        mv.visitVarInsn(ALOAD, 5);
        mv.visitVarInsn(ALOAD, 6);
        mv.visitMethodInsn(INVOKEVIRTUAL, arrayImplClassName, "bindLocation", "(Lcom/ibm/layout/Location;)V",
                itf);
        mv.visitVarInsn(ALOAD, 5);
        mv.visitInsn(ARETURN);
        mv.visitMaxs(7, 7);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "put", "(JL" + elementInterfaceClassName + ";)V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(LLOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, arrayImplClassName, "at", "(J)L" + elementInterfaceClassName + ";",
                itf);
        mv.visitTypeInsn(CHECKCAST, elementImplClassName);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitTypeInsn(CHECKCAST, elementImplClassName);
        mv.visitMethodInsn(INVOKEVIRTUAL, elementImplClassName, "copyFrom", "(L" + elementImplClassName + ";)V",
                itf);
        mv.visitInsn(RETURN);
        mv.visitMaxs(3, 4);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC + ACC_BRIDGE + ACC_SYNTHETIC, "at", "(J)Lcom/ibm/layout/Layout;", null,
                null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(LLOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, arrayImplClassName, "at", "(J)L" + elementInterfaceClassName + ";",
                itf);
        mv.visitInsn(ARETURN);
        mv.visitMaxs(3, 3);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC + ACC_BRIDGE + ACC_SYNTHETIC, "put", "(JLcom/ibm/layout/Layout;)V", null,
                null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(LLOAD, 1);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitTypeInsn(CHECKCAST, elementInterfaceClassName);
        mv.visitMethodInsn(INVOKEVIRTUAL, arrayImplClassName, "put", "(JL" + elementInterfaceClassName + ";)V",
                itf);
        mv.visitInsn(RETURN);
        mv.visitMaxs(4, 4);
        mv.visitEnd();
    }

    ImplHelper.genLayoutTypeImpl(cw, mv, fv, arrayImplClassName, false);

    cw.visitEnd();

    return cw.toByteArray();
}

From source file:com.ibm.layout.GenArray2D.java

License:Open Source License

/**
 * Generate bytecodes for runtime class//www  . j  a va2s  . c  o  m
 * 
 * @return byte array containing bytecodes for runtime class
 * @throws Exception
 */
public byte[] genBytecode() throws Exception {

    ClassWriter cw = new ClassWriter(0);
    MethodVisitor mv = null;
    FieldVisitor fv = null;
    final boolean itf = false;

    cw.visit(V1_8, ACC_FINAL + ACC_SUPER, arrayImplClassName, arrayInterfaceClassSig, "java/lang/Object",
            new String[] { arrayInterfaceClassName });
    {
        fv = cw.visitField(ACC_PROTECTED + ACC_FINAL, "dim1", "J", null, null);
        fv.visitEnd();
    }
    {
        fv = cw.visitField(ACC_PROTECTED + ACC_FINAL, "dim2", "J", null, null);
        fv.visitEnd();
    }
    {
        fv = cw.visitField(ACC_PRIVATE + ACC_FINAL, "elementSize", "J", null, null);
        fv.visitEnd();
    }
    {
        fv = cw.visitField(ACC_PRIVATE + ACC_FINAL, "arraySize", "J", null, null);
        fv.visitEnd();
    }

    {
        mv = cw.visitMethod(ACC_PROTECTED, "<init>", "(JJJ)V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(LLOAD, 1);
        mv.visitFieldInsn(PUTFIELD, arrayImplClassName, "dim1", "J");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(LLOAD, 3);
        mv.visitFieldInsn(PUTFIELD, arrayImplClassName, "dim2", "J");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(LLOAD, 5);
        mv.visitFieldInsn(PUTFIELD, arrayImplClassName, "elementSize", "J");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(LLOAD, 5);
        mv.visitVarInsn(LLOAD, 1);
        mv.visitInsn(LMUL);
        mv.visitVarInsn(LLOAD, 3);
        mv.visitInsn(LMUL);
        mv.visitFieldInsn(PUTFIELD, arrayImplClassName, "arraySize", "J");
        mv.visitInsn(RETURN);
        mv.visitMaxs(5, 7);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "at", "(JJ)L" + elementInterfaceClassName + ";", null, null);
        mv.visitCode();
        mv.visitTypeInsn(NEW, elementImplClassName);
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, elementImplClassName, "<init>", "()V", itf);
        mv.visitVarInsn(ASTORE, 5);
        mv.visitTypeInsn(NEW, "com/ibm/layout/Location");
        mv.visitInsn(DUP);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
        mv.visitVarInsn(LLOAD, 1);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, arrayImplClassName, "dim2", "J");
        mv.visitInsn(LMUL);
        mv.visitVarInsn(LLOAD, 3);
        mv.visitInsn(LADD);
        mv.visitVarInsn(ALOAD, 5);
        mv.visitMethodInsn(INVOKEVIRTUAL, elementImplClassName, "sizeof", "()J", itf);
        mv.visitInsn(LMUL);
        mv.visitMethodInsn(INVOKESPECIAL, "com/ibm/layout/Location", "<init>", "(Lcom/ibm/layout/Location;J)V",
                itf);
        mv.visitVarInsn(ASTORE, 6);
        mv.visitVarInsn(ALOAD, 5);
        mv.visitVarInsn(ALOAD, 6);
        mv.visitMethodInsn(INVOKEVIRTUAL, elementImplClassName, "bindLocation", "(Lcom/ibm/layout/Location;)V",
                itf);
        mv.visitVarInsn(ALOAD, 5);
        mv.visitInsn(ARETURN);
        mv.visitMaxs(7, 7);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "put", "(JJL" + elementInterfaceClassName + ";)V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(LLOAD, 1);
        mv.visitVarInsn(LLOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, arrayImplClassName, "at", "(JJ)L" + elementInterfaceClassName + ";",
                itf);
        mv.visitTypeInsn(CHECKCAST, elementImplClassName);
        mv.visitVarInsn(ALOAD, 5);
        mv.visitTypeInsn(CHECKCAST, elementImplClassName);
        mv.visitMethodInsn(INVOKEVIRTUAL, elementImplClassName, "copyFrom", "(L" + elementImplClassName + ";)V",
                itf);
        mv.visitInsn(RETURN);
        mv.visitMaxs(5, 6);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC + ACC_BRIDGE + ACC_SYNTHETIC, "at", "(JJ)Lcom/ibm/layout/Layout;", null,
                null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(LLOAD, 1);
        mv.visitVarInsn(LLOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, arrayImplClassName, "at", "(JJ)L" + elementInterfaceClassName + ";",
                itf);
        mv.visitInsn(ARETURN);
        mv.visitMaxs(5, 5);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC + ACC_BRIDGE + ACC_SYNTHETIC, "put", "(JJLcom/ibm/layout/Layout;)V",
                null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(LLOAD, 1);
        mv.visitVarInsn(LLOAD, 3);
        mv.visitVarInsn(ALOAD, 5);
        mv.visitTypeInsn(CHECKCAST, elementInterfaceClassName);
        mv.visitMethodInsn(INVOKEVIRTUAL, arrayImplClassName, "put", "(JJL" + elementInterfaceClassName + ";)V",
                itf);
        mv.visitInsn(RETURN);
        mv.visitMaxs(6, 6);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "dim1", "()J", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, arrayImplClassName, "dim1", "J");
        mv.visitInsn(LRETURN);
        mv.visitMaxs(2, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "dim2", "()J", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, arrayImplClassName, "dim2", "J");
        mv.visitInsn(LRETURN);
        mv.visitMaxs(2, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "sizeof", "()J", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, arrayImplClassName, "arraySize", "J");
        mv.visitInsn(LRETURN);
        mv.visitMaxs(2, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null);
        mv.visitCode();
        mv.visitTypeInsn(NEW, "java/lang/StringBuffer");
        mv.visitInsn(DUP);
        mv.visitLdcInsn("[");
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuffer", "<init>", "(Ljava/lang/String;)V", false);
        mv.visitVarInsn(ASTORE, 1);
        mv.visitInsn(LCONST_0);
        mv.visitVarInsn(LSTORE, 2);
        Label l0 = new Label();
        mv.visitJumpInsn(GOTO, l0);
        Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitFrame(Opcodes.F_APPEND, 2, new Object[] { "java/lang/StringBuffer", Opcodes.LONG }, 0, null);
        mv.visitInsn(LCONST_0);
        mv.visitVarInsn(LSTORE, 4);
        Label l2 = new Label();
        mv.visitJumpInsn(GOTO, l2);
        Label l3 = new Label();
        mv.visitLabel(l3);
        mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] { Opcodes.LONG }, 0, null);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
        mv.visitInsn(DUP);
        mv.visitLdcInsn(" ");
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V", false);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(LLOAD, 2);
        mv.visitVarInsn(LLOAD, 4);
        mv.visitMethodInsn(INVOKEVIRTUAL, arrayImplClassName, "at", "(JJ)Lcom/ibm/layout/Layout;", false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "toString", "()Ljava/lang/String;", false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuffer", "append",
                "(Ljava/lang/String;)Ljava/lang/StringBuffer;", false);
        mv.visitInsn(POP);
        mv.visitVarInsn(LLOAD, 4);
        mv.visitInsn(LCONST_1);
        mv.visitInsn(LADD);
        mv.visitVarInsn(LSTORE, 4);
        mv.visitLabel(l2);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitVarInsn(LLOAD, 4);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, arrayImplClassName, "dim2", "J");
        mv.visitInsn(LCMP);
        mv.visitJumpInsn(IFLT, l3);
        mv.visitVarInsn(LLOAD, 2);
        mv.visitInsn(LCONST_1);
        mv.visitInsn(LADD);
        mv.visitVarInsn(LSTORE, 2);
        mv.visitLabel(l0);
        mv.visitFrame(Opcodes.F_CHOP, 1, null, 0, null);
        mv.visitVarInsn(LLOAD, 2);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, arrayImplClassName, "dim1", "J");
        mv.visitInsn(LCMP);
        mv.visitJumpInsn(IFLT, l1);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitLdcInsn(" ]");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuffer", "append",
                "(Ljava/lang/String;)Ljava/lang/StringBuffer;", false);
        mv.visitInsn(POP);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuffer", "toString", "()Ljava/lang/String;", false);
        mv.visitInsn(ARETURN);
        mv.visitMaxs(7, 6);
        mv.visitEnd();
    }

    ImplHelper.genLayoutTypeImpl(cw, mv, fv, arrayImplClassName, false);
    cw.visitEnd();

    return cw.toByteArray();
}

From source file:com.ibm.layout.GenLayout.java

License:Open Source License

/**
 * Generate bytecodes for runtime class//from w  ww. j  a  v a 2 s .c o m
 * 
 * @return byte array containing bytecodes for runtime class
 * @throws Exception
 */
public byte[] genBytecode() throws Exception {

    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    FieldVisitor fv = null;
    MethodVisitor mv = null;
    ImplHelper.FieldDesc[] fieldDesc = ImplHelper.getFieldDesc(clazz);
    boolean isVariableLengthLayout = false;
    final boolean itf = false;

    {
        mv = cw.visitMethod(ACC_PUBLIC, "sizeof", "()J", null, null);
        mv.visitCode();
        mv.visitLdcInsn(new Long(getClassSize(fieldDesc)));
        mv.visitInsn(LRETURN);
        mv.visitMaxs(2, 1);
        mv.visitEnd();
    }

    cw.visit(V1_8, ACC_FINAL + ACC_SUPER, implClassName, null, "java/lang/Object",
            new String[] { interfaceClassName });

    {
        mv = cw.visitMethod(0, "<init>", "()V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
        mv.visitInsn(RETURN);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    // getters
    for (int i = 0; i < fieldDesc.length; i++) {
        if (!ImplHelper.isPointerType(fieldDesc[i].rawType)) {
            if (ImplHelper.isTypePrimitive(fieldDesc[i].sig)) {
                mv = cw.visitMethod(ACC_PUBLIC, fieldDesc[i].name, "()" + fieldDesc[i].sig, null, null);
                mv.visitCode();
                mv.visitFieldInsn(GETSTATIC, implClassName, "unsafe", "Lsun/misc/Unsafe;");
                mv.visitVarInsn(ALOAD, 0);
                mv.visitFieldInsn(GETFIELD, implClassName, "location", "Lcom/ibm/layout/Location;");
                mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getData", "()[B", itf);
                mv.visitVarInsn(ALOAD, 0);
                mv.visitFieldInsn(GETFIELD, implClassName, "location", "Lcom/ibm/layout/Location;");
                mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getOffset", "()J", itf);
                mv.visitLdcInsn(fieldDesc[i].offset);
                mv.visitInsn(LADD);

                mv.visitMethodInsn(INVOKEVIRTUAL, "sun/misc/Unsafe",
                        "get" + ImplHelper.fieldSig2MethodType(fieldDesc[i].sig),
                        "(Ljava/lang/Object;J)" + fieldDesc[i].sig, itf);
                if (fieldDesc[i].sig == "D") {
                    mv.visitInsn(DRETURN);
                } else if (fieldDesc[i].sig == "J") {
                    mv.visitInsn(LRETURN);
                } else if (fieldDesc[i].sig == "F") {
                    mv.visitInsn(FRETURN);
                } else {
                    mv.visitInsn(IRETURN);
                }
                mv.visitMaxs(6, 1);
                mv.visitEnd();
            } else if (fieldDesc[i].repeatCountMember != null) {
                {
                    isVariableLengthLayout = true;
                    ImplHelper.FieldDesc repeatCountField = ImplHelper.findField(fieldDesc[i].repeatCountMember,
                            fieldDesc);
                    mv = cw.visitMethod(ACC_PUBLIC, fieldDesc[i].name, "()" + fieldDesc[i].sig,
                            "()" + fieldDesc[i].elementImpl, null);
                    mv.visitCode();
                    if ("" != fieldDesc[i].elementImpl) {
                        mv.visitTypeInsn(NEW, fieldDesc[i].elementImpl);
                        mv.visitInsn(DUP);
                        mv.visitMethodInsn(INVOKESPECIAL, fieldDesc[i].elementImpl, "<init>", "()V", false);
                        mv.visitVarInsn(ASTORE, 1);
                        mv.visitTypeInsn(NEW, fieldDesc[i].impl);
                        mv.visitInsn(DUP);
                        mv.visitVarInsn(ALOAD, 0);
                        mv.visitMethodInsn(INVOKEVIRTUAL, implClassName, fieldDesc[i].repeatCountMember,
                                "()" + repeatCountField.sig, false);
                        if (!repeatCountField.sig.equals("J")) {
                            mv.visitInsn(I2L);
                        }
                        mv.visitVarInsn(ALOAD, 1);
                        mv.visitMethodInsn(INVOKEVIRTUAL, fieldDesc[i].elementImpl, "sizeof", "()J", false);
                        mv.visitMethodInsn(INVOKESPECIAL, fieldDesc[i].impl, "<init>", "(JJ)V", false);
                        mv.visitVarInsn(ASTORE, 2);
                        mv.visitTypeInsn(NEW, "com/ibm/layout/Location");
                        mv.visitInsn(DUP);
                        mv.visitVarInsn(ALOAD, 0);
                        mv.visitFieldInsn(GETFIELD, implClassName, "location", "Lcom/ibm/layout/Location;");
                        mv.visitLdcInsn(fieldDesc[i].offset);
                        mv.visitMethodInsn(INVOKESPECIAL, "com/ibm/layout/Location", "<init>",
                                "(Lcom/ibm/layout/Location;J)V", false);
                        mv.visitVarInsn(ASTORE, 3);
                        mv.visitVarInsn(ALOAD, 2);
                        mv.visitVarInsn(ALOAD, 3);
                        mv.visitMethodInsn(INVOKEINTERFACE, "com/ibm/layout/VLArray", "bindLocation",
                                "(Lcom/ibm/layout/Location;)V", true);
                        mv.visitVarInsn(ALOAD, 2);
                        mv.visitInsn(ARETURN);
                        mv.visitMaxs(6, 4);
                        mv.visitEnd();
                    } else {
                        throw new RuntimeException("primitive VLAs are unsupported");
                    }
                    {
                        mv = cw.visitMethod(ACC_PUBLIC, "bindLocation",
                                "(Lcom/ibm/layout/Location;" + repeatCountField.sig + ")V", null,
                                new String[] { "java/lang/UnsupportedOperationException" });
                        mv.visitCode();
                        mv.visitVarInsn(ALOAD, 1);
                        mv.visitVarInsn(ALOAD, 0);
                        mv.visitMethodInsn(INVOKEVIRTUAL, implClassName, "sizeof", "()J", false);
                        mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "checkDataFits", "(J)Z",
                                false);
                        Label l0 = new Label();
                        mv.visitJumpInsn(IFEQ, l0);
                        mv.visitVarInsn(ALOAD, 0);
                        mv.visitVarInsn(ALOAD, 1);
                        mv.visitFieldInsn(PUTFIELD, implClassName, "location", "Lcom/ibm/layout/Location;");
                        mv.visitLabel(l0);
                        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
                        mv.visitVarInsn(ALOAD, 0);
                        if (repeatCountField.sig.equals("J")) {
                            mv.visitVarInsn(LLOAD, 2);
                        } else {
                            mv.visitVarInsn(ILOAD, 2);
                        }
                        mv.visitMethodInsn(INVOKEVIRTUAL, implClassName, fieldDesc[i].repeatCountMember,
                                "(" + repeatCountField.sig + ")V", false);
                        mv.visitInsn(RETURN);
                        mv.visitMaxs(3, 3);
                        mv.visitEnd();
                    }
                }
            } else if (fieldDesc[i].dims == null) {
                /* nested field */
                mv = cw.visitMethod(ACC_PUBLIC, fieldDesc[i].name, "()" + fieldDesc[i].sig, null, null);
                mv.visitCode();
                mv.visitTypeInsn(NEW, ImplHelper.getImplClassName(fieldDesc[i].rawType));
                mv.visitInsn(DUP);
                mv.visitMethodInsn(INVOKESPECIAL, ImplHelper.getImplClassName(fieldDesc[i].rawType), "<init>",
                        "()V", itf);
                mv.visitVarInsn(ASTORE, 1);
                mv.visitTypeInsn(NEW, "com/ibm/layout/Location");
                mv.visitInsn(DUP);
                mv.visitVarInsn(ALOAD, 0);
                mv.visitFieldInsn(GETFIELD, this.implClassName, "location", "Lcom/ibm/layout/Location;");
                mv.visitLdcInsn(fieldDesc[i].offset);
                mv.visitMethodInsn(INVOKESPECIAL, "com/ibm/layout/Location", "<init>",
                        "(Lcom/ibm/layout/Location;J)V", itf);
                mv.visitVarInsn(ASTORE, 2);
                mv.visitVarInsn(ALOAD, 1);
                mv.visitVarInsn(ALOAD, 2);
                mv.visitMethodInsn(INVOKEVIRTUAL, ImplHelper.getImplClassName(fieldDesc[i].rawType),
                        "bindLocation", "(Lcom/ibm/layout/Location;)V", itf);
                mv.visitVarInsn(ALOAD, 1);
                mv.visitInsn(ARETURN);
                mv.visitMaxs(5, 3);
                mv.visitEnd();
            } else if (fieldDesc[i].dims.length == 1) {
                mv = cw.visitMethod(ACC_PUBLIC, fieldDesc[i].name, "()" + fieldDesc[i].sig,
                        "()" + fieldDesc[i].sigGeneric, null);
                mv.visitCode();
                if ("" != fieldDesc[i].elementImpl) {
                    mv.visitTypeInsn(NEW, fieldDesc[i].elementImpl);
                    mv.visitInsn(DUP);
                    mv.visitMethodInsn(INVOKESPECIAL, fieldDesc[i].elementImpl, "<init>", "()V", itf);
                    mv.visitVarInsn(ASTORE, 1);
                    mv.visitTypeInsn(NEW, fieldDesc[i].impl);
                    mv.visitInsn(DUP);
                    mv.visitLdcInsn(fieldDesc[i].dims[0]);
                    mv.visitVarInsn(ALOAD, 1);
                    mv.visitMethodInsn(INVOKEVIRTUAL, fieldDesc[i].elementImpl, "sizeof", "()J", itf);
                    mv.visitMethodInsn(INVOKESPECIAL, fieldDesc[i].impl, "<init>", "(JJ)V", itf);
                    mv.visitVarInsn(ASTORE, 2);
                    mv.visitTypeInsn(NEW, "com/ibm/layout/Location");
                    mv.visitInsn(DUP);
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitFieldInsn(GETFIELD, this.implClassName, "location", "Lcom/ibm/layout/Location;");
                    mv.visitLdcInsn(fieldDesc[i].offset);
                    mv.visitMethodInsn(INVOKESPECIAL, "com/ibm/layout/Location", "<init>",
                            "(Lcom/ibm/layout/Location;J)V", itf);
                    mv.visitVarInsn(ASTORE, 3);
                    mv.visitVarInsn(ALOAD, 2);
                    mv.visitVarInsn(ALOAD, 3);
                    mv.visitMethodInsn(INVOKEVIRTUAL, fieldDesc[i].impl, "bindLocation",
                            "(Lcom/ibm/layout/Location;)V", itf);
                    mv.visitVarInsn(ALOAD, 2);
                    mv.visitInsn(ARETURN);
                    mv.visitMaxs(6, 4);
                    mv.visitEnd();
                } else {
                    mv.visitTypeInsn(NEW, fieldDesc[i].impl);
                    mv.visitInsn(DUP);
                    mv.visitLdcInsn(fieldDesc[i].dims[0]);
                    mv.visitMethodInsn(INVOKESPECIAL, fieldDesc[i].impl, "<init>", "(J)V", itf);
                    mv.visitVarInsn(ASTORE, 1);
                    mv.visitTypeInsn(NEW, "com/ibm/layout/Location");
                    mv.visitInsn(DUP);
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitFieldInsn(GETFIELD, this.implClassName, "location", "Lcom/ibm/layout/Location;");
                    mv.visitLdcInsn(fieldDesc[i].offset);
                    mv.visitMethodInsn(INVOKESPECIAL, "com/ibm/layout/Location", "<init>",
                            "(Lcom/ibm/layout/Location;J)V", itf);
                    mv.visitVarInsn(ASTORE, 2);
                    mv.visitVarInsn(ALOAD, 1);
                    mv.visitVarInsn(ALOAD, 2);
                    mv.visitMethodInsn(INVOKEVIRTUAL, fieldDesc[i].impl, "bindLocation",
                            "(Lcom/ibm/layout/Location;)V", itf);
                    mv.visitVarInsn(ALOAD, 1);
                    mv.visitInsn(ARETURN);
                    mv.visitMaxs(5, 3);
                    mv.visitEnd();
                }
            } else if (fieldDesc[i].dims.length == 2) {
                if ("" != fieldDesc[i].elementImpl) {
                    mv = cw.visitMethod(ACC_PUBLIC, fieldDesc[i].name, "()" + fieldDesc[i].sig,
                            "()" + fieldDesc[i].sigGeneric, null);
                    mv.visitCode();
                    mv.visitTypeInsn(NEW, fieldDesc[i].elementImpl);
                    mv.visitInsn(DUP);
                    mv.visitMethodInsn(INVOKESPECIAL, fieldDesc[i].elementImpl, "<init>", "()V", itf);
                    mv.visitVarInsn(ASTORE, 1);
                    mv.visitTypeInsn(NEW, fieldDesc[i].impl);
                    mv.visitInsn(DUP);
                    mv.visitLdcInsn(fieldDesc[i].dims[0]);
                    mv.visitLdcInsn(fieldDesc[i].dims[1]);
                    mv.visitVarInsn(ALOAD, 1);
                    mv.visitMethodInsn(INVOKEVIRTUAL, fieldDesc[i].elementImpl, "sizeof", "()J", itf);
                    mv.visitMethodInsn(INVOKESPECIAL, fieldDesc[i].impl, "<init>", "(JJJ)V", itf);
                    mv.visitVarInsn(ASTORE, 2);
                    mv.visitTypeInsn(NEW, "com/ibm/layout/Location");
                    mv.visitInsn(DUP);
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitFieldInsn(GETFIELD, this.implClassName, "location", "Lcom/ibm/layout/Location;");
                    mv.visitLdcInsn(fieldDesc[i].offset);
                    mv.visitMethodInsn(INVOKESPECIAL, "com/ibm/layout/Location", "<init>",
                            "(Lcom/ibm/layout/Location;J)V", itf);
                    mv.visitVarInsn(ASTORE, 3);
                    mv.visitVarInsn(ALOAD, 2);
                    mv.visitVarInsn(ALOAD, 3);
                    mv.visitMethodInsn(INVOKEVIRTUAL, fieldDesc[i].impl, "bindLocation",
                            "(Lcom/ibm/layout/Location;)V", itf);
                    mv.visitVarInsn(ALOAD, 2);
                    mv.visitInsn(ARETURN);
                    mv.visitMaxs(8, 4);
                    mv.visitEnd();
                } else {
                    mv = cw.visitMethod(ACC_PUBLIC, fieldDesc[i].name, "()" + fieldDesc[i].sig,
                            "()" + fieldDesc[i].sigGeneric, null);
                    mv.visitCode();
                    mv.visitTypeInsn(NEW, fieldDesc[i].impl);
                    mv.visitInsn(DUP);
                    mv.visitLdcInsn(fieldDesc[i].dims[0]);
                    mv.visitLdcInsn(fieldDesc[i].dims[1]);
                    mv.visitMethodInsn(INVOKESPECIAL, fieldDesc[i].impl, "<init>", "(JJ)V", itf);
                    mv.visitVarInsn(ASTORE, 1);
                    mv.visitTypeInsn(NEW, "com/ibm/layout/Location");
                    mv.visitInsn(DUP);
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitFieldInsn(GETFIELD, this.implClassName, "location", "Lcom/ibm/layout/Location;");
                    mv.visitLdcInsn(fieldDesc[i].offset);
                    mv.visitMethodInsn(INVOKESPECIAL, "com/ibm/layout/Location", "<init>",
                            "(Lcom/ibm/layout/Location;J)V", itf);
                    mv.visitVarInsn(ASTORE, 2);
                    mv.visitVarInsn(ALOAD, 1);
                    mv.visitVarInsn(ALOAD, 2);
                    mv.visitMethodInsn(INVOKEVIRTUAL, fieldDesc[i].impl, "bindLocation",
                            "(Lcom/ibm/layout/Location;)V", itf);
                    mv.visitVarInsn(ALOAD, 1);
                    mv.visitInsn(ARETURN);
                    mv.visitMaxs(6, 3);
                    mv.visitEnd();
                }
            }
        }
    }

    // setters
    for (int i = 0; i < fieldDesc.length; i++) {
        if (ImplHelper.isTypePrimitive(fieldDesc[i].sig)) {
            mv = cw.visitMethod(ACC_PUBLIC, fieldDesc[i].name, "(" + fieldDesc[i].sig + ")V", null, null);
            mv.visitCode();
            mv.visitFieldInsn(GETSTATIC, implClassName, "unsafe", "Lsun/misc/Unsafe;");
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, implClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getData", "()[B", itf);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, implClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getOffset", "()J", itf);
            mv.visitLdcInsn(fieldDesc[i].offset);
            mv.visitInsn(LADD);
            if (fieldDesc[i].sig == "D") {
                mv.visitVarInsn(DLOAD, 1);
            } else if (fieldDesc[i].sig == "J") {
                mv.visitVarInsn(LLOAD, 1);
            } else if (fieldDesc[i].sig == "F") {
                mv.visitVarInsn(FLOAD, 1);
            } else {
                mv.visitVarInsn(ILOAD, 1);
            }
            mv.visitMethodInsn(INVOKEVIRTUAL, "sun/misc/Unsafe",
                    "put" + ImplHelper.fieldSig2MethodType(fieldDesc[i].sig),
                    "(Ljava/lang/Object;J" + fieldDesc[i].sig + ")V", itf);
            mv.visitInsn(RETURN);
            mv.visitMaxs(6, 2);
            mv.visitEnd();
        }
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "copyFrom", "(L" + implClassName + ";)V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKESPECIAL, implClassName, "copyFrom", "(Lcom/ibm/layout/Layout;)V", itf);
        mv.visitInsn(RETURN);
        mv.visitMaxs(2, 2);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null);
        mv.visitCode();
        mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
        mv.visitInsn(DUP);
        mv.visitLdcInsn("(");
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V", false);
        for (int i = 0; i < fieldDesc.length; i++) {
            if (ImplHelper.isTypePrimitive(fieldDesc[i].sig)) {
                mv.visitLdcInsn(fieldDesc[i].name + ": ");
                mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                        "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
                mv.visitVarInsn(ALOAD, 0);
                mv.visitMethodInsn(INVOKEVIRTUAL, implClassName, fieldDesc[i].name, "()" + fieldDesc[i].sig,
                        false);
                mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                        "(" + ImplHelper.getByteCodeSig(fieldDesc[i].sig) + ")Ljava/lang/StringBuilder;",
                        false);
                if (i < (fieldDesc.length - 1)) {
                    mv.visitLdcInsn(", ");
                    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                            "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
                }
            } else {
                mv.visitVarInsn(ALOAD, 0);
                mv.visitMethodInsn(INVOKEVIRTUAL, implClassName, fieldDesc[i].name, "()" + fieldDesc[i].sig,
                        false);
                mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "toString", "()Ljava/lang/String;",
                        false);
                mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                        "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
            }
        }
        mv.visitLdcInsn(")");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
        mv.visitInsn(ARETURN);
        mv.visitMaxs(3, 1);
        mv.visitEnd();
    }

    ImplHelper.genLayoutTypeImpl(cw, mv, fv, implClassName, isVariableLengthLayout);
    ImplHelper.getLayoutImpl(cw, mv, implClassName);

    cw.visitEnd();

    return cw.toByteArray();
}

From source file:com.ibm.layout.GenVLArray.java

License:Open Source License

/**
 * Generate bytecodes for runtime class//  w  ww  .j ava  2s  .  c o  m
 * 
 * @return byte array containing bytecodes for runtime class
 * @throws Exception
 */
public byte[] genBytecode() throws Exception {
    ClassWriter cw = new ClassWriter(0);
    MethodVisitor mv;
    FieldVisitor fv;
    final boolean itf = false;

    /* If user-defined array class is supplied, use it as superclass, and use its name instead of generating it */
    cw.visit(V1_8, ACC_FINAL + ACC_SUPER, arrayImplClassName, arrayInterfaceClassSig, "java/lang/Object",
            new String[] { arrayInterfaceClassName });
    {
        fv = cw.visitField(ACC_PROTECTED + ACC_FINAL, "length", "J", null, null);
        fv.visitEnd();
    }
    {
        fv = cw.visitField(ACC_PROTECTED + ACC_FINAL, "elementSize", "J", null, null);
        fv.visitEnd();
    }
    {
        fv = cw.visitField(ACC_PRIVATE, "arraySize", "J", null, null);
        fv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PROTECTED, "<init>", "(JJ)V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(LLOAD, 3);
        mv.visitFieldInsn(PUTFIELD, arrayImplClassName, "elementSize", "J");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(LLOAD, 1);
        mv.visitFieldInsn(PUTFIELD, arrayImplClassName, "length", "J");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(LLOAD, 3);
        mv.visitVarInsn(LLOAD, 1);
        mv.visitInsn(LMUL);
        mv.visitFieldInsn(PUTFIELD, arrayImplClassName, "arraySize", "J");
        mv.visitInsn(RETURN);
        mv.visitMaxs(5, 5);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "sizeof", "()J", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, arrayImplClassName, "arraySize", "J");
        mv.visitInsn(LRETURN);
        mv.visitMaxs(2, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "getComponentType", "()Ljava/lang/Class;",
                "()Ljava/lang/Class<*>;", null);
        mv.visitCode();
        mv.visitLdcInsn(Type.getType("L" + elementInterfaceClassName + ";"));
        mv.visitInsn(ARETURN);
        mv.visitMaxs(1, 0);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "getVLALength", "()J", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, arrayImplClassName, "length", "J");
        mv.visitInsn(LRETURN);
        mv.visitMaxs(2, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "at", "(J)L" + elementInterfaceClassName + ";", null, null);
        mv.visitCode();
        mv.visitTypeInsn(NEW, elementImplClassName);
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, elementImplClassName, "<init>", "()V", false);
        mv.visitVarInsn(ASTORE, 3);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitTypeInsn(NEW, "com/ibm/layout/Location");
        mv.visitInsn(DUP);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
        mv.visitVarInsn(LLOAD, 1);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, arrayImplClassName, "elementSize", "J");
        mv.visitInsn(LMUL);
        mv.visitMethodInsn(INVOKESPECIAL, "com/ibm/layout/Location", "<init>", "(Lcom/ibm/layout/Location;J)V",
                false);
        mv.visitMethodInsn(INVOKEVIRTUAL, elementImplClassName, "bindLocation", "(Lcom/ibm/layout/Location;)V",
                false);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitInsn(ARETURN);
        mv.visitMaxs(8, 4);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "range", "(JJ)Lcom/ibm/layout/Array1D;",
                "(JJ)Lcom/ibm/layout/Array1D<" + elementInterfaceClassName + ";>;", null);
        mv.visitCode();
        mv.visitTypeInsn(NEW, arrayImplClassName);
        mv.visitInsn(DUP);
        mv.visitVarInsn(LLOAD, 3);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "elementSize", "J");
        mv.visitMethodInsn(INVOKESPECIAL, this.arrayImplClassName, "<init>", "(JJ)V", itf);
        mv.visitVarInsn(ASTORE, 5);
        mv.visitTypeInsn(NEW, "com/ibm/layout/Location");
        mv.visitInsn(DUP);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
        mv.visitVarInsn(LLOAD, 1);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, arrayImplClassName, "elementSize", "J");
        mv.visitInsn(LMUL);
        mv.visitMethodInsn(INVOKESPECIAL, "com/ibm/layout/Location", "<init>", "(Lcom/ibm/layout/Location;J)V",
                itf);
        mv.visitVarInsn(ASTORE, 6);
        mv.visitVarInsn(ALOAD, 5);
        mv.visitVarInsn(ALOAD, 6);
        mv.visitMethodInsn(INVOKEVIRTUAL, arrayImplClassName, "bindLocation", "(Lcom/ibm/layout/Location;)V",
                itf);
        mv.visitVarInsn(ALOAD, 5);
        mv.visitInsn(ARETURN);
        mv.visitMaxs(7, 7);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "put", "(JLcom/ibm/layout/Layout;)V", null, null);
        mv.visitCode();
        mv.visitTypeInsn(NEW, elementImplClassName);
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, elementImplClassName, "<init>", "()V", false);
        mv.visitVarInsn(ASTORE, 4);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitTypeInsn(NEW, "com/ibm/layout/Location");
        mv.visitInsn(DUP);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
        mv.visitVarInsn(LLOAD, 1);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, arrayImplClassName, "elementSize", "J");
        mv.visitInsn(LMUL);
        mv.visitMethodInsn(INVOKESPECIAL, "com/ibm/layout/Location", "<init>", "(Lcom/ibm/layout/Location;J)V",
                false);
        mv.visitMethodInsn(INVOKEVIRTUAL, elementImplClassName, "bindLocation", "(Lcom/ibm/layout/Location;)V",
                false);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, elementImplClassName, "copyFrom", "(Lcom/ibm/layout/Layout;)V",
                false);
        mv.visitInsn(RETURN);
        mv.visitMaxs(8, 5);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "put", "(JL" + elementInterfaceClassName + ";)V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(LLOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, arrayImplClassName, "at", "(J)L" + elementInterfaceClassName + ";",
                itf);
        mv.visitTypeInsn(CHECKCAST, elementImplClassName);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitTypeInsn(CHECKCAST, elementImplClassName);
        mv.visitMethodInsn(INVOKEVIRTUAL, elementImplClassName, "copyFrom", "(L" + elementImplClassName + ";)V",
                itf);
        mv.visitInsn(RETURN);
        mv.visitMaxs(3, 4);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC + ACC_BRIDGE + ACC_SYNTHETIC, "at", "(J)Lcom/ibm/layout/Layout;", null,
                null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(LLOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, arrayImplClassName, "at", "(J)L" + elementInterfaceClassName + ";",
                itf);
        mv.visitInsn(ARETURN);
        mv.visitMaxs(3, 3);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null);
        mv.visitCode();
        mv.visitTypeInsn(NEW, "java/lang/StringBuffer");
        mv.visitInsn(DUP);
        mv.visitLdcInsn("[");
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuffer", "<init>", "(Ljava/lang/String;)V", false);
        mv.visitVarInsn(ASTORE, 1);
        mv.visitInsn(LCONST_0);
        mv.visitVarInsn(LSTORE, 2);
        Label l0 = new Label();
        mv.visitJumpInsn(GOTO, l0);
        Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitFrame(Opcodes.F_APPEND, 2, new Object[] { "java/lang/StringBuffer", Opcodes.LONG }, 0, null);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
        mv.visitInsn(DUP);
        mv.visitLdcInsn(" ");
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V", false);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(LLOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, arrayImplClassName, "at", "(J)L" + elementInterfaceClassName + ";",
                false);
        mv.visitMethodInsn(INVOKEINTERFACE, elementInterfaceClassName, "toString", "()Ljava/lang/String;",
                true);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuffer", "append",
                "(Ljava/lang/String;)Ljava/lang/StringBuffer;", false);
        mv.visitInsn(POP);
        mv.visitVarInsn(LLOAD, 2);
        mv.visitInsn(LCONST_1);
        mv.visitInsn(LADD);
        mv.visitVarInsn(LSTORE, 2);
        mv.visitLabel(l0);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitVarInsn(LLOAD, 2);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, arrayImplClassName, "length", "J");
        mv.visitInsn(LCMP);
        mv.visitJumpInsn(IFLT, l1);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitLdcInsn(" ]");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuffer", "append",
                "(Ljava/lang/String;)Ljava/lang/StringBuffer;", false);
        mv.visitInsn(POP);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuffer", "toString", "()Ljava/lang/String;", false);
        mv.visitInsn(ARETURN);
        mv.visitMaxs(5, 4);
        mv.visitEnd();
    }

    ImplHelper.genLayoutTypeImpl(cw, mv, fv, arrayImplClassName, false);

    cw.visitEnd();

    return cw.toByteArray();
}