Example usage for org.objectweb.asm MethodVisitor visitMethodInsn

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

Introduction

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

Prototype

public void visitMethodInsn(final int opcode, final String owner, final String name, final String descriptor,
        final boolean isInterface) 

Source Link

Document

Visits a method instruction.

Usage

From source file:com.heliosdecompiler.appifier.SystemHookDump.java

License:Apache License

public static byte[] dump() {

    ClassWriter cw = new ClassWriter(0);
    FieldVisitor fv;/*from   w  w  w .  j  av  a 2s.  co m*/
    MethodVisitor mv;
    AnnotationVisitor av0;

    cw.visit(52, ACC_PUBLIC + ACC_SUPER, "com/heliosdecompiler/appifier/SystemHook", null, "java/lang/Object",
            null);

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

    {
        fv = cw.visitField(ACC_PUBLIC + ACC_STATIC, "out", "Ljava/lang/ThreadLocal;",
                "Ljava/lang/ThreadLocal<Ljava/io/PrintStream;>;", null);
        fv.visitEnd();
    }
    {
        fv = cw.visitField(ACC_PUBLIC + ACC_STATIC, "err", "Ljava/lang/ThreadLocal;",
                "Ljava/lang/ThreadLocal<Ljava/io/PrintStream;>;", null);
        fv.visitEnd();
    }
    {
        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_PRIVATE + ACC_STATIC + ACC_SYNTHETIC, "lambda$static$1",
                "()Ljava/io/PrintStream;", null, null);
        mv.visitCode();
        mv.visitFieldInsn(GETSTATIC, "java/lang/System", "err", "Ljava/io/PrintStream;");
        mv.visitInsn(ARETURN);
        mv.visitMaxs(1, 0);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PRIVATE + ACC_STATIC + ACC_SYNTHETIC, "lambda$static$0",
                "()Ljava/io/PrintStream;", null, null);
        mv.visitCode();
        mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
        mv.visitInsn(ARETURN);
        mv.visitMaxs(1, 0);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null);
        mv.visitCode();
        mv.visitInvokeDynamicInsn("get", "()Ljava/util/function/Supplier;", new Handle(Opcodes.H_INVOKESTATIC,
                "java/lang/invoke/LambdaMetafactory", "metafactory",
                "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;"),
                new Object[] { Type.getType("()Ljava/lang/Object;"),
                        new Handle(Opcodes.H_INVOKESTATIC, "com/heliosdecompiler/appifier/SystemHook",
                                "lambda$static$0", "()Ljava/io/PrintStream;"),
                        Type.getType("()Ljava/io/PrintStream;") });
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/ThreadLocal", "withInitial",
                "(Ljava/util/function/Supplier;)Ljava/lang/ThreadLocal;", false);
        mv.visitFieldInsn(PUTSTATIC, "com/heliosdecompiler/appifier/SystemHook", "out",
                "Ljava/lang/ThreadLocal;");
        mv.visitInvokeDynamicInsn("get", "()Ljava/util/function/Supplier;", new Handle(Opcodes.H_INVOKESTATIC,
                "java/lang/invoke/LambdaMetafactory", "metafactory",
                "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;"),
                new Object[] { Type.getType("()Ljava/lang/Object;"),
                        new Handle(Opcodes.H_INVOKESTATIC, "com/heliosdecompiler/appifier/SystemHook",
                                "lambda$static$1", "()Ljava/io/PrintStream;"),
                        Type.getType("()Ljava/io/PrintStream;") });
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/ThreadLocal", "withInitial",
                "(Ljava/util/function/Supplier;)Ljava/lang/ThreadLocal;", false);
        mv.visitFieldInsn(PUTSTATIC, "com/heliosdecompiler/appifier/SystemHook", "err",
                "Ljava/lang/ThreadLocal;");
        mv.visitInsn(RETURN);
        mv.visitMaxs(1, 0);
        mv.visitEnd();
    }
    cw.visitEnd();

    return cw.toByteArray();
}

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

License:Open Source License

/**
 * Generate bytecodes for runtime class//from  ww w.j  a va  2s  .  c om
 * 
 * @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/*from  w  w w .java2s. 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/*  ww  w.jav a 2s . c om*/
 * 
 * @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.GenPrimArray1D.java

License:Open Source License

/**
 * Generate bytecodes for runtime class/*w  w  w .  j av  a 2s  .com*/
 * 
 * @return byte array containing bytecodes for runtime class
 * @throws Exception
 */
public byte[] genBytecode() throws Exception {
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    FieldVisitor fv;
    MethodVisitor mv;
    final boolean itf = false;

    cw.visit(V1_8, ACC_FINAL + ACC_SUPER, arrayImplClassName, null, "java/lang/Object",
            new String[] { arrayInterfaceClassName });
    {
        fv = cw.visitField(ACC_PRIVATE + ACC_FINAL, "length", "J", null, null);
        fv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(J)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.visitInsn(RETURN);
        mv.visitMaxs(3, 3);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "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();
    }
    if (byte.class == elementInterfaceClass) {
        {
            mv = cw.visitMethod(ACC_PUBLIC, "at", "(J)B", null, null);
            mv.visitCode();
            mv.visitFieldInsn(GETSTATIC, this.arrayImplClassName, "unsafe", "Lsun/misc/Unsafe;");
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getData", "()[B", itf);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getOffset", "()J", itf);
            mv.visitVarInsn(LLOAD, 1);
            mv.visitInsn(LCONST_1);
            mv.visitInsn(LMUL);
            mv.visitInsn(LADD);
            mv.visitMethodInsn(INVOKEVIRTUAL, "sun/misc/Unsafe", "getByte", "(Ljava/lang/Object;J)B", itf);
            mv.visitInsn(IRETURN);
            mv.visitMaxs(8, 3);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC, "put", "(JB)V", null, null);
            mv.visitCode();
            mv.visitFieldInsn(GETSTATIC, this.arrayImplClassName, "unsafe", "Lsun/misc/Unsafe;");
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getData", "()[B", itf);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getOffset", "()J", itf);
            mv.visitVarInsn(LLOAD, 1);
            mv.visitInsn(LCONST_1);
            mv.visitInsn(LMUL);
            mv.visitInsn(LADD);
            mv.visitVarInsn(ILOAD, 3);
            mv.visitMethodInsn(INVOKEVIRTUAL, "sun/misc/Unsafe", "putByte", "(Ljava/lang/Object;JB)V", itf);
            mv.visitInsn(RETURN);
            mv.visitMaxs(8, 4);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC, "range", "(JJ)L" + arrayInterfaceClassName + ";", null, null);
            mv.visitCode();
            mv.visitTypeInsn(NEW, this.arrayImplClassName);
            mv.visitInsn(DUP);
            mv.visitVarInsn(LLOAD, 3);
            mv.visitMethodInsn(INVOKESPECIAL, this.arrayImplClassName, "<init>", "(J)V", itf);
            mv.visitVarInsn(ASTORE, 5);
            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.visitInsn(LCONST_1);
            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, this.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 + ACC_BRIDGE + ACC_SYNTHETIC, "range",
                    "(JJ)Lcom/ibm/layout/ByteArray1D;", null, null);
            mv.visitCode();
            mv.visitVarInsn(ALOAD, 0);
            mv.visitVarInsn(LLOAD, 1);
            mv.visitVarInsn(LLOAD, 3);
            mv.visitMethodInsn(INVOKEVIRTUAL, this.arrayImplClassName, "range",
                    "(JJ)L" + this.arrayInterfaceClassName + ";", itf);
            mv.visitInsn(ARETURN);
            mv.visitMaxs(5, 5);
            mv.visitEnd();
        }
    } else if (boolean.class == elementInterfaceClass) {
        {
            mv = cw.visitMethod(ACC_PUBLIC, "at", "(J)Z", null, null);
            mv.visitCode();
            mv.visitFieldInsn(GETSTATIC, this.arrayImplClassName, "unsafe", "Lsun/misc/Unsafe;");
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getData", "()[B", itf);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getOffset", "()J", itf);
            mv.visitVarInsn(LLOAD, 1);
            mv.visitInsn(LADD);
            mv.visitMethodInsn(INVOKEVIRTUAL, "sun/misc/Unsafe", "getBoolean", "(Ljava/lang/Object;J)Z", itf);
            mv.visitInsn(IRETURN);
            mv.visitMaxs(6, 3);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC, "put", "(JZ)V", null, null);
            mv.visitCode();
            mv.visitFieldInsn(GETSTATIC, this.arrayImplClassName, "unsafe", "Lsun/misc/Unsafe;");
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getData", "()[B", itf);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getOffset", "()J", itf);
            mv.visitVarInsn(LLOAD, 1);
            mv.visitInsn(LADD);
            mv.visitVarInsn(ILOAD, 3);
            mv.visitMethodInsn(INVOKEVIRTUAL, "sun/misc/Unsafe", "putBoolean", "(Ljava/lang/Object;JZ)V", itf);
            mv.visitInsn(RETURN);
            mv.visitMaxs(6, 4);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC, "range", "(JJ)L" + arrayInterfaceClassName + ";", null, null);
            mv.visitCode();
            mv.visitTypeInsn(NEW, this.arrayImplClassName);
            mv.visitInsn(DUP);
            mv.visitVarInsn(LLOAD, 3);
            mv.visitMethodInsn(INVOKESPECIAL, this.arrayImplClassName, "<init>", "(J)V", itf);
            mv.visitVarInsn(ASTORE, 5);
            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.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, this.arrayImplClassName, "bindLocation",
                    "(Lcom/ibm/layout/Location;)V", itf);
            mv.visitVarInsn(ALOAD, 5);
            mv.visitInsn(ARETURN);
            mv.visitMaxs(5, 7);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC + ACC_BRIDGE + ACC_SYNTHETIC, "range",
                    "(JJ)Lcom/ibm/layout/BooleanArray1D;", null, null);
            mv.visitCode();
            mv.visitVarInsn(ALOAD, 0);
            mv.visitVarInsn(LLOAD, 1);
            mv.visitVarInsn(LLOAD, 3);
            mv.visitMethodInsn(INVOKEVIRTUAL, this.arrayImplClassName, "range",
                    "(JJ)L" + arrayInterfaceClassName + ";", itf);
            mv.visitInsn(ARETURN);
            mv.visitMaxs(5, 5);
            mv.visitEnd();
        }
    } else if (short.class == elementInterfaceClass) {
        {
            mv = cw.visitMethod(ACC_PUBLIC, "at", "(J)S", null, null);
            mv.visitCode();
            mv.visitFieldInsn(GETSTATIC, this.arrayImplClassName, "unsafe", "Lsun/misc/Unsafe;");
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getData", "()[B", itf);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getOffset", "()J", itf);
            mv.visitVarInsn(LLOAD, 1);
            mv.visitLdcInsn(new Long(2L));
            mv.visitInsn(LMUL);
            mv.visitInsn(LADD);
            mv.visitMethodInsn(INVOKEVIRTUAL, "sun/misc/Unsafe", "getShort", "(Ljava/lang/Object;J)S", itf);
            mv.visitInsn(IRETURN);
            mv.visitMaxs(8, 3);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC, "put", "(JS)V", null, null);
            mv.visitCode();
            mv.visitFieldInsn(GETSTATIC, this.arrayImplClassName, "unsafe", "Lsun/misc/Unsafe;");
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getData", "()[B", itf);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getOffset", "()J", itf);
            mv.visitVarInsn(LLOAD, 1);
            mv.visitLdcInsn(new Long(2L));
            mv.visitInsn(LMUL);
            mv.visitInsn(LADD);
            mv.visitVarInsn(ILOAD, 3);
            mv.visitMethodInsn(INVOKEVIRTUAL, "sun/misc/Unsafe", "putShort", "(Ljava/lang/Object;JS)V", itf);
            mv.visitInsn(RETURN);
            mv.visitMaxs(8, 4);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC, "range", "(JJ)L" + this.arrayInterfaceClassName + ";", null, null);
            mv.visitCode();
            mv.visitTypeInsn(NEW, this.arrayImplClassName);
            mv.visitInsn(DUP);
            mv.visitVarInsn(LLOAD, 3);
            mv.visitMethodInsn(INVOKESPECIAL, this.arrayImplClassName, "<init>", "(J)V", itf);
            mv.visitVarInsn(ASTORE, 5);
            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.visitLdcInsn(new Long(2L));
            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, this.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 + ACC_BRIDGE + ACC_SYNTHETIC, "range",
                    "(JJ)Lcom/ibm/layout/ShortArray1D;", null, null);
            mv.visitCode();
            mv.visitVarInsn(ALOAD, 0);
            mv.visitVarInsn(LLOAD, 1);
            mv.visitVarInsn(LLOAD, 3);
            mv.visitMethodInsn(INVOKEVIRTUAL, arrayImplClassName, "range",
                    "(JJ)L" + arrayInterfaceClassName + ";", itf);
            mv.visitInsn(ARETURN);
            mv.visitMaxs(5, 5);
            mv.visitEnd();
        }
    } else if (char.class == elementInterfaceClass) {
        {
            mv = cw.visitMethod(ACC_PUBLIC, "at", "(J)C", null, null);
            mv.visitCode();
            mv.visitFieldInsn(GETSTATIC, arrayImplClassName, "unsafe", "Lsun/misc/Unsafe;");
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getData", "()[B", itf);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getOffset", "()J", itf);
            mv.visitVarInsn(LLOAD, 1);
            mv.visitLdcInsn(new Long(2L));
            mv.visitInsn(LMUL);
            mv.visitInsn(LADD);
            mv.visitMethodInsn(INVOKEVIRTUAL, "sun/misc/Unsafe", "getChar", "(Ljava/lang/Object;J)C", itf);
            mv.visitInsn(IRETURN);
            mv.visitMaxs(8, 3);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC, "put", "(JC)V", null, null);
            mv.visitCode();
            mv.visitFieldInsn(GETSTATIC, this.arrayImplClassName, "unsafe", "Lsun/misc/Unsafe;");
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getData", "()[B", itf);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getOffset", "()J", itf);
            mv.visitVarInsn(LLOAD, 1);
            mv.visitLdcInsn(new Long(2L));
            mv.visitInsn(LMUL);
            mv.visitInsn(LADD);
            mv.visitVarInsn(ILOAD, 3);
            mv.visitMethodInsn(INVOKEVIRTUAL, "sun/misc/Unsafe", "putChar", "(Ljava/lang/Object;JC)V", itf);
            mv.visitInsn(RETURN);
            mv.visitMaxs(8, 4);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC, "range", "(JJ)L" + this.arrayInterfaceClassName + ";", null, null);
            mv.visitCode();
            mv.visitTypeInsn(NEW, this.arrayImplClassName);
            mv.visitInsn(DUP);
            mv.visitVarInsn(LLOAD, 3);
            mv.visitMethodInsn(INVOKESPECIAL, this.arrayImplClassName, "<init>", "(J)V", itf);
            mv.visitVarInsn(ASTORE, 5);
            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.visitLdcInsn(new Long(2L));
            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, this.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 + ACC_BRIDGE + ACC_SYNTHETIC, "range",
                    "(JJ)Lcom/ibm/layout/CharArray1D;", null, null);
            mv.visitCode();
            mv.visitVarInsn(ALOAD, 0);
            mv.visitVarInsn(LLOAD, 1);
            mv.visitVarInsn(LLOAD, 3);
            mv.visitMethodInsn(INVOKEVIRTUAL, this.arrayImplClassName, "range",
                    "(JJ)L" + this.arrayInterfaceClassName + ";", itf);
            mv.visitInsn(ARETURN);
            mv.visitMaxs(5, 5);
            mv.visitEnd();
        }
    } else if (int.class == elementInterfaceClass) {
        {
            mv = cw.visitMethod(ACC_PUBLIC, "at", "(J)I", null, null);
            mv.visitCode();
            mv.visitFieldInsn(GETSTATIC, this.arrayImplClassName, "unsafe", "Lsun/misc/Unsafe;");
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getData", "()[B", itf);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getOffset", "()J", itf);
            mv.visitVarInsn(LLOAD, 1);
            mv.visitLdcInsn(new Long(4L));
            mv.visitInsn(LMUL);
            mv.visitInsn(LADD);
            mv.visitMethodInsn(INVOKEVIRTUAL, "sun/misc/Unsafe", "getInt", "(Ljava/lang/Object;J)I", itf);
            mv.visitInsn(IRETURN);
            mv.visitMaxs(8, 3);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC, "put", "(JI)V", null, null);
            mv.visitCode();
            mv.visitFieldInsn(GETSTATIC, this.arrayImplClassName, "unsafe", "Lsun/misc/Unsafe;");
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getData", "()[B", itf);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getOffset", "()J", itf);
            mv.visitVarInsn(LLOAD, 1);
            mv.visitLdcInsn(new Long(4L));
            mv.visitInsn(LMUL);
            mv.visitInsn(LADD);
            mv.visitVarInsn(ILOAD, 3);
            mv.visitMethodInsn(INVOKEVIRTUAL, "sun/misc/Unsafe", "putInt", "(Ljava/lang/Object;JI)V", itf);
            mv.visitInsn(RETURN);
            mv.visitMaxs(8, 4);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC, "range", "(JJ)L" + this.arrayInterfaceClassName + ";", null, null);
            mv.visitCode();
            mv.visitTypeInsn(NEW, this.arrayImplClassName);
            mv.visitInsn(DUP);
            mv.visitVarInsn(LLOAD, 3);
            mv.visitMethodInsn(INVOKESPECIAL, this.arrayImplClassName, "<init>", "(J)V", itf);
            mv.visitVarInsn(ASTORE, 5);
            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.visitLdcInsn(new Long(4L));
            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, this.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 + ACC_BRIDGE + ACC_SYNTHETIC, "range",
                    "(JJ)Lcom/ibm/layout/IntArray1D;", null, null);
            mv.visitCode();
            mv.visitVarInsn(ALOAD, 0);
            mv.visitVarInsn(LLOAD, 1);
            mv.visitVarInsn(LLOAD, 3);
            mv.visitMethodInsn(INVOKEVIRTUAL, this.arrayImplClassName, "range",
                    "(JJ)L" + this.arrayInterfaceClassName + ";", itf);
            mv.visitInsn(ARETURN);
            mv.visitMaxs(5, 5);
            mv.visitEnd();
        }
    } else if (long.class == elementInterfaceClass) {
        {
            mv = cw.visitMethod(ACC_PUBLIC, "at", "(J)J", null, null);
            mv.visitCode();
            mv.visitFieldInsn(GETSTATIC, this.arrayImplClassName, "unsafe", "Lsun/misc/Unsafe;");
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getData", "()[B", itf);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getOffset", "()J", itf);
            mv.visitVarInsn(LLOAD, 1);
            mv.visitLdcInsn(new Long(8L));
            mv.visitInsn(LMUL);
            mv.visitInsn(LADD);
            mv.visitMethodInsn(INVOKEVIRTUAL, "sun/misc/Unsafe", "getLong", "(Ljava/lang/Object;J)J", itf);
            mv.visitInsn(LRETURN);
            mv.visitMaxs(8, 3);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC, "put", "(JJ)V", null, null);
            mv.visitCode();
            mv.visitFieldInsn(GETSTATIC, this.arrayImplClassName, "unsafe", "Lsun/misc/Unsafe;");
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getData", "()[B", itf);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getOffset", "()J", itf);
            mv.visitVarInsn(LLOAD, 1);
            mv.visitLdcInsn(new Long(8L));
            mv.visitInsn(LMUL);
            mv.visitInsn(LADD);
            mv.visitVarInsn(LLOAD, 3);
            mv.visitMethodInsn(INVOKEVIRTUAL, "sun/misc/Unsafe", "putLong", "(Ljava/lang/Object;JJ)V", itf);
            mv.visitInsn(RETURN);
            mv.visitMaxs(8, 5);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC, "range", "(JJ)L" + this.arrayInterfaceClassName + ";", null, null);
            mv.visitCode();
            mv.visitTypeInsn(NEW, this.arrayImplClassName);
            mv.visitInsn(DUP);
            mv.visitVarInsn(LLOAD, 3);
            mv.visitMethodInsn(INVOKESPECIAL, this.arrayImplClassName, "<init>", "(J)V", itf);
            mv.visitVarInsn(ASTORE, 5);
            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.visitLdcInsn(new Long(8L));
            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, this.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 + ACC_BRIDGE + ACC_SYNTHETIC, "range",
                    "(JJ)Lcom/ibm/layout/LongArray1D;", null, null);
            mv.visitCode();
            mv.visitVarInsn(ALOAD, 0);
            mv.visitVarInsn(LLOAD, 1);
            mv.visitVarInsn(LLOAD, 3);
            mv.visitMethodInsn(INVOKEVIRTUAL, this.arrayImplClassName, "range",
                    "(JJ)L" + this.arrayInterfaceClassName + ";", itf);
            mv.visitInsn(ARETURN);
            mv.visitMaxs(5, 5);
            mv.visitEnd();
        }
    } else if (float.class == elementInterfaceClass) {
        {
            mv = cw.visitMethod(ACC_PUBLIC, "at", "(J)F", null, null);
            mv.visitCode();
            mv.visitFieldInsn(GETSTATIC, arrayImplClassName, "unsafe", "Lsun/misc/Unsafe;");
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getData", "()[B", itf);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getOffset", "()J", itf);
            mv.visitVarInsn(LLOAD, 1);
            mv.visitLdcInsn(new Long(4L));
            mv.visitInsn(LMUL);
            mv.visitInsn(LADD);
            mv.visitMethodInsn(INVOKEVIRTUAL, "sun/misc/Unsafe", "getFloat", "(Ljava/lang/Object;J)F", itf);
            mv.visitInsn(FRETURN);
            mv.visitMaxs(8, 3);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC, "put", "(JF)V", null, null);
            mv.visitCode();
            mv.visitFieldInsn(GETSTATIC, this.arrayImplClassName, "unsafe", "Lsun/misc/Unsafe;");
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getData", "()[B", itf);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getOffset", "()J", itf);
            mv.visitVarInsn(LLOAD, 1);
            mv.visitLdcInsn(new Long(4L));
            mv.visitInsn(LMUL);
            mv.visitInsn(LADD);
            mv.visitVarInsn(FLOAD, 3);
            mv.visitMethodInsn(INVOKEVIRTUAL, "sun/misc/Unsafe", "putFloat", "(Ljava/lang/Object;JF)V", itf);
            mv.visitInsn(RETURN);
            mv.visitMaxs(8, 4);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC, "range", "(JJ)L" + this.arrayInterfaceClassName + ";", null, null);
            mv.visitCode();
            mv.visitTypeInsn(NEW, this.arrayImplClassName);
            mv.visitInsn(DUP);
            mv.visitVarInsn(LLOAD, 3);
            mv.visitMethodInsn(INVOKESPECIAL, this.arrayImplClassName, "<init>", "(J)V", itf);
            mv.visitVarInsn(ASTORE, 5);
            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.visitLdcInsn(new Long(4L));
            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, this.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 + ACC_BRIDGE + ACC_SYNTHETIC, "range",
                    "(JJ)Lcom/ibm/layout/FloatArray1D;", null, null);
            mv.visitCode();
            mv.visitVarInsn(ALOAD, 0);
            mv.visitVarInsn(LLOAD, 1);
            mv.visitVarInsn(LLOAD, 3);
            mv.visitMethodInsn(INVOKEVIRTUAL, this.arrayImplClassName, "range",
                    "(JJ)L" + this.arrayInterfaceClassName + ";", itf);
            mv.visitInsn(ARETURN);
            mv.visitMaxs(5, 5);
            mv.visitEnd();
        }
    } else if (double.class == elementInterfaceClass) {
        {
            mv = cw.visitMethod(ACC_PUBLIC, "at", "(J)D", null, null);
            mv.visitCode();
            mv.visitFieldInsn(GETSTATIC, this.arrayImplClassName, "unsafe", "Lsun/misc/Unsafe;");
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getData", "()[B", itf);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getOffset", "()J", itf);
            mv.visitVarInsn(LLOAD, 1);
            mv.visitLdcInsn(new Long(8L));
            mv.visitInsn(LMUL);
            mv.visitInsn(LADD);
            mv.visitMethodInsn(INVOKEVIRTUAL, "sun/misc/Unsafe", "getDouble", "(Ljava/lang/Object;J)D", itf);
            mv.visitInsn(DRETURN);
            mv.visitMaxs(8, 3);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC, "put", "(JD)V", null, null);
            mv.visitCode();
            mv.visitFieldInsn(GETSTATIC, this.arrayImplClassName, "unsafe", "Lsun/misc/Unsafe;");
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getData", "()[B", itf);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, this.arrayImplClassName, "location", "Lcom/ibm/layout/Location;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getOffset", "()J", itf);
            mv.visitVarInsn(LLOAD, 1);
            mv.visitLdcInsn(new Long(8L));
            mv.visitInsn(LMUL);
            mv.visitInsn(LADD);
            mv.visitVarInsn(DLOAD, 3);
            mv.visitMethodInsn(INVOKEVIRTUAL, "sun/misc/Unsafe", "putDouble", "(Ljava/lang/Object;JD)V", itf);
            mv.visitInsn(RETURN);
            mv.visitMaxs(8, 5);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC, "range", "(JJ)L" + this.arrayInterfaceClassName + ";", null, null);
            mv.visitCode();
            mv.visitTypeInsn(NEW, this.arrayImplClassName);
            mv.visitInsn(DUP);
            mv.visitVarInsn(LLOAD, 3);
            mv.visitMethodInsn(INVOKESPECIAL, this.arrayImplClassName, "<init>", "(J)V", itf);
            mv.visitVarInsn(ASTORE, 5);
            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.visitLdcInsn(new Long(8L));
            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, this.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 + ACC_BRIDGE + ACC_SYNTHETIC, "range",
                    "(JJ)Lcom/ibm/layout/DoubleArray1D;", null, null);
            mv.visitCode();
            mv.visitVarInsn(ALOAD, 0);
            mv.visitVarInsn(LLOAD, 1);
            mv.visitVarInsn(LLOAD, 3);
            mv.visitMethodInsn(INVOKEVIRTUAL, arrayImplClassName, "range",
                    "(JJ)L" + arrayInterfaceClassName + ";", itf);
            mv.visitInsn(ARETURN);
            mv.visitMaxs(5, 5);
            mv.visitEnd();
        }
    } else {
        throw new Exception();
    }

    {
        mv = cw.visitMethod(ACC_PUBLIC, "sizeof", "()J", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, arrayImplClassName, "length", "J");
        mv.visitInsn(LRETURN);
        mv.visitMaxs(2, 1);
        mv.visitEnd();
    }

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

    return cw.toByteArray();
}

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

License:Open Source License

/**
 * Generate bytecodes for runtime class//from  w  w  w  . ja v  a2  s.  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, "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();
}

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

License:Open Source License

static void getLayoutImpl(ClassVisitor cw, MethodVisitor mv, String typeName) {
    {/*from  w  w w . ja  v a 2  s. c  o m*/
        mv = cw.visitMethod(ACC_PUBLIC, "copyFrom", "(Lcom/ibm/layout/Layout;)V", null, null);
        mv.visitCode();
        mv.visitFieldInsn(GETSTATIC, typeName, "unsafe", "Lsun/misc/Unsafe;");
        mv.visitVarInsn(ALOAD, 1);
        mv.visitTypeInsn(CHECKCAST, typeName);
        mv.visitFieldInsn(GETFIELD, typeName, "location", "Lcom/ibm/layout/Location;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getData", "()[B", false);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitTypeInsn(CHECKCAST, typeName);
        mv.visitFieldInsn(GETFIELD, typeName, "location", "Lcom/ibm/layout/Location;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getOffset", "()J", false);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, typeName, "location", "Lcom/ibm/layout/Location;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getData", "()[B", false);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, typeName, "location", "Lcom/ibm/layout/Location;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getOffset", "()J", false);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKEVIRTUAL, typeName, "sizeof", "()J", false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "sun/misc/Unsafe", "copyMemory",
                "(Ljava/lang/Object;JLjava/lang/Object;JJ)V", false);
        mv.visitInsn(RETURN);
        mv.visitMaxs(9, 2);
        mv.visitEnd();
    }
}

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

License:Open Source License

static void genLayoutTypeImpl(ClassVisitor cw, MethodVisitor mv, FieldVisitor fv, String typeName,
        boolean layoutContainsVLA) {
    {//from   w  ww .  j a  va 2 s  . c  o  m
        fv = cw.visitField(ACC_PRIVATE + ACC_FINAL + ACC_STATIC, "unsafe", "Lsun/misc/Unsafe;", null, null);
        fv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "containsVLA", "()Z", null, null);
        mv.visitCode();
        //if layout contains VLA return true, otherwise false
        if (layoutContainsVLA) {
            mv.visitInsn(ICONST_1);
        } else {
            mv.visitInsn(ICONST_0);
        }
        mv.visitInsn(IRETURN);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    {
        fv = cw.visitField(ACC_PROTECTED, "location", "Lcom/ibm/layout/Location;", null, null);
        fv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "bindLocation", "(Lcom/ibm/layout/Location;)V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKEVIRTUAL, typeName, "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, typeName, "location", "Lcom/ibm/layout/Location;");
        mv.visitLabel(l0);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitInsn(RETURN);
        mv.visitMaxs(3, 2);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "writeToByteArray", "(J[BII)I", null, null);
        mv.visitCode();
        mv.visitVarInsn(ILOAD, 5);
        mv.visitInsn(I2L);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKEVIRTUAL, typeName, "sizeof", "()J", false);
        mv.visitInsn(LCMP);
        Label l0 = new Label();
        mv.visitJumpInsn(IFLE, l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKEVIRTUAL, typeName, "sizeof", "()J", false);
        mv.visitInsn(L2I);
        mv.visitVarInsn(ISTORE, 5);
        mv.visitLabel(l0);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, typeName, "location", "Lcom/ibm/layout/Location;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getData", "()[B", false);
        Label l1 = new Label();
        mv.visitJumpInsn(IFNULL, l1);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, typeName, "location", "Lcom/ibm/layout/Location;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getData", "()[B", false);
        mv.visitVarInsn(LLOAD, 1);
        mv.visitInsn(L2I);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitVarInsn(ILOAD, 4);
        mv.visitVarInsn(ILOAD, 5);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/System", "arraycopy",
                "(Ljava/lang/Object;ILjava/lang/Object;II)V", false);
        Label l2 = new Label();
        mv.visitJumpInsn(GOTO, l2);
        mv.visitLabel(l1);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitFieldInsn(GETSTATIC, typeName, "unsafe", "Lsun/misc/Unsafe;");
        mv.visitInsn(ACONST_NULL);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, typeName, "location", "Lcom/ibm/layout/Location;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getOffset", "()J", false);
        mv.visitVarInsn(LLOAD, 1);
        mv.visitInsn(LADD);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitFieldInsn(GETSTATIC, typeName, "unsafe", "Lsun/misc/Unsafe;");
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "sun/misc/Unsafe", "arrayBaseOffset", "(Ljava/lang/Class;)I", false);
        mv.visitInsn(I2L);
        mv.visitVarInsn(ILOAD, 5);
        mv.visitInsn(I2L);
        mv.visitMethodInsn(INVOKEVIRTUAL, "sun/misc/Unsafe", "copyMemory",
                "(Ljava/lang/Object;JLjava/lang/Object;JJ)V", false);
        mv.visitLabel(l2);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitVarInsn(ILOAD, 5);
        mv.visitInsn(IRETURN);
        mv.visitMaxs(9, 6);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "readFromByteArray", "(J[BII)I", null, null);
        mv.visitCode();
        mv.visitVarInsn(ILOAD, 5);
        mv.visitInsn(I2L);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKEVIRTUAL, typeName, "sizeof", "()J", false);
        mv.visitInsn(LCMP);
        Label l0 = new Label();
        mv.visitJumpInsn(IFLE, l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKEVIRTUAL, typeName, "sizeof", "()J", false);
        mv.visitInsn(L2I);
        mv.visitVarInsn(ISTORE, 5);
        mv.visitLabel(l0);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, typeName, "location", "Lcom/ibm/layout/Location;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getData", "()[B", false);
        Label l1 = new Label();
        mv.visitJumpInsn(IFNULL, l1);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitVarInsn(ILOAD, 4);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, typeName, "location", "Lcom/ibm/layout/Location;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getData", "()[B", false);
        mv.visitVarInsn(LLOAD, 1);
        mv.visitInsn(L2I);
        mv.visitVarInsn(ILOAD, 5);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/System", "arraycopy",
                "(Ljava/lang/Object;ILjava/lang/Object;II)V", false);
        Label l2 = new Label();
        mv.visitJumpInsn(GOTO, l2);
        mv.visitLabel(l1);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitFieldInsn(GETSTATIC, typeName, "unsafe", "Lsun/misc/Unsafe;");
        mv.visitVarInsn(ALOAD, 3);
        mv.visitFieldInsn(GETSTATIC, typeName, "unsafe", "Lsun/misc/Unsafe;");
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "sun/misc/Unsafe", "arrayBaseOffset", "(Ljava/lang/Class;)I", false);
        mv.visitVarInsn(ILOAD, 4);
        mv.visitInsn(IADD);
        mv.visitInsn(I2L);
        mv.visitInsn(ACONST_NULL);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, typeName, "location", "Lcom/ibm/layout/Location;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getOffset", "()J", false);
        mv.visitVarInsn(LLOAD, 1);
        mv.visitInsn(LADD);
        mv.visitVarInsn(ILOAD, 5);
        mv.visitInsn(I2L);
        mv.visitMethodInsn(INVOKEVIRTUAL, "sun/misc/Unsafe", "copyMemory",
                "(Ljava/lang/Object;JLjava/lang/Object;JJ)V", false);
        mv.visitLabel(l2);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitVarInsn(ILOAD, 5);
        mv.visitInsn(IRETURN);
        mv.visitMaxs(9, 6);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "asByteBuffer", "()Ljava/nio/ByteBuffer;", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, typeName, "location", "Lcom/ibm/layout/Location;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getData", "()[B", false);
        Label l0 = new Label();
        mv.visitJumpInsn(IFNULL, l0);
        mv.visitTypeInsn(NEW, "java/lang/UnsupportedOperationException");
        mv.visitInsn(DUP);
        mv.visitLdcInsn("not off-heap");
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/UnsupportedOperationException", "<init>",
                "(Ljava/lang/String;)V", false);
        mv.visitInsn(ATHROW);
        mv.visitLabel(l0);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, typeName, "location", "Lcom/ibm/layout/Location;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getOffset", "()J", false);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKEVIRTUAL, typeName, "sizeof", "()J", false);
        mv.visitMethodInsn(INVOKESTATIC, "com/ibm/layout/UnsafeHelper", "bufferFromAddress",
                "(JJ)Ljava/nio/ByteBuffer;", false);
        mv.visitVarInsn(ASTORE, 1);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKESTATIC, "java/nio/ByteOrder", "nativeOrder", "()Ljava/nio/ByteOrder;", false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/nio/ByteBuffer", "order",
                "(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;", false);
        mv.visitInsn(POP);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitInsn(ARETURN);
        mv.visitMaxs(4, 2);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL + ACC_STATIC, "asByteBuffer",
                "(Lcom/ibm/layout/Location;J)Ljava/nio/ByteBuffer;", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getData", "()[B", false);
        Label l0 = new Label();
        mv.visitJumpInsn(IFNULL, l0);
        mv.visitTypeInsn(NEW, "java/lang/UnsupportedOperationException");
        mv.visitInsn(DUP);
        mv.visitLdcInsn("not off-heap");
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/UnsupportedOperationException", "<init>",
                "(Ljava/lang/String;)V", false);
        mv.visitInsn(ATHROW);
        mv.visitLabel(l0);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/Location", "getOffset", "()J", false);
        mv.visitVarInsn(LLOAD, 1);
        mv.visitMethodInsn(INVOKESTATIC, "com/ibm/layout/UnsafeHelper", "bufferFromAddress",
                "(JJ)Ljava/nio/ByteBuffer;", false);
        mv.visitVarInsn(ASTORE, 3);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKESTATIC, "java/nio/ByteOrder", "nativeOrder", "()Ljava/nio/ByteOrder;", false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/nio/ByteBuffer", "order",
                "(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;", false);
        mv.visitInsn(POP);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitInsn(ARETURN);
        mv.visitMaxs(4, 4);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "unsafeCast", "(Ljava/lang/Class;)Lcom/ibm/layout/Layout;",
                "<T::Lcom/ibm/layout/Layout;>(Ljava/lang/Class<TT;>;)TT;", null);
        mv.visitCode();
        Label l0 = new Label();
        Label l1 = new Label();
        Label l2 = new Label();
        mv.visitTryCatchBlock(l0, l1, l2, "java/lang/NoSuchMethodException");
        Label l3 = new Label();
        mv.visitTryCatchBlock(l0, l1, l3, "java/lang/SecurityException");
        Label l4 = new Label();
        mv.visitTryCatchBlock(l0, l1, l4, "java/lang/InstantiationException");
        Label l5 = new Label();
        mv.visitTryCatchBlock(l0, l1, l5, "java/lang/IllegalAccessException");
        Label l6 = new Label();
        mv.visitTryCatchBlock(l0, l1, l6, "java/lang/IllegalArgumentException");
        Label l7 = new Label();
        mv.visitTryCatchBlock(l0, l1, l7, "java/lang/reflect/InvocationTargetException");
        mv.visitLabel(l0);
        mv.visitMethodInsn(INVOKESTATIC, "com/ibm/layout/LayoutHelper", "getFactory",
                "()Lcom/ibm/layout/LayoutHelper;", false);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/LayoutHelper", "genLayoutImpl",
                "(Ljava/lang/Class;)Ljava/lang/Class;", false);
        mv.visitVarInsn(ASTORE, 2);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitInsn(ICONST_0);
        mv.visitTypeInsn(ANEWARRAY, "java/lang/Class");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getDeclaredConstructor",
                "([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;", false);
        mv.visitVarInsn(ASTORE, 3);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitInsn(ICONST_1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Constructor", "setAccessible", "(Z)V", false);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitInsn(ICONST_0);
        mv.visitTypeInsn(ANEWARRAY, "java/lang/Object");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Constructor", "newInstance",
                "([Ljava/lang/Object;)Ljava/lang/Object;", false);
        mv.visitTypeInsn(CHECKCAST, "com/ibm/layout/Layout");
        mv.visitVarInsn(ASTORE, 4);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, typeName, "location", "Lcom/ibm/layout/Location;");
        mv.visitMethodInsn(INVOKEINTERFACE, "com/ibm/layout/Layout", "bindLocation",
                "(Lcom/ibm/layout/Location;)V", true);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitLabel(l1);
        mv.visitInsn(ARETURN);
        mv.visitLabel(l2);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/NoSuchMethodException" });
        mv.visitVarInsn(ASTORE, 2);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/NoSuchMethodException", "printStackTrace", "()V", false);
        Label l8 = new Label();
        mv.visitJumpInsn(GOTO, l8);
        mv.visitLabel(l3);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/SecurityException" });
        mv.visitVarInsn(ASTORE, 2);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/SecurityException", "printStackTrace", "()V", false);
        mv.visitJumpInsn(GOTO, l8);
        mv.visitLabel(l4);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/InstantiationException" });
        mv.visitVarInsn(ASTORE, 2);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/InstantiationException", "printStackTrace", "()V", false);
        mv.visitJumpInsn(GOTO, l8);
        mv.visitLabel(l5);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/IllegalAccessException" });
        mv.visitVarInsn(ASTORE, 2);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/IllegalAccessException", "printStackTrace", "()V", false);
        mv.visitJumpInsn(GOTO, l8);
        mv.visitLabel(l6);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/IllegalArgumentException" });
        mv.visitVarInsn(ASTORE, 2);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/IllegalArgumentException", "printStackTrace", "()V",
                false);
        mv.visitJumpInsn(GOTO, l8);
        mv.visitLabel(l7);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1,
                new Object[] { "java/lang/reflect/InvocationTargetException" });
        mv.visitVarInsn(ASTORE, 2);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/InvocationTargetException", "printStackTrace",
                "()V", false);
        mv.visitLabel(l8);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitInsn(ACONST_NULL);
        mv.visitInsn(ARETURN);
        mv.visitMaxs(2, 5);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "unsafeCast",
                "(Ljava/lang/Class;J)Lcom/ibm/layout/Array1D;",
                "<T::Lcom/ibm/layout/Layout;>(Ljava/lang/Class<TT;>;J)Lcom/ibm/layout/Array1D<TT;>;", null);
        mv.visitCode();
        Label l0 = new Label();
        Label l1 = new Label();
        Label l2 = new Label();
        mv.visitTryCatchBlock(l0, l1, l2, "java/lang/NoSuchMethodException");
        Label l3 = new Label();
        mv.visitTryCatchBlock(l0, l1, l3, "java/lang/SecurityException");
        Label l4 = new Label();
        mv.visitTryCatchBlock(l0, l1, l4, "java/lang/InstantiationException");
        Label l5 = new Label();
        mv.visitTryCatchBlock(l0, l1, l5, "java/lang/IllegalAccessException");
        Label l6 = new Label();
        mv.visitTryCatchBlock(l0, l1, l6, "java/lang/IllegalArgumentException");
        Label l7 = new Label();
        mv.visitTryCatchBlock(l0, l1, l7, "java/lang/reflect/InvocationTargetException");
        mv.visitLabel(l0);
        mv.visitMethodInsn(INVOKESTATIC, "com/ibm/layout/LayoutHelper", "getFactory",
                "()Lcom/ibm/layout/LayoutHelper;", false);
        mv.visitVarInsn(ASTORE, 4);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/LayoutHelper", "genLayoutImpl",
                "(Ljava/lang/Class;)Ljava/lang/Class;", false);
        mv.visitVarInsn(ASTORE, 5);
        mv.visitVarInsn(ALOAD, 5);
        mv.visitInsn(ICONST_0);
        mv.visitTypeInsn(ANEWARRAY, "java/lang/Class");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getDeclaredConstructor",
                "([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;", false);
        mv.visitVarInsn(ASTORE, 6);
        mv.visitVarInsn(ALOAD, 6);
        mv.visitInsn(ICONST_1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Constructor", "setAccessible", "(Z)V", false);
        mv.visitVarInsn(ALOAD, 6);
        mv.visitInsn(ICONST_0);
        mv.visitTypeInsn(ANEWARRAY, "java/lang/Object");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Constructor", "newInstance",
                "([Ljava/lang/Object;)Ljava/lang/Object;", false);
        mv.visitTypeInsn(CHECKCAST, "com/ibm/layout/Layout");
        mv.visitMethodInsn(INVOKEINTERFACE, "com/ibm/layout/Layout", "sizeof", "()J", true);
        mv.visitVarInsn(LSTORE, 7);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "com/ibm/layout/LayoutHelper", "genArray1DImpl",
                "(Ljava/lang/Class;)Ljava/lang/Class;", false);
        mv.visitVarInsn(ASTORE, 9);
        mv.visitVarInsn(ALOAD, 9);
        mv.visitInsn(ICONST_2);
        mv.visitTypeInsn(ANEWARRAY, "java/lang/Class");
        mv.visitInsn(DUP);
        mv.visitInsn(ICONST_0);
        mv.visitFieldInsn(GETSTATIC, "java/lang/Long", "TYPE", "Ljava/lang/Class;");
        mv.visitInsn(AASTORE);
        mv.visitInsn(DUP);
        mv.visitInsn(ICONST_1);
        mv.visitFieldInsn(GETSTATIC, "java/lang/Long", "TYPE", "Ljava/lang/Class;");
        mv.visitInsn(AASTORE);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getDeclaredConstructor",
                "([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;", false);
        mv.visitVarInsn(ASTORE, 10);
        mv.visitVarInsn(ALOAD, 10);
        mv.visitInsn(ICONST_1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Constructor", "setAccessible", "(Z)V", false);
        mv.visitVarInsn(ALOAD, 10);
        mv.visitInsn(ICONST_2);
        mv.visitTypeInsn(ANEWARRAY, "java/lang/Object");
        mv.visitInsn(DUP);
        mv.visitInsn(ICONST_0);
        mv.visitVarInsn(LLOAD, 2);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;", false);
        mv.visitInsn(AASTORE);
        mv.visitInsn(DUP);
        mv.visitInsn(ICONST_1);
        mv.visitVarInsn(LLOAD, 7);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;", false);
        mv.visitInsn(AASTORE);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Constructor", "newInstance",
                "([Ljava/lang/Object;)Ljava/lang/Object;", false);
        mv.visitTypeInsn(CHECKCAST, "com/ibm/layout/Array1D");
        mv.visitVarInsn(ASTORE, 11);
        mv.visitVarInsn(ALOAD, 11);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, typeName, "location", "Lcom/ibm/layout/Location;");
        mv.visitMethodInsn(INVOKEINTERFACE, "com/ibm/layout/Array1D", "bindLocation",
                "(Lcom/ibm/layout/Location;)V", true);
        mv.visitVarInsn(ALOAD, 11);
        mv.visitLabel(l1);
        mv.visitInsn(ARETURN);
        mv.visitLabel(l2);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/NoSuchMethodException" });
        mv.visitVarInsn(ASTORE, 4);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/NoSuchMethodException", "printStackTrace", "()V", false);
        Label l8 = new Label();
        mv.visitJumpInsn(GOTO, l8);
        mv.visitLabel(l3);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/SecurityException" });
        mv.visitVarInsn(ASTORE, 4);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/SecurityException", "printStackTrace", "()V", false);
        mv.visitJumpInsn(GOTO, l8);
        mv.visitLabel(l4);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/InstantiationException" });
        mv.visitVarInsn(ASTORE, 4);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/InstantiationException", "printStackTrace", "()V", false);
        mv.visitJumpInsn(GOTO, l8);
        mv.visitLabel(l5);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/IllegalAccessException" });
        mv.visitVarInsn(ASTORE, 4);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/IllegalAccessException", "printStackTrace", "()V", false);
        mv.visitJumpInsn(GOTO, l8);
        mv.visitLabel(l6);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/IllegalArgumentException" });
        mv.visitVarInsn(ASTORE, 4);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/IllegalArgumentException", "printStackTrace", "()V",
                false);
        mv.visitJumpInsn(GOTO, l8);
        mv.visitLabel(l7);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1,
                new Object[] { "java/lang/reflect/InvocationTargetException" });
        mv.visitVarInsn(ASTORE, 4);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/InvocationTargetException", "printStackTrace",
                "()V", false);
        mv.visitLabel(l8);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitInsn(ACONST_NULL);
        mv.visitInsn(ARETURN);
        mv.visitMaxs(6, 12);
        mv.visitEnd();
    }
}

From source file:com.liferay.portal.upgrade.test.BaseBuildAutoUpgradeTestCase.java

License:Open Source License

private void _initTableColumns(MethodVisitor methodVisitor, Object[][] tableColumns) {

    methodVisitor.visitCode();//from w w w.  j  a v a 2  s  .c om

    methodVisitor.visitInsn(Opcodes.ICONST_0 + tableColumns.length);
    methodVisitor.visitTypeInsn(Opcodes.ANEWARRAY, Type.getDescriptor(Object[].class));
    methodVisitor.visitInsn(Opcodes.DUP);

    for (int i = 0; i < tableColumns.length; i++) {
        Object[] tableColumn = tableColumns[i];

        methodVisitor.visitInsn(Opcodes.ICONST_0 + i);
        methodVisitor.visitInsn(Opcodes.ICONST_2);
        methodVisitor.visitTypeInsn(Opcodes.ANEWARRAY, Type.getInternalName(Object.class));
        methodVisitor.visitInsn(Opcodes.DUP);
        methodVisitor.visitInsn(Opcodes.ICONST_0);
        methodVisitor.visitLdcInsn(tableColumn[0]);
        methodVisitor.visitInsn(Opcodes.AASTORE);
        methodVisitor.visitInsn(Opcodes.DUP);
        methodVisitor.visitInsn(Opcodes.ICONST_1);
        methodVisitor.visitIntInsn(Opcodes.BIPUSH, (Integer) tableColumn[1]);
        methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(Integer.class), "valueOf",
                Type.getMethodDescriptor(Type.getType(Integer.class), Type.INT_TYPE), false);

        methodVisitor.visitInsn(Opcodes.AASTORE);
        methodVisitor.visitInsn(Opcodes.AASTORE);

        if (i < (tableColumns.length - 1)) {
            methodVisitor.visitInsn(Opcodes.DUP);
        }
    }

    methodVisitor.visitFieldInsn(Opcodes.PUTSTATIC,
            Type.getInternalName(BuildAutoUpgradeTestEntityModelImpl.class), "TABLE_COLUMNS",
            Type.getDescriptor(Object[][].class));
    methodVisitor.visitInsn(Opcodes.RETURN);
    methodVisitor.visitMaxs(0, 0);
    methodVisitor.visitEnd();
}

From source file:com.lighters.asm.HelloWorld.java

License:Apache License

public static void main(final String args[]) throws Exception {
    // Generates the bytecode corresponding to the following Java class:
    ////  www.  jav a 2  s.  c o m
    // public class Example {
    // public static void main (String[] args) {
    // System.out.println("Hello world!");
    // }
    // }

    // creates a ClassWriter for the Example public class,
    // which inherits from Object
    ClassWriter cw = new ClassWriter(0);
    cw.visit(V1_1, ACC_PUBLIC, "Example", null, "java/lang/Object", null);

    // creates a MethodWriter for the (implicit) constructor
    MethodVisitor mw = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
    // pushes the 'this' variable
    mw.visitVarInsn(ALOAD, 0);
    // invokes the super class constructor
    mw.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
    mw.visitInsn(RETURN);
    // this code uses a maximum of one stack element and one local variable
    mw.visitMaxs(1, 1);
    mw.visitEnd();

    // creates a MethodWriter for the 'main' method
    mw = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);
    // pushes the 'out' field (of type PrintStream) of the System class
    mw.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
    // pushes the "Hello World!" String constant
    mw.visitLdcInsn("Hello world!");
    // invokes the 'println' method (defined in the PrintStream class)
    mw.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
    mw.visitInsn(RETURN);
    // this code uses a maximum of two stack elements and two local
    // variables
    mw.visitMaxs(2, 2);
    mw.visitEnd();

    // gets the bytecode of the Example class, and loads it dynamically
    byte[] code = cw.toByteArray();

    FileOutputStream fos = new FileOutputStream("Example.class");
    fos.write(code);
    fos.close();

    HelloWorld loader = new HelloWorld();
    Class<?> exampleClass = loader.defineClass("Example", code, 0, code.length);

    // uses the dynamically generated class to print 'Helloworld'
    exampleClass.getMethods()[0].invoke(null, new Object[] { null });

    // ------------------------------------------------------------------------
    // Same example with a GeneratorAdapter (more convenient but slower)
    // ------------------------------------------------------------------------

    cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    cw.visit(V1_1, ACC_PUBLIC, "Example", null, "java/lang/Object", null);

    // creates a GeneratorAdapter for the (implicit) constructor
    Method m = Method.getMethod("void <init> ()");
    GeneratorAdapter mg = new GeneratorAdapter(ACC_PUBLIC, m, null, null, cw);
    mg.loadThis();
    mg.invokeConstructor(Type.getType(Object.class), m);
    mg.returnValue();
    mg.endMethod();

    // creates a GeneratorAdapter for the 'main' method
    m = Method.getMethod("void main (String[])");
    mg = new GeneratorAdapter(ACC_PUBLIC + ACC_STATIC, m, null, null, cw);
    mg.getStatic(Type.getType(System.class), "out", Type.getType(PrintStream.class));
    mg.push("Hello world!");
    mg.invokeVirtual(Type.getType(PrintStream.class), Method.getMethod("void println (String)"));
    mg.returnValue();
    mg.endMethod();

    cw.visitEnd();

    code = cw.toByteArray();
    loader = new HelloWorld();
    exampleClass = loader.defineClass("Example", code, 0, code.length);

    // uses the dynamically generated class to print 'Helloworld'
    exampleClass.getMethods()[0].invoke(null, new Object[] { null });
}