Example usage for org.objectweb.asm MethodVisitor visitJumpInsn

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

Introduction

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

Prototype

public void visitJumpInsn(final int opcode, final Label label) 

Source Link

Document

Visits a jump instruction.

Usage

From source file:org.qi4j.runtime.composite.TransientClassLoader.java

License:Open Source License

public static byte[] generateClass(String name, Class baseClass) throws ClassNotFoundException {
    String classSlash = name.replace('.', '/');
    String baseClassSlash = getInternalName(baseClass);

    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    FieldVisitor fv;//  ww w .  j a  v a  2s .  c  om
    MethodVisitor mv;
    AnnotationVisitor av0;

    // Class definition start
    cw.visit(jdkVersion, ACC_PUBLIC + ACC_SUPER, classSlash, null, baseClassSlash, null);

    // Composite reference
    {
        fv = cw.visitField(ACC_PUBLIC, "_instance", "Lorg/qi4j/api/composite/CompositeInvoker;", null, null);
        fv.visitEnd();
    }

    // Static Method references
    {
        int idx = 1;
        for (Method method : baseClass.getMethods()) {
            if (isOverloaded(method, baseClass)) {
                fv = cw.visitField(ACC_PRIVATE + ACC_STATIC, "m" + idx++, "Ljava/lang/reflect/Method;", null,
                        null);
                fv.visitEnd();
            }
        }
    }

    // Constructors
    for (Constructor constructor : baseClass.getDeclaredConstructors()) {
        if (Modifier.isPublic(constructor.getModifiers()) || Modifier.isProtected(constructor.getModifiers())) {
            String desc = org.objectweb.asm.commons.Method.getMethod(constructor).getDescriptor();
            mv = cw.visitMethod(ACC_PUBLIC, "<init>", desc, null, null);
            mv.visitCode();
            mv.visitVarInsn(ALOAD, 0);

            int idx = 1;
            for (Class aClass : constructor.getParameterTypes()) {
                // TODO Handle other types than objects (?)
                mv.visitVarInsn(ALOAD, idx++);
            }

            mv.visitMethodInsn(INVOKESPECIAL, baseClassSlash, "<init>", desc);
            mv.visitInsn(RETURN);
            mv.visitMaxs(idx, idx);
            mv.visitEnd();
        }
    }

    // Overloaded and unimplemented methods
    Method[] methods = baseClass.getMethods();
    int idx = 0;
    List<Label> exceptionLabels = new ArrayList<Label>();
    for (Method method : methods) {
        if (isOverloaded(method, baseClass)) {
            idx++;
            String methodName = method.getName();
            String desc = org.objectweb.asm.commons.Method.getMethod(method).getDescriptor();

            String[] exceptions = null;
            {
                mv = cw.visitMethod(ACC_PUBLIC, methodName, desc, null, exceptions);
                if (isInternalQi4jMethod(method, baseClass)) {
                    // generate a NoOp method...
                    mv.visitInsn(RETURN);
                } else {
                    Label endLabel = null; // Use this if return type is void
                    if (method.getExceptionTypes().length > 0) {
                        exceptions = new String[method.getExceptionTypes().length];
                        for (int i = 0; i < method.getExceptionTypes().length; i++) {
                            Class<?> aClass = method.getExceptionTypes()[i];
                            exceptions[i] = getInternalName(aClass);
                        }
                    }
                    mv.visitCode();
                    Label l0 = new Label();
                    Label l1 = new Label();

                    exceptionLabels.clear();
                    for (Class<?> declaredException : method.getExceptionTypes()) {
                        Label ld = new Label();
                        mv.visitTryCatchBlock(l0, l1, ld, getInternalName(declaredException));
                        exceptionLabels.add(ld); // Reuse this further down for the catch
                    }

                    Label lruntime = new Label();
                    mv.visitTryCatchBlock(l0, l1, lruntime, "java/lang/RuntimeException");
                    Label lerror = new Label();
                    mv.visitTryCatchBlock(l0, l1, lerror, "java/lang/Throwable");

                    mv.visitLabel(l0);
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitFieldInsn(GETFIELD, classSlash, "_instance",
                            "Lorg/qi4j/api/composite/CompositeInvoker;");
                    mv.visitFieldInsn(GETSTATIC, classSlash, "m" + idx, "Ljava/lang/reflect/Method;");

                    int paramCount = method.getParameterTypes().length;
                    int stackIdx = 0;
                    if (paramCount == 0) {
                        // Send in null as parameter
                        mv.visitInsn(ACONST_NULL);
                    } else {
                        insn(mv, paramCount);
                        mv.visitTypeInsn(ANEWARRAY, "java/lang/Object");
                        int pidx = 0;
                        for (Class<?> aClass : method.getParameterTypes()) {
                            mv.visitInsn(DUP);
                            insn(mv, pidx++);
                            stackIdx = wrapParameter(mv, aClass, stackIdx + 1);
                            mv.visitInsn(AASTORE);
                        }
                    }

                    // Call method
                    mv.visitMethodInsn(INVOKEINTERFACE, "org/qi4j/api/composite/CompositeInvoker",
                            "invokeComposite",
                            "(Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;");

                    // Return value
                    if (!method.getReturnType().equals(Void.TYPE)) {
                        unwrapResult(mv, method.getReturnType(), l1);
                    } else {
                        mv.visitInsn(POP);
                        mv.visitLabel(l1);
                        endLabel = new Label();
                        mv.visitJumpInsn(GOTO, endLabel);
                    }

                    // Increase stack to beyond method args
                    stackIdx++;

                    // Declared exceptions
                    int exceptionIdx = 0;
                    for (Class<?> aClass : method.getExceptionTypes()) {
                        mv.visitLabel(exceptionLabels.get(exceptionIdx++));
                        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { getInternalName(aClass) });
                        mv.visitVarInsn(ASTORE, stackIdx);
                        mv.visitVarInsn(ALOAD, stackIdx);
                        mv.visitInsn(ATHROW);
                    }

                    // RuntimeException and Error catch-all
                    mv.visitLabel(lruntime);
                    mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/RuntimeException" });
                    mv.visitVarInsn(ASTORE, stackIdx);
                    mv.visitVarInsn(ALOAD, stackIdx);
                    mv.visitInsn(ATHROW);

                    mv.visitLabel(lerror);
                    mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/Throwable" });
                    mv.visitVarInsn(ASTORE, stackIdx);
                    mv.visitVarInsn(ALOAD, stackIdx);
                    mv.visitTypeInsn(CHECKCAST, "java/lang/Error");
                    mv.visitInsn(ATHROW);

                    // Return type = void
                    if (endLabel != null) {
                        mv.visitLabel(endLabel);
                        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
                        mv.visitInsn(RETURN);
                    }

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

            if (!Modifier.isAbstract(method.getModifiers())) {
                // Add method with _ as prefix
                mv = cw.visitMethod(ACC_PUBLIC, "_" + method.getName(), desc, null, exceptions);
                mv.visitCode();
                mv.visitVarInsn(ALOAD, 0);

                // Parameters
                int stackIdx = 1;
                for (Class<?> aClass : method.getParameterTypes()) {
                    stackIdx = loadParameter(mv, aClass, stackIdx) + 1;
                }

                // Call method
                mv.visitMethodInsn(INVOKESPECIAL, baseClassSlash, method.getName(), desc);

                // Return value
                if (!method.getReturnType().equals(Void.TYPE)) {
                    returnResult(mv, method.getReturnType());
                } else {
                    mv.visitInsn(RETURN);
                }

                mv.visitMaxs(1, 1);
                mv.visitEnd();
            }
        }
    }

    // Class initializer
    {
        mv = cw.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null);
        mv.visitCode();
        Label l0 = new Label();
        Label l1 = new Label();
        Label l2 = new Label();
        mv.visitTryCatchBlock(l0, l1, l2, "java/lang/NoSuchMethodException");
        mv.visitLabel(l0);

        // Lookup methods and store in static variables
        int midx = 0;
        for (Method method : methods) {
            if (isOverloaded(method, baseClass)) {
                method.setAccessible(true);
                Class methodClass;
                methodClass = method.getDeclaringClass();

                midx++;

                mv.visitLdcInsn(Type.getType(methodClass));
                mv.visitLdcInsn(method.getName());
                insn(mv, method.getParameterTypes().length);
                mv.visitTypeInsn(ANEWARRAY, "java/lang/Class");

                int pidx = 0;
                for (Class<?> aClass : method.getParameterTypes()) {
                    mv.visitInsn(DUP);
                    insn(mv, pidx++);
                    type(mv, aClass);
                    mv.visitInsn(AASTORE);
                }

                mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getMethod",
                        "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;");
                mv.visitFieldInsn(PUTSTATIC, classSlash, "m" + midx, "Ljava/lang/reflect/Method;");
            }
        }

        mv.visitLabel(l1);
        Label l3 = new Label();
        mv.visitJumpInsn(GOTO, l3);
        mv.visitLabel(l2);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/NoSuchMethodException" });
        mv.visitVarInsn(ASTORE, 0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/NoSuchMethodException", "printStackTrace", "()V");
        mv.visitLabel(l3);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitInsn(RETURN);
        mv.visitMaxs(6, 1);
        mv.visitEnd();
    }

    cw.visitEnd();

    return cw.toByteArray();
}

From source file:org.qi4j.test.ASMTest.java

License:Open Source License

public static byte[] generateClass() {
    ClassWriter cw = new ClassWriter(0);
    FieldVisitor fv;/*from www.  ja v  a  2 s  .c om*/
    MethodVisitor mv;
    AnnotationVisitor av0;

    cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, "org/qi4j/satisfiedBy/SomeMixin_Stub", null,
            "org/qi4j/satisfiedBy/SomeMixin", null);

    {
        fv = cw.visitField(ACC_PUBLIC, "_instance", "Lorg/qi4j/spi/composite/CompositeInvoker;", null, null);
        fv.visitEnd();
    }
    {
        fv = cw.visitField(ACC_PRIVATE + ACC_STATIC, "m1", "Ljava/lang/reflect/Method;", null, null);
        fv.visitEnd();
    }
    {
        fv = cw.visitField(ACC_PRIVATE + ACC_STATIC, "m2", "Ljava/lang/reflect/Method;", null, null);
        fv.visitEnd();
    }
    {
        fv = cw.visitField(ACC_PRIVATE + ACC_STATIC, "m3", "Ljava/lang/reflect/Method;", null, null);
        fv.visitEnd();
    }
    {
        fv = cw.visitField(ACC_PRIVATE + ACC_STATIC, "m4", "Ljava/lang/reflect/Method;", null, null);
        fv.visitEnd();
    }
    {
        fv = cw.visitField(ACC_PRIVATE + ACC_STATIC, "m5", "Ljava/lang/reflect/Method;", null, null);
        fv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, "org/qi4j/satisfiedBy/SomeMixin", "<init>", "()V");
        mv.visitInsn(RETURN);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(Ljava/lang/String;)V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKESPECIAL, "org/qi4j/satisfiedBy/SomeMixin", "<init>", "(Ljava/lang/String;)V");
        mv.visitInsn(RETURN);
        mv.visitMaxs(2, 2);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "other", "()Ljava/lang/String;", null, null);
        mv.visitCode();
        Label l0 = new Label();
        Label l1 = new Label();
        Label l2 = new Label();
        mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Throwable");
        mv.visitLabel(l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/qi4j/satisfiedBy/SomeMixin_Stub", "_instance",
                "Lorg/qi4j/spi/composite/CompositeInvoker;");
        mv.visitFieldInsn(GETSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m1", "Ljava/lang/reflect/Method;");
        mv.visitInsn(ACONST_NULL);
        mv.visitMethodInsn(INVOKEINTERFACE, "org/qi4j/spi/composite/CompositeInvoker", "invokeComposite",
                "(Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;");
        mv.visitTypeInsn(CHECKCAST, "java/lang/String");
        mv.visitLabel(l1);
        mv.visitInsn(ARETURN);
        mv.visitLabel(l2);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/Throwable" });
        mv.visitVarInsn(ASTORE, 1);
        mv.visitTypeInsn(NEW, "java/lang/reflect/UndeclaredThrowableException");
        mv.visitInsn(DUP);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/reflect/UndeclaredThrowableException", "<init>",
                "(Ljava/lang/Throwable;)V");
        mv.visitInsn(ATHROW);
        mv.visitMaxs(3, 2);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "foo", "(Ljava/lang/String;I)Ljava/lang/String;", null,
                new String[] { "java/lang/IllegalArgumentException" });
        mv.visitCode();
        Label l0 = new Label();
        Label l1 = new Label();
        Label l2 = new Label();
        mv.visitTryCatchBlock(l0, l1, l2, "java/lang/IllegalArgumentException");
        Label l3 = new Label();
        mv.visitTryCatchBlock(l0, l1, l3, "java/lang/Throwable");
        mv.visitLabel(l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/qi4j/satisfiedBy/SomeMixin_Stub", "_instance",
                "Lorg/qi4j/spi/composite/CompositeInvoker;");
        mv.visitFieldInsn(GETSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m2", "Ljava/lang/reflect/Method;");
        mv.visitInsn(ICONST_2);
        mv.visitTypeInsn(ANEWARRAY, "java/lang/Object");
        mv.visitInsn(DUP);
        mv.visitInsn(ICONST_0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitInsn(AASTORE);
        mv.visitInsn(DUP);
        mv.visitInsn(ICONST_1);
        mv.visitVarInsn(ILOAD, 2);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;");
        mv.visitInsn(AASTORE);
        mv.visitMethodInsn(INVOKEINTERFACE, "org/qi4j/spi/composite/CompositeInvoker", "invokeComposite",
                "(Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;");
        mv.visitTypeInsn(CHECKCAST, "java/lang/String");
        mv.visitLabel(l1);
        mv.visitInsn(ARETURN);
        mv.visitLabel(l2);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/IllegalArgumentException" });
        mv.visitVarInsn(ASTORE, 3);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitInsn(ATHROW);
        mv.visitLabel(l3);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/Throwable" });
        mv.visitVarInsn(ASTORE, 3);
        mv.visitTypeInsn(NEW, "java/lang/reflect/UndeclaredThrowableException");
        mv.visitInsn(DUP);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/reflect/UndeclaredThrowableException", "<init>",
                "(Ljava/lang/Throwable;)V");
        mv.visitInsn(ATHROW);
        mv.visitMaxs(6, 4);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "bar", "(DZFCIJSBLjava/lang/Double;[Ljava/lang/Object;[I)V", null,
                null);
        mv.visitCode();
        Label l0 = new Label();
        Label l1 = new Label();
        Label l2 = new Label();
        mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Throwable");
        mv.visitLabel(l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/qi4j/satisfiedBy/SomeMixin_Stub", "_instance",
                "Lorg/qi4j/spi/composite/CompositeInvoker;");
        mv.visitFieldInsn(GETSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m3", "Ljava/lang/reflect/Method;");
        mv.visitIntInsn(BIPUSH, 11);
        mv.visitTypeInsn(ANEWARRAY, "java/lang/Object");
        mv.visitInsn(DUP);
        mv.visitInsn(ICONST_0);
        mv.visitVarInsn(DLOAD, 1);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/Double", "valueOf", "(D)Ljava/lang/Double;");
        mv.visitInsn(AASTORE);
        mv.visitInsn(DUP);
        mv.visitInsn(ICONST_1);
        mv.visitVarInsn(ILOAD, 3);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;");
        mv.visitInsn(AASTORE);
        mv.visitInsn(DUP);
        mv.visitInsn(ICONST_2);
        mv.visitVarInsn(FLOAD, 4);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/Float", "valueOf", "(F)Ljava/lang/Float;");
        mv.visitInsn(AASTORE);
        mv.visitInsn(DUP);
        mv.visitInsn(ICONST_3);
        mv.visitVarInsn(ILOAD, 5);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/Character", "valueOf", "(C)Ljava/lang/Character;");
        mv.visitInsn(AASTORE);
        mv.visitInsn(DUP);
        mv.visitInsn(ICONST_4);
        mv.visitVarInsn(ILOAD, 6);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;");
        mv.visitInsn(AASTORE);
        mv.visitInsn(DUP);
        mv.visitInsn(ICONST_5);
        mv.visitVarInsn(LLOAD, 7);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;");
        mv.visitInsn(AASTORE);
        mv.visitInsn(DUP);
        mv.visitIntInsn(BIPUSH, 6);
        mv.visitVarInsn(ILOAD, 9);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/Short", "valueOf", "(S)Ljava/lang/Short;");
        mv.visitInsn(AASTORE);
        mv.visitInsn(DUP);
        mv.visitIntInsn(BIPUSH, 7);
        mv.visitVarInsn(ILOAD, 10);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/Byte", "valueOf", "(B)Ljava/lang/Byte;");
        mv.visitInsn(AASTORE);
        mv.visitInsn(DUP);
        mv.visitIntInsn(BIPUSH, 8);
        mv.visitVarInsn(ALOAD, 11);
        mv.visitInsn(AASTORE);
        mv.visitInsn(DUP);
        mv.visitIntInsn(BIPUSH, 9);
        mv.visitVarInsn(ALOAD, 12);
        mv.visitInsn(AASTORE);
        mv.visitInsn(DUP);
        mv.visitIntInsn(BIPUSH, 10);
        mv.visitVarInsn(ALOAD, 13);
        mv.visitInsn(AASTORE);
        mv.visitMethodInsn(INVOKEINTERFACE, "org/qi4j/spi/composite/CompositeInvoker", "invokeComposite",
                "(Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;");
        mv.visitInsn(POP);
        mv.visitLabel(l1);
        Label l3 = new Label();
        mv.visitJumpInsn(GOTO, l3);
        mv.visitLabel(l2);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/Throwable" });
        mv.visitVarInsn(ASTORE, 14);
        mv.visitTypeInsn(NEW, "java/lang/reflect/UndeclaredThrowableException");
        mv.visitInsn(DUP);
        mv.visitVarInsn(ALOAD, 14);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/reflect/UndeclaredThrowableException", "<init>",
                "(Ljava/lang/Throwable;)V");
        mv.visitInsn(ATHROW);
        mv.visitLabel(l3);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitInsn(RETURN);
        mv.visitMaxs(7, 15);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "multiEx", "(Ljava/lang/String;)V", null,
                new String[] { "org/qi4j/satisfiedBy/Exception1", "org/qi4j/satisfiedBy/Exception2" });
        mv.visitCode();
        Label l0 = new Label();
        Label l1 = new Label();
        Label l2 = new Label();
        mv.visitTryCatchBlock(l0, l1, l2, "org/qi4j/satisfiedBy/Exception1");
        Label l3 = new Label();
        mv.visitTryCatchBlock(l0, l1, l3, "org/qi4j/satisfiedBy/Exception2");
        Label l4 = new Label();
        mv.visitTryCatchBlock(l0, l1, l4, "java/lang/Throwable");
        mv.visitLabel(l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/qi4j/satisfiedBy/SomeMixin_Stub", "_instance",
                "Lorg/qi4j/spi/composite/CompositeInvoker;");
        mv.visitFieldInsn(GETSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m4", "Ljava/lang/reflect/Method;");
        mv.visitInsn(ICONST_1);
        mv.visitTypeInsn(ANEWARRAY, "java/lang/Object");
        mv.visitInsn(DUP);
        mv.visitInsn(ICONST_0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitInsn(AASTORE);
        mv.visitMethodInsn(INVOKEINTERFACE, "org/qi4j/spi/composite/CompositeInvoker", "invokeComposite",
                "(Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;");
        mv.visitInsn(POP);
        mv.visitLabel(l1);
        Label l5 = new Label();
        mv.visitJumpInsn(GOTO, l5);
        mv.visitLabel(l2);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "org/qi4j/satisfiedBy/Exception1" });
        mv.visitVarInsn(ASTORE, 2);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitInsn(ATHROW);
        mv.visitLabel(l3);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "org/qi4j/satisfiedBy/Exception2" });
        mv.visitVarInsn(ASTORE, 2);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitInsn(ATHROW);
        mv.visitLabel(l4);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/Throwable" });
        mv.visitVarInsn(ASTORE, 2);
        mv.visitTypeInsn(NEW, "java/lang/reflect/UndeclaredThrowableException");
        mv.visitInsn(DUP);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/reflect/UndeclaredThrowableException", "<init>",
                "(Ljava/lang/Throwable;)V");
        mv.visitInsn(ATHROW);
        mv.visitLabel(l5);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitInsn(RETURN);
        mv.visitMaxs(6, 3);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "unwrapResult", "()I", null, null);
        mv.visitCode();
        Label l0 = new Label();
        Label l1 = new Label();
        Label l2 = new Label();
        mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Throwable");
        mv.visitLabel(l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/qi4j/satisfiedBy/SomeMixin_Stub", "_instance",
                "Lorg/qi4j/spi/composite/CompositeInvoker;");
        mv.visitFieldInsn(GETSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m5", "Ljava/lang/reflect/Method;");
        mv.visitInsn(ACONST_NULL);
        mv.visitMethodInsn(INVOKEINTERFACE, "org/qi4j/spi/composite/CompositeInvoker", "invokeComposite",
                "(Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;");
        mv.visitTypeInsn(CHECKCAST, "java/lang/Integer");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Integer", "intValue", "()I");
        mv.visitLabel(l1);
        mv.visitInsn(IRETURN);
        mv.visitLabel(l2);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/Throwable" });
        mv.visitVarInsn(ASTORE, 1);
        mv.visitTypeInsn(NEW, "java/lang/reflect/UndeclaredThrowableException");
        mv.visitInsn(DUP);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/reflect/UndeclaredThrowableException", "<init>",
                "(Ljava/lang/Throwable;)V");
        mv.visitInsn(ATHROW);
        mv.visitMaxs(3, 2);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null);
        mv.visitCode();
        Label l0 = new Label();
        Label l1 = new Label();
        Label l2 = new Label();
        mv.visitTryCatchBlock(l0, l1, l2, "java/lang/NoSuchMethodException");
        mv.visitLabel(l0);
        mv.visitLdcInsn(Type.getType("Lorg/qi4j/satisfiedBy/Other;"));
        mv.visitLdcInsn("other");
        mv.visitInsn(ICONST_0);
        mv.visitTypeInsn(ANEWARRAY, "java/lang/Class");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getMethod",
                "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;");
        mv.visitFieldInsn(PUTSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m1", "Ljava/lang/reflect/Method;");
        mv.visitLdcInsn(Type.getType("Lorg/qi4j/satisfiedBy/Other;"));
        mv.visitLdcInsn("foo");
        mv.visitInsn(ICONST_2);
        mv.visitTypeInsn(ANEWARRAY, "java/lang/Class");
        mv.visitInsn(DUP);
        mv.visitInsn(ICONST_0);
        mv.visitLdcInsn(Type.getType("Ljava/lang/String;"));
        mv.visitInsn(AASTORE);
        mv.visitInsn(DUP);
        mv.visitInsn(ICONST_1);
        mv.visitFieldInsn(GETSTATIC, "java/lang/Integer", "TYPE", "Ljava/lang/Class;");
        mv.visitInsn(AASTORE);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getMethod",
                "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;");
        mv.visitFieldInsn(PUTSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m2", "Ljava/lang/reflect/Method;");
        mv.visitLdcInsn(Type.getType("Lorg/qi4j/satisfiedBy/Other;"));
        mv.visitLdcInsn("bar");
        mv.visitIntInsn(BIPUSH, 11);
        mv.visitTypeInsn(ANEWARRAY, "java/lang/Class");
        mv.visitInsn(DUP);
        mv.visitInsn(ICONST_0);
        mv.visitFieldInsn(GETSTATIC, "java/lang/Double", "TYPE", "Ljava/lang/Class;");
        mv.visitInsn(AASTORE);
        mv.visitInsn(DUP);
        mv.visitInsn(ICONST_1);
        mv.visitFieldInsn(GETSTATIC, "java/lang/Boolean", "TYPE", "Ljava/lang/Class;");
        mv.visitInsn(AASTORE);
        mv.visitInsn(DUP);
        mv.visitInsn(ICONST_2);
        mv.visitFieldInsn(GETSTATIC, "java/lang/Float", "TYPE", "Ljava/lang/Class;");
        mv.visitInsn(AASTORE);
        mv.visitInsn(DUP);
        mv.visitInsn(ICONST_3);
        mv.visitFieldInsn(GETSTATIC, "java/lang/Character", "TYPE", "Ljava/lang/Class;");
        mv.visitInsn(AASTORE);
        mv.visitInsn(DUP);
        mv.visitInsn(ICONST_4);
        mv.visitFieldInsn(GETSTATIC, "java/lang/Integer", "TYPE", "Ljava/lang/Class;");
        mv.visitInsn(AASTORE);
        mv.visitInsn(DUP);
        mv.visitInsn(ICONST_5);
        mv.visitFieldInsn(GETSTATIC, "java/lang/Long", "TYPE", "Ljava/lang/Class;");
        mv.visitInsn(AASTORE);
        mv.visitInsn(DUP);
        mv.visitIntInsn(BIPUSH, 6);
        mv.visitFieldInsn(GETSTATIC, "java/lang/Short", "TYPE", "Ljava/lang/Class;");
        mv.visitInsn(AASTORE);
        mv.visitInsn(DUP);
        mv.visitIntInsn(BIPUSH, 7);
        mv.visitFieldInsn(GETSTATIC, "java/lang/Byte", "TYPE", "Ljava/lang/Class;");
        mv.visitInsn(AASTORE);
        mv.visitInsn(DUP);
        mv.visitIntInsn(BIPUSH, 8);
        mv.visitLdcInsn(Type.getType("Ljava/lang/Double;"));
        mv.visitInsn(AASTORE);
        mv.visitInsn(DUP);
        mv.visitIntInsn(BIPUSH, 9);
        mv.visitLdcInsn(Type.getType("[Ljava/lang/Object;"));
        mv.visitInsn(AASTORE);
        mv.visitInsn(DUP);
        mv.visitIntInsn(BIPUSH, 10);
        mv.visitLdcInsn(Type.getType("[I"));
        mv.visitInsn(AASTORE);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getMethod",
                "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;");
        mv.visitFieldInsn(PUTSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m3", "Ljava/lang/reflect/Method;");
        mv.visitLdcInsn(Type.getType("Lorg/qi4j/satisfiedBy/Other;"));
        mv.visitLdcInsn("multiEx");
        mv.visitInsn(ICONST_1);
        mv.visitTypeInsn(ANEWARRAY, "java/lang/Class");
        mv.visitInsn(DUP);
        mv.visitInsn(ICONST_0);
        mv.visitLdcInsn(Type.getType("Ljava/lang/String;"));
        mv.visitInsn(AASTORE);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getMethod",
                "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;");
        mv.visitFieldInsn(PUTSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m4", "Ljava/lang/reflect/Method;");
        mv.visitLdcInsn(Type.getType("Lorg/qi4j/satisfiedBy/Other;"));
        mv.visitLdcInsn("unwrapResult");
        mv.visitInsn(ICONST_0);
        mv.visitTypeInsn(ANEWARRAY, "java/lang/Class");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getMethod",
                "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;");
        mv.visitFieldInsn(PUTSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m5", "Ljava/lang/reflect/Method;");
        mv.visitLabel(l1);
        Label l3 = new Label();
        mv.visitJumpInsn(GOTO, l3);
        mv.visitLabel(l2);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/NoSuchMethodException" });
        mv.visitVarInsn(ASTORE, 0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/NoSuchMethodException", "printStackTrace", "()V");
        mv.visitLabel(l3);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitInsn(RETURN);
        mv.visitMaxs(6, 1);
        mv.visitEnd();
    }
    cw.visitEnd();

    return cw.toByteArray();
}

From source file:org.simantics.databoard.binding.classfactory.AsmTypeClassFactory.java

License:Open Source License

public Class<?> createRecordClass(RecordType type) throws BindingConstructionException {
    ClassWriter cw = new ClassWriter(0);
    AnnotationVisitor av0;//  ww w  .  j a v a 2 s .  co  m

    // Create class name
    SignatureVisitor sv = new SignatureVisitor();
    type.accept(sv, null);
    String sig = sv.sb.toString() + "_" + Integer.toHexString(sv.hashcode);

    String hash = Integer.toHexString(type.hashCode());
    String className = "org.simantics.databoard.RecordType_" + sig;
    String classSig = "org/simantics/databoard/RecordType_" + sig;
    Class<?> superClass = makeBean ? Bean.class : Object.class;
    String superType = AsmBindingClassLoader.toClassCanonicalName(superClass);

    cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, classSig, null, superType, null);

    if (type.isReferable()) {
        av0 = cw.visitAnnotation(AsmBindingClassLoader.toTypeDescriptor(Referable.class), true);
        av0.visitEnd();
    }

    for (int i = 0; i < type.getComponentCount(); i++) {
        Component c = type.getComponent(i);
        Datatype fieldType = c.type;
        boolean isOptional = fieldType instanceof OptionalType;
        boolean isIdentifier = type.isIdentifier(i);
        if (isOptional) {
            fieldType = ((OptionalType) fieldType).componentType;
        }
        //         boolean isArray = fieldType instanceof ArrayType;
        //         if ( isArray ) {
        //            fieldType = ((ArrayType) fieldType).componentType;
        //         }
        String fieldName = toJavaFieldName(c.name);
        BindingRequest br = classFactory.getClass(fieldType);

        FieldVisitor fv = cw.visitField(ACC_PUBLIC, fieldName, br.signature,
                br.descriptor.equals(br.signature) ? null : br.descriptor, null);

        // Visit annotations
        if (br.annotations != null && br.annotations.length > 0) {
            for (Annotation a : br.annotations) {

                if (a instanceof Arguments) {
                    Arguments arg = (Arguments) a;
                    av0 = fv.visitAnnotation(AsmBindingClassLoader.toTypeDescriptor(Arguments.class), true);
                    AnnotationVisitor av1 = av0.visitArray("value");
                    for (Class<?> clzz : arg.value()) {
                        av1.visit(null, Type.getType(AsmBindingClassLoader.toTypeDescriptor(clzz)));
                    }
                    av1.visitEnd();
                    av0.visitEnd();
                }

                isIdentifier |= a instanceof Identifier;

                if (a instanceof Length) {
                    Length arg = (Length) a;
                    av0 = fv.visitAnnotation(AsmBindingClassLoader.toTypeDescriptor(Length.class), true);
                    AnnotationVisitor av1 = av0.visitArray("value");
                    for (String s : arg.value())
                        av1.visit(null, s);
                    av1.visitEnd();
                    av0.visitEnd();
                }

                if (a instanceof MIMEType) {
                    MIMEType arg = (MIMEType) a;
                    av0 = fv.visitAnnotation(AsmBindingClassLoader.toTypeDescriptor(MIMEType.class), true);
                    av0.visit("value", arg.value());
                    av0.visitEnd();
                }

                if (a instanceof Name) {
                    Name arg = (Name) a;
                    av0 = fv.visitAnnotation(AsmBindingClassLoader.toTypeDescriptor(Name.class), true);
                    av0.visit("value", arg.value());
                    av0.visitEnd();
                }

                isOptional |= a instanceof Optional;

                if (a instanceof org.simantics.databoard.annotations.Pattern) {
                    org.simantics.databoard.annotations.Pattern arg = (org.simantics.databoard.annotations.Pattern) a;
                    av0 = fv.visitAnnotation(AsmBindingClassLoader
                            .toTypeDescriptor(org.simantics.databoard.annotations.Pattern.class), true);
                    av0.visit("value", arg.value());
                    av0.visitEnd();
                }

                if (a instanceof Range) {
                    Range arg = (Range) a;
                    av0 = fv.visitAnnotation(AsmBindingClassLoader.toTypeDescriptor(Range.class), true);
                    av0.visit("value", arg.value());
                    av0.visitEnd();
                }

                if (a instanceof Unit) {
                    Unit arg = (Unit) a;
                    av0 = fv.visitAnnotation(AsmBindingClassLoader.toTypeDescriptor(Unit.class), true);
                    av0.visit("value", arg.value());
                    av0.visitEnd();
                }
            }
        }

        if (isIdentifier) {
            av0 = fv.visitAnnotation(AsmBindingClassLoader.toTypeDescriptor(Identifier.class), true);
            av0.visitEnd();
        }
        if (isOptional) {
            av0 = fv.visitAnnotation(AsmBindingClassLoader.toTypeDescriptor(Optional.class), true);
            av0.visitEnd();
        }

        fv.visitEnd();
    }

    // Constructor
    {
        MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
        mv.visitCode();
        Label l0 = new Label();

        // super()
        if (!makeBean) {
            mv.visitLabel(l0);
            mv.visitLineNumber(20, l0);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKESPECIAL, superType, "<init>", "()V");
        } else {
            // super( getStaticBinding() )
            mv.visitLabel(l0);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKESTATIC, classSig, "getStaticBinding",
                    "()Lorg/simantics/databoard/binding/Binding;");
            mv.visitMethodInsn(INVOKESPECIAL, "org/simantics/databoard/util/Bean", "<init>",
                    "(Lorg/simantics/databoard/binding/Binding;)V");
        }

        mv.visitInsn(RETURN);
        Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLocalVariable("this", "L" + classSig + ";", null, l0, l1, 0);
        if (!makeBean) {
            mv.visitMaxs(1, 1);
        } else {
            mv.visitMaxs(2, 1);
        }
        mv.visitEnd();
    }

    // BINDING
    {
        FieldVisitor fv = cw.visitField(ACC_STATIC, "BINDING", "Lorg/simantics/databoard/binding/Binding;",
                null, null);
        fv.visitEnd();

        MethodVisitor mv = cw.visitMethod(ACC_STATIC, "getStaticBinding",
                "()Lorg/simantics/databoard/binding/Binding;", null, null);
        mv.visitCode();
        Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitFieldInsn(GETSTATIC, classSig, "BINDING", "Lorg/simantics/databoard/binding/Binding;");
        Label l1 = new Label();
        mv.visitJumpInsn(IFNONNULL, l1);
        mv.visitLdcInsn(Type.getType("L" + classSig + ";"));
        mv.visitMethodInsn(INVOKESTATIC, "org/simantics/databoard/Bindings", "getBindingUnchecked",
                "(Ljava/lang/Class;)Lorg/simantics/databoard/binding/Binding;");
        mv.visitFieldInsn(PUTSTATIC, classSig, "BINDING", "Lorg/simantics/databoard/binding/Binding;");
        mv.visitLabel(l1);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitFieldInsn(GETSTATIC, classSig, "BINDING", "Lorg/simantics/databoard/binding/Binding;");
        mv.visitInsn(ARETURN);
        mv.visitMaxs(1, 0);
        mv.visitEnd();
    }

    cw.visitEnd();
    byte[] data = cw.toByteArray();
    Class<?> clazz = defineClass(className, data, 0, data.length);
    BindingRequest br = new BindingRequest(clazz);
    return clazz;
}

From source file:org.simantics.databoard.binding.reflection.AsmBindingClassLoader.java

License:Open Source License

public byte[] createBindingClass(ClassInfo ci, String bindingClassName) {
    //System.out.println("BindingFactory: "+bindingClassName+" (for "+ci.clazz.getClassLoader()+")");
    int count = ci.fields.length;
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
    ClassVisitor cv = cw;//new CheckClassAdapter(cw);

    FieldVisitor fv;/*from  w  w  w  .j  av a 2  s .  c om*/
    MethodVisitor mv;
    AnnotationVisitor av0;

    String className = ci.clazz.getName().replaceAll("\\.", "/");
    bindingClassName = bindingClassName.replaceAll("\\.", "/");
    Object[] classNameX = new Object[] { className };
    String signature = "L" + bindingClassName + ";";

    // Constructor
    String superClass = "org/simantics/databoard/binding/reflection/ClassBinding";
    cv.visit(V1_6, ACC_PUBLIC + ACC_SUPER, bindingClassName, null, superClass, null);

    // Constructor
    {
        mv = cv.visitMethod(ACC_PUBLIC, "<init>", "(Lorg/simantics/databoard/type/RecordType;)V", null,
                new String[] { "org/simantics/databoard/binding/error/BindingConstructionException" });

        mv.visitCode();
        Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitLdcInsn(Type.getType("L" + className + ";"));
        mv.visitMethodInsn(INVOKESPECIAL, superClass, "<init>", "(Ljava/lang/Class;)V");

        Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitFieldInsn(PUTFIELD, bindingClassName, "type", "Lorg/simantics/databoard/type/Datatype;");

        Label l2 = new Label();
        mv.visitLabel(l2);
        mv.visitInsn(RETURN);

        Label l3 = new Label();
        mv.visitLabel(l3);
        mv.visitLocalVariable("this", signature, null, l0, l3, 0);
        mv.visitLocalVariable("type", "Lorg/simantics/databoard/type/RecordType;", null, l0, l3, 1);
        mv.visitMaxs(2, 2);
        mv.visitEnd();
    }

    // getComponent
    {
        mv = cv.visitMethod(ACC_PUBLIC, "getComponent", "(Ljava/lang/Object;I)Ljava/lang/Object;", null,
                new String[] { "org/simantics/databoard/binding/error/BindingException" });
        mv.visitCode();
        Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitTypeInsn(CHECKCAST, className);
        mv.visitVarInsn(ASTORE, 3);
        Label l1 = new Label();
        mv.visitLabel(l1);

        Label caseLabels[] = createFieldLabels(ci);
        Label elseLabel = new Label();

        if (count > 0) {
            // Switch
            mv.visitVarInsn(ILOAD, 2);
            mv.visitTableSwitchInsn(0, count - 1, elseLabel, caseLabels);

            // case i: x.field = value[i]
            for (int i = 0; i < count; i++) {
                Label label = caseLabels[i];
                Field field = ci.fields[i];
                String fieldName = field.getName();
                Class<?> fieldClass = ci.fields[i].getType();
                String typeDescriptor = toTypeDescriptor(fieldClass);

                Method getter = ci.getters[i];
                boolean useGetter = ((field.getModifiers() & Modifier.PUBLIC) == 0) && getter != null;

                mv.visitLabel(label);
                if (i == 0) {
                    mv.visitFrame(Opcodes.F_APPEND, 1, classNameX, 0, null);
                } else {
                    mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
                }

                // Read instance argument
                mv.visitVarInsn(ALOAD, 3);

                if (useGetter) {
                    // call getField
                    mv.visitMethodInsn(INVOKEVIRTUAL, className, getter.getName(), "()" + typeDescriptor);
                } else {
                    // Read field
                    mv.visitFieldInsn(GETFIELD, className, fieldName, typeDescriptor);
                }

                // Box 
                box(mv, fieldClass);

                mv.visitInsn(ARETURN);
            }

        }

        mv.visitLabel(elseLabel);
        if (count > 0) {
            mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        }
        mv.visitTypeInsn(NEW, "org/simantics/databoard/binding/error/BindingException");
        mv.visitInsn(DUP);
        mv.visitLdcInsn("Illegal field index");
        mv.visitMethodInsn(INVOKESPECIAL, "org/simantics/databoard/binding/error/BindingException", "<init>",
                "(Ljava/lang/String;)V");
        mv.visitInsn(ATHROW);

        // End 
        Label l19 = new Label();
        mv.visitLabel(l19);
        mv.visitLocalVariable("this", "L" + className + ";", null, l0, l19, 0);
        mv.visitLocalVariable("obj", "Ljava/lang/Object;", null, l0, l19, 1);
        mv.visitLocalVariable("index", "I", null, l0, l19, 2);
        //mv.visitLocalVariable("x", "Lorg/simantics/databoard/binding/reflection/MyClass;", null, l1, l19, 3);
        mv.visitMaxs(3, 4);
        mv.visitEnd();
    }

    // Create
    {
        mv = cv.visitMethod(ACC_PUBLIC + ACC_VARARGS, "create", "([Ljava/lang/Object;)Ljava/lang/Object;", null,
                new String[] { "org/simantics/databoard/binding/error/BindingException" });
        if (ci.beanConstructor != null) {
            mv.visitCode();
            Label l0 = new Label();
            mv.visitLabel(l0);
            mv.visitTypeInsn(NEW, className);
            mv.visitInsn(DUP);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKESPECIAL, className, "<init>",
                    "(Lorg/simantics/databoard/binding/Binding;)V");
            mv.visitVarInsn(ASTORE, 2);
            Label l1 = new Label();
            mv.visitLabel(l1);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitVarInsn(ALOAD, 2);
            mv.visitVarInsn(ALOAD, 1);
            mv.visitMethodInsn(INVOKEVIRTUAL, bindingClassName, "setComponents",
                    "(Ljava/lang/Object;[Ljava/lang/Object;)V");
            Label l2 = new Label();
            mv.visitLabel(l2);
            mv.visitVarInsn(ALOAD, 2);
            mv.visitInsn(ARETURN);
            Label l3 = new Label();
            mv.visitLabel(l3);
            mv.visitLocalVariable("this", "L" + bindingClassName + ";", null, l0, l3, 0);
            mv.visitLocalVariable("values", "[Ljava/lang/Object;", null, l0, l3, 1);
            //mv.visitLocalVariable("x", "L"+className+";", null, l1, l3, 2);
            mv.visitMaxs(3, 3);
            mv.visitEnd();
        } else if (ci.argsConstructor != null) {
            mv.visitCode();
            Label l0 = new Label();
            mv.visitLabel(l0);
            mv.visitTypeInsn(NEW, className);
            mv.visitInsn(DUP);

            String constArgsDescriptor = "(";
            Class<?>[] args = ci.argsConstructor.getParameterTypes();
            for (int i = 0; i < count; i++) {
                Label label = new Label();
                Class<?> field = args[i];
                String fieldName = field.getName();
                Method getter = ci.getters[i];
                Class<?> fieldClass = ci.fields[i].getType();
                Class<?> boxClass = getBoxClass(fieldClass);
                String typeDescriptor = toTypeDescriptor(fieldClass);
                String boxTypeDescriptor = toTypeDescriptor(boxClass);
                constArgsDescriptor += typeDescriptor;

                mv.visitLabel(label);
                mv.visitVarInsn(ALOAD, 1);
                if (i < 6) {
                    mv.visitInsn(ICONST_0 + i);
                } else {
                    mv.visitIntInsn(BIPUSH, i);
                }

                mv.visitInsn(AALOAD);
                mv.visitTypeInsn(CHECKCAST, toClassCanonicalName(boxClass));
                unbox(mv, fieldClass);
            }

            Label l17 = new Label();
            mv.visitLabel(l17);
            constArgsDescriptor += ")V";
            mv.visitMethodInsn(INVOKESPECIAL, className, "<init>", constArgsDescriptor);
            mv.visitInsn(ARETURN);
            Label l18 = new Label();
            mv.visitLabel(l18);
            mv.visitLocalVariable("this", "L" + bindingClassName + ";", null, l0, l18, 0);
            mv.visitLocalVariable("values", "[Ljava/lang/Object;", null, l0, l18, 1);
            mv.visitMaxs(21, 2);
            mv.visitEnd();

        } else {
            mv.visitCode();
            Label l0 = new Label();
            mv.visitLabel(l0);
            mv.visitTypeInsn(NEW, className);
            mv.visitInsn(DUP);
            mv.visitMethodInsn(INVOKESPECIAL, className, "<init>", "()V");
            mv.visitVarInsn(ASTORE, 2);
            Label l1 = new Label();
            mv.visitLabel(l1);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitVarInsn(ALOAD, 2);
            mv.visitVarInsn(ALOAD, 1);
            mv.visitMethodInsn(INVOKEVIRTUAL, bindingClassName, "setComponents",
                    "(Ljava/lang/Object;[Ljava/lang/Object;)V");
            Label l2 = new Label();
            mv.visitLabel(l2);
            mv.visitVarInsn(ALOAD, 2);
            mv.visitInsn(ARETURN);
            Label l3 = new Label();
            mv.visitLabel(l3);
            mv.visitLocalVariable("this", "L" + bindingClassName + ";", null, l0, l3, 0);
            mv.visitLocalVariable("values", "[Ljava/lang/Object;", null, l0, l3, 1);
            //mv.visitLocalVariable("x", "L"+className+";", null, l1, l3, 2);
            mv.visitMaxs(3, 3);
            mv.visitEnd();
        }
    }

    // CreatePartial
    mv = cv.visitMethod(ACC_PUBLIC, "createPartial", "()Ljava/lang/Object;", null,
            new String[] { "org/simantics/databoard/binding/error/BindingException" });
    if (ci.beanConstructor != null) {
        mv.visitCode();
        Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitTypeInsn(NEW, className);
        mv.visitInsn(DUP);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, className, "<init>", "(Lorg/simantics/databoard/binding/Binding;)V");
        mv.visitInsn(ARETURN);
        Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLocalVariable("this", "L" + bindingClassName + ";", null, l0, l1, 0);
        mv.visitMaxs(3, 1);
        mv.visitEnd();
    } else if (ci.noArgsConstructor != null) {
        // return new MyClass();
        mv.visitCode();
        Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitTypeInsn(NEW, className);
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, className, "<init>", "()V");
        mv.visitInsn(ARETURN);
        Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLocalVariable("this", "L" + bindingClassName + ";", null, l0, l1, 0);
        mv.visitMaxs(2, 1);
        mv.visitEnd();
    } else {
        mv.visitCode();
        Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitIntInsn(BIPUSH, count);
        mv.visitTypeInsn(ANEWARRAY, "java/lang/Object");
        mv.visitVarInsn(ASTORE, 1);
        Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitInsn(ICONST_0);
        mv.visitVarInsn(ISTORE, 2);
        Label l2 = new Label();
        mv.visitLabel(l2);
        Label l3 = new Label();
        mv.visitJumpInsn(GOTO, l3);
        Label l4 = new Label();
        mv.visitLabel(l4);
        mv.visitFrame(Opcodes.F_APPEND, 2, new Object[] { "[Ljava/lang/Object;", Opcodes.INTEGER }, 0, null);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, bindingClassName, "componentBindings",
                "[Lorg/simantics/databoard/binding/Binding;");
        mv.visitVarInsn(ILOAD, 2);
        mv.visitInsn(AALOAD);
        mv.visitVarInsn(ASTORE, 3);
        Label l5 = new Label();
        mv.visitLabel(l5);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ILOAD, 2);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/simantics/databoard/binding/Binding", "createDefault",
                "()Ljava/lang/Object;");
        mv.visitInsn(AASTORE);
        Label l6 = new Label();
        mv.visitLabel(l6);
        mv.visitIincInsn(2, 1);
        mv.visitLabel(l3);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitVarInsn(ILOAD, 2);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitInsn(ARRAYLENGTH);
        mv.visitJumpInsn(IF_ICMPLT, l4);
        Label l7 = new Label();
        mv.visitLabel(l7);
        mv.visitLineNumber(109, l7);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, bindingClassName, "create",
                "([Ljava/lang/Object;)Ljava/lang/Object;");
        mv.visitInsn(ARETURN);
        Label l8 = new Label();
        mv.visitLabel(l8);
        mv.visitLocalVariable("this", "L" + bindingClassName + ";", null, l0, l8, 0);
        mv.visitLocalVariable("values", "[Ljava/lang/Object;", null, l1, l8, 1);
        mv.visitLocalVariable("i", "I", null, l2, l7, 2);
        mv.visitLocalVariable("fb", "Lorg/simantics/databoard/binding/Binding;", null, l5, l6, 3);
        mv.visitMaxs(3, 4);
        mv.visitEnd();
    }

    // setComponent
    {
        mv = cv.visitMethod(ACC_PUBLIC, "setComponent", "(Ljava/lang/Object;ILjava/lang/Object;)V", null,
                new String[] { "org/simantics/databoard/binding/error/BindingException" });
        mv.visitCode();
        Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitTypeInsn(CHECKCAST, className);
        mv.visitVarInsn(ASTORE, 4);
        Label endLabel = new Label();
        Label l1 = new Label();
        mv.visitLabel(l1);

        Label elseLabel = new Label();
        Label labels[] = new Label[count];
        for (int i = 0; i < count; i++)
            labels[i] = new Label();

        if (count > 0) {
            mv.visitVarInsn(ILOAD, 2);
            mv.visitTableSwitchInsn(0, count - 1, elseLabel, labels);

            for (int i = 0; i < count; i++) {
                Label label = labels[i];
                mv.visitLabel(label);
                Field field = ci.fields[i];
                String fieldName = field.getName();
                Class<?> fieldClass = ci.fields[i].getType();
                Class<?> boxClass = getBoxClass(fieldClass);
                String typeDescriptor = toTypeDescriptor(fieldClass);
                String boxTypeDescriptor = toTypeDescriptor(boxClass);

                Method setter = ci.setters[i];
                Class<?> setterClass = setter != null ? setter.getParameterTypes()[0] : null;
                boolean useSetter = ((field.getModifiers() & Modifier.PUBLIC) == 0) && setter != null;

                if (i == 0) {
                    mv.visitFrame(Opcodes.F_APPEND, 1, classNameX, 0, null);
                } else {
                    mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
                }
                mv.visitVarInsn(ALOAD, 4);
                mv.visitVarInsn(ALOAD, 3);
                mv.visitTypeInsn(CHECKCAST, toClassCanonicalName(boxClass));

                if (useSetter) {
                    unbox(mv, setterClass);
                    mv.visitMethodInsn(INVOKEVIRTUAL, className, setter.getName(), "(" + typeDescriptor + ")V");
                } else {
                    unbox(mv, fieldClass);
                    mv.visitFieldInsn(PUTFIELD, className, field.getName(), typeDescriptor);
                }
                mv.visitInsn(RETURN);
            }
        }

        mv.visitLabel(elseLabel);
        mv.visitLineNumber(178, elseLabel);
        if (count > 0) {
            mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        }
        mv.visitTypeInsn(NEW, "org/simantics/databoard/binding/error/BindingException");
        mv.visitInsn(DUP);
        mv.visitLdcInsn("Illegal field index");
        mv.visitMethodInsn(INVOKESPECIAL, "org/simantics/databoard/binding/error/BindingException", "<init>",
                "(Ljava/lang/String;)V");
        mv.visitInsn(ATHROW);

        mv.visitLabel(endLabel);
        mv.visitLocalVariable("this", "L" + bindingClassName + ";", null, l0, endLabel, 0);
        mv.visitLocalVariable("obj", "Ljava/lang/Object;", null, l0, endLabel, 1);
        mv.visitLocalVariable("index", "I", null, l0, endLabel, 2);
        mv.visitLocalVariable("value", "Ljava/lang/Object;", null, l0, endLabel, 3);
        //mv.visitLocalVariable("x", "L"+className+";", null, l1, endLabel, 4);
        mv.visitMaxs(3, 5);
        mv.visitEnd();
    }

    // IsImmutable
    {
        mv = cv.visitMethod(ACC_PUBLIC, "isImmutable", "()Z", null, null);
        mv.visitCode();
        Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitInsn(ICONST_0);
        mv.visitInsn(IRETURN);
        Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLocalVariable("this", "L" + className + ";", null, l0, l1, 0);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }

    // IsInstance
    {
        mv = cv.visitMethod(ACC_PUBLIC, "isInstance", "(Ljava/lang/Object;)Z", null, null);
        mv.visitCode();
        Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitTypeInsn(INSTANCEOF, className);
        mv.visitInsn(IRETURN);
        Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLocalVariable("this", "L" + className + ";", null, l0, l1, 0);
        mv.visitLocalVariable("obj", "Ljava/lang/Object;", null, l0, l1, 1);
        mv.visitMaxs(1, 2);
        mv.visitEnd();
    }

    // SetComponents
    {
        mv = cv.visitMethod(ACC_PUBLIC + ACC_VARARGS, "setComponents",
                "(Ljava/lang/Object;[Ljava/lang/Object;)V", null,
                new String[] { "org/simantics/databoard/binding/error/BindingException" });
        mv.visitCode();
        Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitTypeInsn(CHECKCAST, className);
        mv.visitVarInsn(ASTORE, 3);
        Label firstLabel = l0;

        for (int i = 0; i < count; i++) {
            Label label = new Label();
            if (firstLabel == l0)
                firstLabel = label;
            Field field = ci.fields[i];
            String fieldName = field.getName();
            Class<?> fieldClass = ci.fields[i].getType();
            Class<?> boxClass = getBoxClass(fieldClass);
            String typeDescriptor = toTypeDescriptor(fieldClass);
            String boxTypeDescriptor = toTypeDescriptor(boxClass);

            Method setter = ci.setters[i];
            Class<?> setterClass = setter != null ? setter.getParameterTypes()[0] : null;
            boolean useSetter = ((field.getModifiers() & Modifier.PUBLIC) == 0) && setter != null;

            mv.visitLabel(label);
            mv.visitVarInsn(ALOAD, 3);
            mv.visitVarInsn(ALOAD, 2);
            if (i < 6) {
                mv.visitInsn(ICONST_0 + i);
            } else {
                mv.visitIntInsn(BIPUSH, i);
            }
            mv.visitInsn(AALOAD);
            mv.visitTypeInsn(CHECKCAST, toClassCanonicalName(boxClass));

            if (useSetter) {
                unbox(mv, setterClass);
                mv.visitMethodInsn(INVOKEVIRTUAL, className, setter.getName(), "(" + typeDescriptor + ")V");
            } else {
                unbox(mv, fieldClass);
                mv.visitFieldInsn(PUTFIELD, className, field.getName(), typeDescriptor);
            }

        }
        Label l17 = new Label();
        mv.visitLabel(l17);
        mv.visitInsn(RETURN);
        Label endLabel = new Label();
        mv.visitLabel(endLabel);
        mv.visitLocalVariable("this", "L" + className + ";", null, l0, endLabel, 0);
        mv.visitLocalVariable("obj", "Ljava/lang/Object;", null, l0, endLabel, 1);
        mv.visitLocalVariable("value", "[Ljava/lang/Object;", null, l0, endLabel, 2);
        //mv.visitLocalVariable("x", "Lorg/simantics/databoard/binding/reflection/MyClass;", null, firstLabel, endLabel, 3);
        mv.visitMaxs(3, 4);
        mv.visitEnd();
    }

    // Add primitive setters
    {
        addGetSetPrimitive(ci, cv, "Boolean", "Z", bindingClassName);
        addGetSetPrimitive(ci, cv, "Byte", "B", bindingClassName);
        addGetSetPrimitive(ci, cv, "Int", "I", bindingClassName);
        addGetSetPrimitive(ci, cv, "Long", "J", bindingClassName);
        addGetSetPrimitive(ci, cv, "Float", "F", bindingClassName);
        addGetSetPrimitive(ci, cv, "Double", "D", bindingClassName);
    }

    cv.visitEnd();
    return cw.toByteArray();
}

From source file:org.simantics.databoard.binding.reflection.AsmBindingClassLoader.java

License:Open Source License

private void addGetSetPrimitive(ClassInfo ci, ClassVisitor cv, String setterName, String signature,
        String bindingClassName) {
    String className = ci.clazz.getName().replaceAll("\\.", "/");

    Label firstLabel = new Label();
    Label secondLabel = new Label();
    Label errorLabel = new Label();
    Label exitLabel = new Label();
    Label lastLabel = new Label();

    boolean oneByte = !signature.equals("J") && !signature.equals("D");

    int c = 0;//from   ww w .j  a va  2 s.c  o m
    for (Field f : ci.fields) {
        if (toTypeDescriptor(getPrimitiveClass(f.getType())).equals(signature))
            c++;
    }

    int[] indices = new int[c];
    Label[] caseLabel = new Label[c];

    c = 0;
    for (int i = 0; i < ci.fields.length; i++) {
        Class<?> fieldClass = ci.fields[i].getType();
        fieldClass = getPrimitiveClass(fieldClass);
        String s = toTypeDescriptor(fieldClass);
        if (!s.equals(signature))
            continue;

        indices[c] = i;
        caseLabel[c] = new Label();
        c++;
    }

    //////////////////
    /// Setter
    ///
    MethodVisitor mv = cv.visitMethod(ACC_PUBLIC, "set" + setterName, "(Ljava/lang/Object;I" + signature + ")V",
            null, new String[] { "org/simantics/databoard/binding/error/BindingException" });
    mv.visitCode();
    mv.visitLabel(firstLabel);
    mv.visitVarInsn(ALOAD, 1);
    mv.visitTypeInsn(CHECKCAST, className);
    mv.visitVarInsn(ASTORE, oneByte ? 4 : 5);

    mv.visitLabel(secondLabel);
    mv.visitVarInsn(ILOAD, 2);

    // switch
    mv.visitLookupSwitchInsn(errorLabel, indices, caseLabel);

    // case 1:
    if (c > 0) {
        for (int i = 0; i < c; i++) {
            int index = indices[i];
            Method setter = ci.setters[index];
            Field field = ci.fields[index];
            Class<?> fieldClass = field.getType();
            Class<?> setterClass = setter != null ? setter.getParameterTypes()[0] : null;
            boolean useSetter = ((field.getModifiers() & Modifier.PUBLIC) == 0) && setter != null;
            String typeDescriptor = toTypeDescriptor(useSetter ? setterClass : fieldClass);

            mv.visitLabel(caseLabel[i]);
            if (i == 0) {
                mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] { className }, 0, null);
            } else {
                mv.visitFrame(Opcodes.F_SAME, 0, new Object[] { className }, 0, null);
            }
            if (signature.equals("F")) {
                mv.visitVarInsn(ALOAD, 4);
                mv.visitVarInsn(FLOAD, 3);
            } else if (signature.equals("D")) {
                mv.visitVarInsn(ALOAD, 5);
                mv.visitVarInsn(DLOAD, 3);
            } else if (signature.equals("J")) {
                mv.visitVarInsn(ALOAD, 5);
                mv.visitVarInsn(LLOAD, 3);
            } else {
                mv.visitVarInsn(ALOAD, 4);
                mv.visitVarInsn(ILOAD, 3);
            }

            if (useSetter) {
                boxTo(mv, setterClass);
                mv.visitMethodInsn(INVOKEVIRTUAL, className, setter.getName(), "(" + typeDescriptor + ")V");
            } else {
                boxTo(mv, fieldClass);
                mv.visitFieldInsn(PUTFIELD, className, field.getName(), typeDescriptor);
            }
            mv.visitJumpInsn(GOTO, exitLabel);
        }
    } else {
        mv.visitInsn(POP);
    }

    // default: (error)
    /*
    mv.visitLabel(errorLabel);
    mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
    mv.visitTypeInsn(NEW, "org/simantics/databoard/binding/error/BindingException");
    mv.visitInsn(DUP);
    mv.visitLdcInsn("Field is not "+setterName);
    mv.visitMethodInsn(INVOKESPECIAL, "org/simantics/databoard/binding/error/BindingException", "<init>", "(Ljava/lang/String;)V");
    mv.visitInsn(ATHROW);
    */

    // default: setComponent
    mv.visitLabel(errorLabel);
    mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitVarInsn(ALOAD, 1);
    mv.visitVarInsn(ILOAD, 2);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, bindingClassName, "componentBindings",
            "[Lorg/simantics/databoard/binding/Binding;");
    mv.visitVarInsn(ILOAD, 2);
    mv.visitInsn(AALOAD);
    if (signature.equals("F")) {
        mv.visitTypeInsn(CHECKCAST, "org/simantics/databoard/binding/FloatBinding");
        mv.visitVarInsn(FLOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/simantics/databoard/binding/FloatBinding", "create",
                "(F)Ljava/lang/Object;");
    } else if (signature.equals("D")) {
        mv.visitTypeInsn(CHECKCAST, "org/simantics/databoard/binding/DoubleBinding");
        mv.visitVarInsn(DLOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/simantics/databoard/binding/DoubleBinding", "create",
                "(D)Ljava/lang/Object;");
    } else if (signature.equals("J")) {
        mv.visitTypeInsn(CHECKCAST, "org/simantics/databoard/binding/LongBinding");
        mv.visitVarInsn(LLOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/simantics/databoard/binding/LongBinding", "create",
                "(J)Ljava/lang/Object;");
    } else if (signature.equals("Z")) {
        mv.visitTypeInsn(CHECKCAST, "org/simantics/databoard/binding/BooleanBinding");
        mv.visitVarInsn(ILOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/simantics/databoard/binding/BooleanBinding", "create",
                "(Z)Ljava/lang/Object;");
    } else if (signature.equals("I")) {
        mv.visitTypeInsn(CHECKCAST, "org/simantics/databoard/binding/IntBinding");
        mv.visitVarInsn(ILOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/simantics/databoard/binding/IntBinding", "create",
                "(I)Ljava/lang/Object;");
    } else if (signature.equals("B")) {
        mv.visitTypeInsn(CHECKCAST, "org/simantics/databoard/binding/ByteBinding");
        mv.visitVarInsn(ILOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/simantics/databoard/binding/ByteBinding", "create",
                "(B)Ljava/lang/Object;");
    }
    mv.visitMethodInsn(INVOKEVIRTUAL, bindingClassName, "setComponent",
            "(Ljava/lang/Object;ILjava/lang/Object;)V");

    // return
    mv.visitLabel(exitLabel);
    mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
    mv.visitInsn(RETURN);

    // Something at the end
    mv.visitLabel(lastLabel);
    //       mv.visitLocalVariable("this", "L"+bindingClassName+";", null, firstLabel, lastLabel, 0);
    //       mv.visitLocalVariable("r", "Ljava/lang/Object;", null, firstLabel, lastLabel, 1);
    //       mv.visitLocalVariable("index", "I", null, firstLabel, lastLabel, 2);
    //       mv.visitLocalVariable("z", signature, null, firstLabel, lastLabel, 3);
    //       mv.visitLocalVariable("x", "L"+className+";", null, secondLabel, lastLabel, 4);
    mv.visitMaxs(oneByte ? 5 : 6, oneByte ? 5 : 6);
    mv.visitEnd();

    //////////////////
    /// Getter
    ///
    firstLabel = new Label();
    secondLabel = new Label();
    errorLabel = new Label();
    exitLabel = new Label();
    lastLabel = new Label();
    for (int i = 0; i < c; i++)
        caseLabel[i] = new Label();
    mv = cv.visitMethod(ACC_PUBLIC, "get" + setterName, "(Ljava/lang/Object;I)" + signature, null,
            new String[] { "org/simantics/databoard/binding/error/BindingException" });
    mv.visitCode();
    mv.visitLabel(firstLabel);
    mv.visitVarInsn(ALOAD, 1);
    mv.visitTypeInsn(CHECKCAST, className);
    mv.visitVarInsn(ASTORE, 3);

    mv.visitLabel(secondLabel);
    mv.visitVarInsn(ILOAD, 2);

    // switch
    if (c > 0) {
        mv.visitLookupSwitchInsn(errorLabel, indices, caseLabel);

        // case i:
        for (int i = 0; i < c; i++) {
            int index = indices[i];
            Method getter = ci.getters[index];
            Field field = ci.fields[index];
            Class<?> fieldClass = field.getType();
            Class<?> getterClass = getter != null ? getter.getReturnType() : null;
            boolean useGetter = ((field.getModifiers() & Modifier.PUBLIC) == 0) && getter != null;
            String typeDescriptor = toTypeDescriptor(useGetter ? getterClass : fieldClass);

            mv.visitLabel(caseLabel[i]);
            if (i == 0) {
                mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] { className }, 0, null);
            } else {
                mv.visitFrame(Opcodes.F_SAME, 0, new Object[] { className }, 0, null);
            }

            mv.visitVarInsn(ALOAD, 3);

            if (useGetter) {
                mv.visitMethodInsn(INVOKEVIRTUAL, className, getter.getName(), "()" + typeDescriptor);
                unboxFrom(mv, getterClass);
            } else {
                mv.visitFieldInsn(GETFIELD, className, field.getName(), typeDescriptor);
                unboxFrom(mv, fieldClass);
            }

            if (signature.equals("F")) {
                mv.visitInsn(FRETURN);
            } else if (signature.equals("D")) {
                mv.visitInsn(DRETURN);
            } else if (signature.equals("J")) {
                mv.visitInsn(LRETURN);
            } else {
                mv.visitInsn(IRETURN);
            }
        }
    } else {
        mv.visitInsn(POP);
    }

    // default: (error)
    /*
    mv.visitLabel(errorLabel);
    mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
    mv.visitTypeInsn(NEW, "org/simantics/databoard/binding/error/BindingException");
    mv.visitInsn(DUP);
    mv.visitLdcInsn("Field is not "+setterName);
    mv.visitMethodInsn(INVOKESPECIAL, "org/simantics/databoard/binding/error/BindingException", "<init>", "(Ljava/lang/String;)V");
    mv.visitInsn(ATHROW);
    */

    // default:
    mv.visitLabel(errorLabel);
    mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, bindingClassName, "componentBindings",
            "[Lorg/simantics/databoard/binding/Binding;");
    mv.visitVarInsn(ILOAD, 2);
    mv.visitInsn(AALOAD);
    if (signature.equals("Z")) {
        mv.visitTypeInsn(CHECKCAST, "org/simantics/databoard/binding/BooleanBinding");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ILOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, bindingClassName, "getComponent",
                "(Ljava/lang/Object;I)Ljava/lang/Object;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/simantics/databoard/binding/BooleanBinding", "getValue_",
                "(Ljava/lang/Object;)Z");
        mv.visitInsn(IRETURN);
    } else if (signature.equals("B")) {
        mv.visitTypeInsn(CHECKCAST, "org/simantics/databoard/binding/ByteBinding");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ILOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, bindingClassName, "getComponent",
                "(Ljava/lang/Object;I)Ljava/lang/Object;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/simantics/databoard/binding/ByteBinding", "getValue_",
                "(Ljava/lang/Object;)B");
        mv.visitInsn(IRETURN);
    } else if (signature.equals("I")) {
        mv.visitTypeInsn(CHECKCAST, "org/simantics/databoard/binding/IntBinding");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ILOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, bindingClassName, "getComponent",
                "(Ljava/lang/Object;I)Ljava/lang/Object;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/simantics/databoard/binding/IntBinding", "getValue_",
                "(Ljava/lang/Object;)I");
        mv.visitInsn(IRETURN);
    } else if (signature.equals("J")) {
        mv.visitTypeInsn(CHECKCAST, "org/simantics/databoard/binding/LongBinding");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ILOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, bindingClassName, "getComponent",
                "(Ljava/lang/Object;I)Ljava/lang/Object;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/simantics/databoard/binding/LongBinding", "getValue_",
                "(Ljava/lang/Object;)J");
        mv.visitInsn(LRETURN);
    } else if (signature.equals("F")) {
        mv.visitTypeInsn(CHECKCAST, "org/simantics/databoard/binding/FloatBinding");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ILOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, bindingClassName, "getComponent",
                "(Ljava/lang/Object;I)Ljava/lang/Object;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/simantics/databoard/binding/FloatBinding", "getValue_",
                "(Ljava/lang/Object;)F");
        mv.visitInsn(FRETURN);
    } else if (signature.equals("D")) {
        mv.visitTypeInsn(CHECKCAST, "org/simantics/databoard/binding/DoubleBinding");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ILOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, bindingClassName, "getComponent",
                "(Ljava/lang/Object;I)Ljava/lang/Object;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/simantics/databoard/binding/DoubleBinding", "getValue_",
                "(Ljava/lang/Object;)D");
        mv.visitInsn(DRETURN);
    }

    // Something at the end
    mv.visitLabel(lastLabel);
    //       mv.visitLocalVariable("this", "Lorg/simantics/databoard/binding/reflection/MyBinding;", null, firstLabel, lastLabel, 0);
    //       mv.visitLocalVariable("r", "Ljava/lang/Object;", null, firstLabel, lastLabel, 1);
    //       mv.visitLocalVariable("index", "I", null, firstLabel, lastLabel, 2);
    //       mv.visitLocalVariable("x", "Lorg/simantics/databoard/binding/reflection/MyClass;", null, secondLabel, lastLabel, 3);
    mv.visitMaxs(4, 4);
    mv.visitEnd();

}

From source file:org.simantics.databoard.tests.testASM.java

License:Open Source License

void createImpl(String className, Class<?> interfaze, ClassWriter cw) {
    FieldVisitor fv;//from w  ww. j ava  2  s  .c  om
    MethodVisitor mv;
    AnnotationVisitor av0;

    java.lang.reflect.Method[] methods = interfaze.getMethods();
    Arrays.sort(methods, MethodInterfaceUtil.methodComparator);

    String classResourceName = className.replaceAll("\\.", "/");
    String classTypeDescriptor = "L" + classResourceName + ";";
    String interfaceResourceName = classResourceName.substring(0, classResourceName.length() - 5);
    String interfaceTypeDescriptor = "L" + interfaceResourceName + ";";

    cw.visit(V1_6, ACC_SUPER | ACC_PUBLIC, classResourceName, null, "java/lang/Object",
            new String[] { interfaceResourceName });

    // Imports
    Set<Class<?>> imports = new HashSet<Class<?>>();
    imports.add(AsyncResult.class);
    imports.add(ExecutionError.class);
    imports.add(Method.class);
    imports.add(interfaze);

    for (java.lang.reflect.Method m : methods) {
        for (Class<?> clazz : m.getExceptionTypes()) {
            imports.add(clazz);
        }
        for (Class<?> clazz : m.getParameterTypes()) {
            imports.add(clazz);
        }
        imports.add(m.getReturnType());
    }

    for (Class<?> clazz : imports) {
        if (clazz.isPrimitive())
            continue;
        String name = clazz.getName();
        if (name.startsWith("java.lang"))
            continue;
        String resourceName = name.replaceAll("\\.", "/");
        String outerName = resourceName.contains("$") ? resourceName.substring(0, resourceName.indexOf('$'))
                : null;
        String className_ = clazz.isArray()
                ? clazz.getSimpleName().substring(0, clazz.getSimpleName().length() - 2)
                : clazz.getSimpleName();
        int access = ACC_PUBLIC + ACC_STATIC + (clazz.isInterface() ? ACC_INTERFACE + ACC_ABSTRACT : 0);
        //         System.out.printf("name=%s, outerName=%s, innerName=%s\n", resourceName, outerName, className_);
        cw.visitInnerClass(resourceName, outerName, className_, access);
    }

    // Fields
    {
        fv = cw.visitField(ACC_FINAL + ACC_STATIC, "interfaze", "Ljava/lang/Class;", "Ljava/lang/Class<*>;",
                null);
        fv.visitEnd();
    }
    {
        fv = cw.visitField(ACC_FINAL + ACC_STATIC, "bindings",
                "[Lorg/simantics/databoard/method/MethodBinding;", null, null);
        fv.visitEnd();
    }
    {
        fv = cw.visitField(0, "mi", "Lorg/simantics/data/session/MethodInterface;", null, null);
        fv.visitEnd();
    }
    {
        fv = cw.visitField(0, "methods", "[Lorg/simantics/data/session/MethodInterface$Method;", null, null);
        fv.visitEnd();
    }

    // Init class - static {}
    {
        mv = cw.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null);
        mv.visitCode();
        Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLdcInsn(Type.getType(interfaceTypeDescriptor));
        mv.visitFieldInsn(PUTSTATIC, classResourceName, "interfaze", "Ljava/lang/Class;");
        Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitFieldInsn(GETSTATIC, classResourceName, "interfaze", "Ljava/lang/Class;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getMethods", "()[Ljava/lang/reflect/Method;");
        mv.visitVarInsn(ASTORE, 0);
        Label l2 = new Label();
        mv.visitLabel(l2);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETSTATIC, "org/simantics/data/network/MethodInterfaceUtil", "methodComparator",
                "Ljava/util/Comparator;");
        mv.visitMethodInsn(INVOKESTATIC, "java/util/Arrays", "sort",
                "([Ljava/lang/Object;Ljava/util/Comparator;)V");
        Label l3 = new Label();
        mv.visitLabel(l3);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitInsn(ARRAYLENGTH);
        mv.visitTypeInsn(ANEWARRAY, "org/simantics/databoard/method/MethodBinding");
        mv.visitFieldInsn(PUTSTATIC, classResourceName, "bindings",
                "[Lorg/simantics/databoard/method/MethodBinding;");
        Label l4 = new Label();
        mv.visitLabel(l4);
        mv.visitInsn(ICONST_0);
        mv.visitVarInsn(ISTORE, 1);
        Label l5 = new Label();
        mv.visitLabel(l5);
        Label l6 = new Label();
        mv.visitJumpInsn(GOTO, l6);
        Label l7 = new Label();
        mv.visitLabel(l7);
        mv.visitFrame(Opcodes.F_APPEND, 2, new Object[] { "[Ljava/lang/reflect/Method;", Opcodes.INTEGER }, 0,
                null);
        mv.visitFieldInsn(GETSTATIC, classResourceName, "bindings",
                "[Lorg/simantics/databoard/method/MethodBinding;");
        mv.visitVarInsn(ILOAD, 1);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ILOAD, 1);
        mv.visitInsn(AALOAD);
        mv.visitMethodInsn(INVOKESTATIC, "org/simantics/databoard/DataTypes", "getMethodBinding",
                "(Ljava/lang/reflect/Method;)Lorg/simantics/databoard/method/MethodBinding;");
        mv.visitInsn(AASTORE);
        Label l8 = new Label();
        mv.visitLabel(l8);
        mv.visitIincInsn(1, 1);
        mv.visitLabel(l6);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitVarInsn(ILOAD, 1);
        mv.visitFieldInsn(GETSTATIC, classResourceName, "bindings",
                "[Lorg/simantics/databoard/method/MethodBinding;");
        mv.visitInsn(ARRAYLENGTH);
        mv.visitJumpInsn(IF_ICMPLT, l7);
        Label l9 = new Label();
        mv.visitLabel(l9);
        mv.visitInsn(RETURN);
        Label l10 = new Label();
        mv.visitLabel(l10);
        mv.visitLocalVariable("methods", "[Ljava/lang/reflect/Method;", null, l2, l10, 0);
        mv.visitLocalVariable("i", "I", null, l5, l9, 1);
        mv.visitMaxs(4, 2);
        mv.visitEnd();
    }

    // Constructor
    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(Lorg/simantics/data/session/MethodInterface;)V", null,
                new String[] { "org/simantics/data/error/MethodNotSupportedException" });
        mv.visitCode();
        Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
        Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitFieldInsn(PUTFIELD, classResourceName, "mi", "Lorg/simantics/data/session/MethodInterface;");
        Label l2 = new Label();
        mv.visitLabel(l2);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETSTATIC, classResourceName, "bindings",
                "[Lorg/simantics/databoard/method/MethodBinding;");
        mv.visitInsn(ARRAYLENGTH);
        mv.visitTypeInsn(ANEWARRAY, "org/simantics/data/session/MethodInterface$Method");
        mv.visitFieldInsn(PUTFIELD, classResourceName, "methods",
                "[Lorg/simantics/data/session/MethodInterface$Method;");
        Label l3 = new Label();
        mv.visitLabel(l3);
        mv.visitInsn(ICONST_0);
        mv.visitVarInsn(ISTORE, 2);
        Label l4 = new Label();
        mv.visitLabel(l4);
        Label l5 = new Label();
        mv.visitJumpInsn(GOTO, l5);
        Label l6 = new Label();
        mv.visitLabel(l6);
        mv.visitFrame(Opcodes.F_FULL, 3, new Object[] { classResourceName,
                "org/simantics/data/session/MethodInterface", Opcodes.INTEGER }, 0, new Object[] {});
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, classResourceName, "methods",
                "[Lorg/simantics/data/session/MethodInterface$Method;");
        mv.visitVarInsn(ILOAD, 2);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitFieldInsn(GETSTATIC, classResourceName, "bindings",
                "[Lorg/simantics/databoard/method/MethodBinding;");
        mv.visitVarInsn(ILOAD, 2);
        mv.visitInsn(AALOAD);
        mv.visitMethodInsn(INVOKEINTERFACE, "org/simantics/data/session/MethodInterface", "getMethod",
                "(Lorg/simantics/databoard/method/MethodBinding;)Lorg/simantics/data/session/MethodInterface$Method;");
        mv.visitInsn(AASTORE);
        Label l7 = new Label();
        mv.visitLabel(l7);
        mv.visitIincInsn(2, 1);
        mv.visitLabel(l5);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitVarInsn(ILOAD, 2);
        mv.visitFieldInsn(GETSTATIC, classResourceName, "bindings",
                "[Lorg/simantics/databoard/method/MethodBinding;");
        mv.visitInsn(ARRAYLENGTH);
        mv.visitJumpInsn(IF_ICMPLT, l6);
        Label l8 = new Label();
        mv.visitLabel(l8);
        mv.visitInsn(RETURN);
        Label l9 = new Label();
        mv.visitLabel(l9);
        mv.visitLocalVariable("this", classTypeDescriptor, null, l0, l9, 0);
        mv.visitLocalVariable("mi", "Lorg/simantics/data/session/MethodInterface;", null, l0, l9, 1);
        mv.visitLocalVariable("i", "I", null, l4, l8, 2);
        mv.visitMaxs(5, 3);
        mv.visitEnd();
    }

    // Method
    int methodNumber = 0;
    for (java.lang.reflect.Method m : methods) {
        String typeDescription = "";
        Class<?>[] params = m.getParameterTypes();
        for (int i = 0; i < params.length; i++) {
            if (i > 0)
                typeDescription += ";";
            typeDescription += classToTypeDescriptor(params[i]);
        }
        typeDescription = "(" + typeDescription + ")" + classToTypeDescriptor(m.getReturnType());
        System.out.println(typeDescription + " " + m.getName());

        Class<?>[] exceptions = m.getExceptionTypes();
        String[] exceptionResourceNames = new String[exceptions.length];
        for (int i = 0; i < exceptionResourceNames.length; i++) {
            exceptionResourceNames[i] = exceptions[i].getName().replaceAll("\\.", "/");
        }

        // Registers
        // 0 - this
        // 1..argRegs args
        // argRegs+1 - method
        // argRegs+2 - args (the array)
        // argRegs+3 - AsyncResult
        // argRegs+4 - e
        // argRegs+5 - ExecutionError.cause
        // argRegs+6 - e

        int argRegs = 0;
        for (int i = 0; i < params.length; i++) {
            Class<?> clazz = params[i];
            argRegs++;
            if (clazz == long.class || clazz == float.class || clazz == Double.class)
                argRegs++;
        }

        mv = cw.visitMethod(ACC_PUBLIC, m.getName(), typeDescription, null, exceptionResourceNames);
        mv.visitCode();
        Label l0 = new Label();
        Label l1 = new Label();
        Label l2 = new Label();
        mv.visitTryCatchBlock(l0, l1, l2, "org/simantics/data/session/MethodInterface$ExecutionError");
        Label l3 = new Label();
        mv.visitTryCatchBlock(l0, l1, l3, "java/lang/InterruptedException");
        Label l4 = new Label();
        mv.visitLabel(l4);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, classResourceName, "methods",
                "[Lorg/simantics/data/session/MethodInterface$Method;");
        // Method m and puts into register 
        mv.visitLdcInsn(Integer.valueOf(methodNumber));
        mv.visitInsn(AALOAD);
        mv.visitVarInsn(ASTORE, argRegs + 1);
        Label l5 = new Label();
        mv.visitLabel(l5);
        mv.visitLdcInsn(Integer.valueOf(params.length));
        mv.visitTypeInsn(ANEWARRAY, "java/lang/Object");

        int register = 1; // argument register   
        for (int i = 0; i < params.length; i++) {
            Class<?> clazz = params[i];
            mv.visitInsn(DUP);
            mv.visitLdcInsn(Integer.valueOf(i));

            if (clazz == byte.class) {
                mv.visitVarInsn(ILOAD, register++);
                mv.visitMethodInsn(INVOKESTATIC, "java/lang/Byte", "valueOf", "(B)Ljava/lang/Byte;");
            } else if (clazz == char.class) {
                mv.visitVarInsn(ILOAD, register++);
                mv.visitMethodInsn(INVOKESTATIC, "java/lang/Character", "valueOf", "(C)Ljava/lang/Character;");
            } else if (clazz == boolean.class) {
                mv.visitVarInsn(ILOAD, register++);
                mv.visitMethodInsn(INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;");
            } else if (clazz == byte.class) {
                mv.visitVarInsn(ILOAD, register++);
                mv.visitMethodInsn(INVOKESTATIC, "java/lang/Short", "valueOf", "(S)Ljava/lang/Short;");
            } else if (clazz == int.class) {
                mv.visitVarInsn(ILOAD, register++);
                mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;");
            } else if (clazz == long.class) {
                mv.visitVarInsn(LLOAD, register);
                register += 2;
                mv.visitMethodInsn(INVOKESTATIC, "java/lang/Long", "valueOf", "(F)Ljava/lang/Long;");
            } else if (clazz == float.class) {
                mv.visitVarInsn(FLOAD, register);
                register += 2;
                mv.visitMethodInsn(INVOKESTATIC, "java/lang/Float", "valueOf", "(F)Ljava/lang/Float;");
            } else if (clazz == Double.class) {
                mv.visitVarInsn(DLOAD, register);
                register += 2;
                mv.visitMethodInsn(INVOKESTATIC, "java/lang/Double", "valueOf", "(D)Ljava/lang/Double;");
            } else {
                // Push argument to stack 
                mv.visitVarInsn(ALOAD, register++);
            }
            mv.visitInsn(AASTORE);
        }

        // Store args to argRegs+2
        mv.visitVarInsn(ASTORE, argRegs + 2);
        Label l6 = new Label();
        mv.visitLabel(l6);
        mv.visitVarInsn(ALOAD, argRegs + 1 /* m */);
        mv.visitVarInsn(ALOAD, argRegs + 2 /*args*/);
        mv.visitMethodInsn(INVOKEINTERFACE, "org/simantics/data/session/MethodInterface$Method", "invoke",
                "(Ljava/lang/Object;)Lorg/simantics/data/session/MethodInterface$AsyncResult;");
        mv.visitVarInsn(ASTORE, argRegs + 3);
        mv.visitLabel(l0);
        mv.visitVarInsn(ALOAD, argRegs + 3);
        mv.visitMethodInsn(INVOKEINTERFACE, "org/simantics/data/session/MethodInterface$AsyncResult",
                "waitForResponse", "()Ljava/lang/Object;");
        // TODO Return typecase result
        Class<?> returnType = m.getReturnType();

        if (returnType == void.class) {
            mv.visitInsn(POP);
            mv.visitInsn(RETURN);
        } else if (returnType == int.class) {
            mv.visitTypeInsn(CHECKCAST, "java/lang/Integer");
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Integer", "intValue", "()I");
            mv.visitLabel(l1);
            mv.visitInsn(IRETURN);
        } else if (returnType == byte.class) {
            mv.visitTypeInsn(CHECKCAST, "java/lang/Byte");
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Byte", "byteValue", "B()");
            mv.visitLabel(l1);
            mv.visitInsn(IRETURN);
        } else if (returnType == char.class) {
            mv.visitTypeInsn(CHECKCAST, "java/lang/Character");
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Character", "charValue", "()C");
            mv.visitLabel(l1);
            mv.visitInsn(IRETURN);
        } else if (returnType == boolean.class) {
            mv.visitTypeInsn(CHECKCAST, "java/lang/Boolean");
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Boolean", "booleanValue", "()Z");
            mv.visitLabel(l1);
            mv.visitInsn(IRETURN);
        } else if (returnType == short.class) {
            mv.visitTypeInsn(CHECKCAST, "java/lang/Short");
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Short", "shortValue", "()S");
            mv.visitLabel(l1);
            mv.visitInsn(IRETURN);
        } else if (returnType == long.class) {
            mv.visitTypeInsn(CHECKCAST, "java/lang/Long");
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Long", "longValue", "()J");
            mv.visitLabel(l1);
            mv.visitInsn(LRETURN);
        } else if (returnType == double.class) {
            mv.visitTypeInsn(CHECKCAST, "java/lang/Double");
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Double", "doubleValue", "()D");
            mv.visitLabel(l1);
            mv.visitInsn(DRETURN);
        } else if (returnType == float.class) {
            mv.visitTypeInsn(CHECKCAST, "java/lang/Float");
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Float", "floatValue", "()F");
            mv.visitLabel(l1);
            mv.visitInsn(FRETURN);
        } else {
            // Object
            mv.visitTypeInsn(CHECKCAST, returnType.getName().replaceAll("\\.", "/"));
            mv.visitLabel(l1);
            mv.visitInsn(ARETURN);
        }

        // Handle exceptions
        mv.visitLabel(l2);
        mv.visitFrame(Opcodes.F_FULL, argRegs + 4,
                new Object[] { classResourceName, "java/lang/Integer",
                        "org/simantics/data/session/MethodInterface$Method", "[Ljava/lang/Object;",
                        "org/simantics/data/session/MethodInterface$AsyncResult" },
                1, new Object[] { "org/simantics/data/session/MethodInterface$ExecutionError" });
        mv.visitVarInsn(ASTORE, argRegs + 4);
        Label l7 = new Label();
        mv.visitLabel(l7);
        mv.visitVarInsn(ALOAD, argRegs + 4);
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/simantics/data/session/MethodInterface$ExecutionError",
                "getError", "()Ljava/lang/Object;");
        mv.visitVarInsn(ASTORE, argRegs + 5); // argRegs+5 <- ExecutionError.cause

        Class<?>[] exceptionClasses = m.getExceptionTypes();
        Label nextException[] = new Label[exceptionClasses.length];
        for (int i = 0; i < exceptionClasses.length; i++) {
            Class<?> exceptionClass = exceptionClasses[i];
            String exceptionClassResourceName = exceptionClass.getName().replaceAll("\\.", "/");
            nextException[i] = new Label();
            // If instanceof MyException
            Label l8 = new Label();
            mv.visitLabel(l8);
            mv.visitVarInsn(ALOAD, argRegs + 5); // Cause
            mv.visitTypeInsn(INSTANCEOF, exceptionClassResourceName);
            mv.visitJumpInsn(IFEQ, nextException[i]); // If not, go to ExecutionError
            // If so, throw it
            mv.visitVarInsn(ALOAD, argRegs + 5); // e
            mv.visitTypeInsn(CHECKCAST, exceptionClassResourceName);
            mv.visitInsn(ATHROW);
            mv.visitLabel(nextException[i]);
        }

        // ExecutionError
        mv.visitFrame(
                Opcodes.F_APPEND, argRegs + 1, new Object[] {
                        "org/simantics/data/session/MethodInterface$ExecutionError", "java/lang/Object" },
                0, null);
        mv.visitTypeInsn(NEW, "java/lang/RuntimeException");
        mv.visitInsn(DUP);
        mv.visitVarInsn(ALOAD, argRegs + 4);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/Throwable;)V");
        mv.visitInsn(ATHROW);

        // InteruptedException
        mv.visitLabel(l3);
        mv.visitFrame(Opcodes.F_FULL, argRegs + 4,
                new Object[] { classResourceName, "java/lang/Integer",
                        "org/simantics/data/session/MethodInterface$Method", "[Ljava/lang/Object;",
                        "org/simantics/data/session/MethodInterface$AsyncResult" },
                1, new Object[] { "java/lang/InterruptedException" });
        mv.visitVarInsn(ASTORE, argRegs + 4);
        Label l10 = new Label();
        mv.visitLabel(l10);
        mv.visitTypeInsn(NEW, "java/lang/RuntimeException");
        mv.visitInsn(DUP);
        mv.visitVarInsn(ALOAD, argRegs + 4);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/Throwable;)V");
        mv.visitInsn(ATHROW);

        Label l11 = new Label();
        mv.visitLabel(l11);
        mv.visitLocalVariable("this", classTypeDescriptor, null, l4, l11, 0);
        //      mv.visitLocalVariable("arg1", "Ljava/lang/Integer;", null, l4, l11, 1);
        register = 1;
        for (int i = 0; i < params.length; i++) {
            Class<?> clazz = params[i];
            mv.visitLocalVariable("arg" + (i + 1), classToTypeDescriptor(clazz), null, l4, l11, register);
            register++;
            if (clazz == long.class || clazz == float.class || clazz == Double.class)
                argRegs++;
        }
        mv.visitLocalVariable("m", "Lorg/simantics/data/session/MethodInterface$Method;", null, l5, l11,
                argRegs + 1);
        mv.visitLocalVariable("args", "[Ljava/lang/Object;", null, l6, l11, argRegs + 2);
        mv.visitLocalVariable("result", "Lorg/simantics/data/session/MethodInterface$AsyncResult;", null, l0,
                l11, argRegs + 3);
        mv.visitLocalVariable("e", "Lorg/simantics/data/session/MethodInterface$ExecutionError;", null, l7, l3,
                argRegs + 4);
        mv.visitLocalVariable("cause", "Ljava/lang/Object;", null, l7, l3, argRegs + 5);
        mv.visitLocalVariable("e", "Ljava/lang/InterruptedException;", null, l10, l11, argRegs + 4);
        mv.visitMaxs(argRegs + 3, argRegs + 6);
        mv.visitEnd();
        methodNumber++;
    }

    cw.visitEnd();
}

From source file:org.skfiy.typhon.dispatcher.AsmDispatcherFactory.java

License:Apache License

@Override
public synchronized Dispatcher getDispatcher() {
    if (dispatcher != null) {
        return dispatcher;
    }/*from w  w w  .  j a v a 2  s  .c o  m*/

    helper = new ActionHelper(container);
    String packageName = this.getClass().getPackage().getName();
    String simpleName = "__Typhon__AsmDispatcher__";
    String proxyClassName = packageName + "." + simpleName;
    String inertalName = proxyClassName.replaceAll("\\.", "/");

    ClassWriter cw = new ClassWriter(0);

    cw.visit(V1_7, ACC_PUBLIC, inertalName, null, Type.getInternalName(Object.class),
            new String[] { Type.getInternalName(Dispatcher.class) });

    Set<Class<?>> classes = helper.getActionMappings().keySet();
    // Fields
    for (Class clazz : classes) {
        cw.visitField(ACC_PRIVATE, buildFieldName(clazz), Type.getDescriptor(clazz), null, null).visitEnd();
    }

    MethodVisitor mv;
    // FIXME
    mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(" + Type.getDescriptor(Container.class) + ")V", null, null);
    mv.visitCode();
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");

    // put field value
    for (Class clazz : classes) {
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitLdcInsn(Type.getType(clazz));
        mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(Container.class), "getInstance",
                "(Ljava/lang/Class;)Ljava/lang/Object;");
        mv.visitTypeInsn(CHECKCAST, Type.getInternalName(clazz));
        mv.visitFieldInsn(PUTFIELD, inertalName, buildFieldName(clazz), Type.getDescriptor(clazz));
    }

    mv.visitInsn(RETURN);
    mv.visitMaxs(4, 4);
    mv.visitEnd();

    // dispatch method
    mv = cw.visitMethod(ACC_PUBLIC, "dispatch", "(Ljava/lang/String;" + Type.getDescriptor(Packet.class) + ")V",
            null, null);
    mv.visitCode();
    //
    Label endIfLab = new Label();
    for (Map.Entry<Class<?>, List<ActionMapping>> entry : helper.getActionMappings().entrySet()) {
        for (ActionMapping am : entry.getValue()) {
            mv.visitLdcInsn(am.getNs());
            mv.visitVarInsn(ALOAD, 1);
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z");

            Label lab = new Label();
            mv.visitJumpInsn(IFEQ, lab);

            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, inertalName, buildFieldName(entry.getKey()),
                    Type.getDescriptor(entry.getKey()));
            mv.visitVarInsn(ALOAD, 2);
            mv.visitTypeInsn(CHECKCAST, Type.getInternalName(am.getPacketClass()));
            mv.visitMethodInsn(INVOKEVIRTUAL, Type.getInternalName(entry.getKey()), am.getMethod().getName(),
                    "(" + Type.getDescriptor(am.getPacketClass()) + ")V");
            // 
            mv.visitJumpInsn(GOTO, endIfLab);
            mv.visitLabel(lab);
            mv.visitFrame(F_SAME, 0, null, 0, null);
        }
    }

    // else
    String excepInternalName = Type.getInternalName(NoNamespaceDefException.class);
    mv.visitTypeInsn(NEW, excepInternalName);
    mv.visitInsn(DUP);

    // =====================================================================
    String sbInertalName = Type.getInternalName(StringBuilder.class);
    mv.visitTypeInsn(NEW, sbInertalName);
    mv.visitInsn(DUP);
    mv.visitLdcInsn("Not found \"");
    mv.visitMethodInsn(INVOKESPECIAL, sbInertalName, "<init>", "(Ljava/lang/String;)V");
    mv.visitVarInsn(ALOAD, 1);
    mv.visitMethodInsn(INVOKEVIRTUAL, sbInertalName, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;");
    mv.visitLdcInsn("\" namespace");
    mv.visitMethodInsn(INVOKEVIRTUAL, sbInertalName, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;");
    mv.visitMethodInsn(INVOKEVIRTUAL, sbInertalName, "toString", "()Ljava/lang/String;");
    // =====================================================================
    mv.visitMethodInsn(INVOKESPECIAL, excepInternalName, "<init>", "(Ljava/lang/String;)V");
    mv.visitInsn(ATHROW);

    mv.visitLabel(endIfLab);
    mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
    mv.visitInsn(RETURN);
    mv.visitMaxs(5, 4);
    mv.visitEnd();

    cw.visitEnd();

    // ------------------------------------------------------------------
    byte[] buf = cw.toByteArray();
    Class proxyClass = defineClass(proxyClassName, buf, 0, buf.length);

    try {

        dispatcher = (Dispatcher) proxyClass.getConstructor(Container.class).newInstance(container);
    } catch (Exception e) {
        // throw new AssertionError("", e);
        e.printStackTrace();
    }
    return dispatcher;
}

From source file:org.sonar.java.bytecode.cfg.BytecodeListingParser.java

License:Open Source License

private static void visitLine(String[] words, MethodVisitor mv, Map<Integer, Label> labelIndexes) {
    // labels ://from   w w  w .  j a  va2  s .  co m
    String initWord = words[0];
    if (initWord.matches("L\\d+")) {
        mv.visitLabel(labelIndexes.computeIfAbsent(Integer.parseInt(initWord.substring(1)), k -> new Label()));
    }

    int opcode = Arrays.asList(Printer.OPCODES).indexOf(initWord);
    if (opcode == -1) {
        return;
    }
    if (NO_OPERAND_INSN.contains(opcode)) {
        mv.visitInsn(opcode);
    } else if (INT_INSN.contains(opcode)) {
        mv.visitIntInsn(opcode, Integer.parseInt(words[1]));
    } else if (VAR_INSN.contains(opcode)) {
        mv.visitVarInsn(opcode, Integer.parseInt(words[1]));
    } else if (TYPE_INSN.contains(opcode)) {
        mv.visitTypeInsn(opcode, words[1]);
    } else if (FIELD_INSN.contains(opcode)) {
        mv.visitFieldInsn(opcode, words[1], words[2], words[3]);
    } else if (METHOD_INSN.contains(opcode)) {
        // FIXME: interface flag is hardcoded.
        mv.visitMethodInsn(opcode, words[1], words[2], words[3], false);
    } else if (JUMP_INSN.contains(opcode)) {
        mv.visitJumpInsn(opcode,
                labelIndexes.computeIfAbsent(Integer.parseInt(words[1].substring(1)), k -> new Label()));
    } else if (opcode == IINC) {
        mv.visitIincInsn(Integer.parseInt(words[1]), Integer.parseInt(words[2]));
    }

}

From source file:org.sonatype.restsimple.jaxrs.impl.JAXRSServiceDefinitionGenerator.java

License:Open Source License

/**
 * Generate a JAX RS Resource on the fly, based on the information contained with a {@link ServiceDefinition}
 * @param serviceDefinition a {@link ServiceDefinition}
 *///from   w  ww. j  ava 2s.c om
@Override
public void generate(final ServiceDefinition serviceDefinition, ServiceHandlerMapper mapper) {

    for (ServiceHandler sh : serviceDefinition.serviceHandlers()) {
        mapper.addServiceHandler(serviceDefinition.path(), sh);
    }

    ClassWriter cw = new ClassWriter(0);
    FieldVisitor fv;
    MethodVisitor mv;
    AnnotationVisitor av0;

    String uuid = UUID.randomUUID().toString().replace("-", "").substring(0, 4);
    String className = "org/sonatype/restsimple/model/ServiceDescriptionResource" + uuid;

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

    {
        String path = serviceDefinition.path().contains("/:") ? convert(serviceDefinition.path())
                : serviceDefinition.path();
        logger.info("Generating jaxrs resource for {} with path {}", serviceDefinition, path);
        if (path == "") {
            path = "/";
        }
        av0 = cw.visitAnnotation("Ljavax/ws/rs/Path;", true);
        av0.visit("value", path);
        av0.visitEnd();
    }
    if (serviceDefinition.mediaToProduce().size() > 0) {
        {
            av0 = cw.visitAnnotation("Ljavax/ws/rs/Produces;", true);
            {
                AnnotationVisitor av1 = av0.visitArray("value");
                for (MediaType m : serviceDefinition.mediaToProduce()) {
                    av1.visit(null, m.toMediaType());
                }
                av1.visitEnd();
            }
            av0.visitEnd();
        }
    }
    if (serviceDefinition.mediaToConsume().size() > 0) {
        {
            av0 = cw.visitAnnotation("Ljavax/ws/rs/Consumes;", true);
            {
                AnnotationVisitor av1 = av0.visitArray("value");
                for (MediaType m : serviceDefinition.mediaToConsume()) {
                    av1.visit(null, m.toMediaType());
                }
                av1.visitEnd();
            }
            av0.visitEnd();
        }
    }
    cw.visitInnerClass("javax/ws/rs/core/Response$ResponseBuilder", "javax/ws/rs/core/Response",
            "ResponseBuilder", ACC_PUBLIC + ACC_STATIC + ACC_ABSTRACT);

    cw.visitInnerClass("javax/ws/rs/core/Response$Status", "javax/ws/rs/core/Response", "Status",
            ACC_PUBLIC + ACC_FINAL + ACC_STATIC + ACC_ENUM);

    cw.visitInnerClass("org/sonatype/restsimple/api/ServiceDefinition$HttpMethod",
            "org/sonatype/restsimple/api/ServiceDefinition", "HttpMethod",
            ACC_PUBLIC + ACC_FINAL + ACC_STATIC + ACC_ENUM);

    {
        fv = cw.visitField(ACC_PRIVATE, "logger", "Lorg/slf4j/Logger;", null, null);
        fv.visitEnd();
    }
    {
        fv = cw.visitField(0, "request", "Ljavax/servlet/http/HttpServletRequest;", null, null);
        {
            av0 = fv.visitAnnotation("Ljavax/ws/rs/core/Context;", true);
            av0.visitEnd();
        }
        fv.visitEnd();
    }
    {
        fv = cw.visitField(0, "mapper", "Lorg/sonatype/restsimple/spi/ServiceHandlerMapper;", null, null);
        {
            av0 = fv.visitAnnotation("Lcom/google/inject/Inject;", true);
            av0.visitEnd();
        }
        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");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitLdcInsn(Type.getType("L" + className + ";"));
        mv.visitMethodInsn(INVOKESTATIC, "org/slf4j/LoggerFactory", "getLogger",
                "(Ljava/lang/Class;)Lorg/slf4j/Logger;");
        mv.visitFieldInsn(PUTFIELD, className, "logger", "Lorg/slf4j/Logger;");
        mv.visitInsn(RETURN);
        mv.visitMaxs(2, 1);
        mv.visitEnd();
    }
    int duplicateCounter = -1;
    for (ServiceHandler serviceHandler : serviceDefinition.serviceHandlers()) {
        {
            String methodName = serviceHandler.getHttpMethod().name().toLowerCase();
            if (duplicateCounter++ >= 0) {
                methodName = methodName + duplicateCounter;
            }

            if (serviceHandler.getHttpMethod().name().equalsIgnoreCase("get")) {
                mv = cw.visitMethod(ACC_PUBLIC, methodName, "(Ljavax/ws/rs/core/UriInfo;)Ljava/lang/Object;",
                        null, null);
                {
                    String p = convert(serviceHandler.path());
                    if (!p.equals("/") && !p.isEmpty()) {
                        av0 = mv.visitAnnotation("Ljavax/ws/rs/Path;", true);
                        av0.visit("value", p);
                        av0.visitEnd();
                    }
                }
                {
                    av0 = mv.visitAnnotation("Ljavax/ws/rs/GET;", true);
                    av0.visitEnd();
                }
                if (serviceHandler.consumeMediaType() != null) {
                    {
                        av0 = mv.visitAnnotation("Ljavax/ws/rs/Consumes;", true);
                        {
                            AnnotationVisitor av1 = av0.visitArray("value");
                            av1.visit(null, serviceHandler.consumeMediaType().toMediaType());
                            av1.visitEnd();
                        }
                        av0.visitEnd();
                    }
                }
                if (serviceHandler.mediaToProduce().size() > 0) {
                    {
                        av0 = mv.visitAnnotation("Ljavax/ws/rs/Produces;", true);
                        {
                            AnnotationVisitor av1 = av0.visitArray("value");
                            for (MediaType m : serviceHandler.mediaToProduce()) {
                                av1.visit(null, m.toMediaType());
                            }
                            av1.visitEnd();
                        }
                        av0.visitEnd();
                    }
                }
                {
                    av0 = mv.visitParameterAnnotation(0, "Ljavax/ws/rs/core/Context;", true);
                    av0.visitEnd();
                }
                mv.visitCode();
                mv.visitVarInsn(ALOAD, 0);
                mv.visitLdcInsn("get");
                mv.visitVarInsn(ALOAD, 1);
                mv.visitInsn(ACONST_NULL);
                mv.visitVarInsn(ALOAD, 0);
                mv.visitVarInsn(ALOAD, 1);
                mv.visitMethodInsn(INVOKESPECIAL, className, "mapMatrixParam",
                        "(Ljavax/ws/rs/core/UriInfo;)Ljava/util/Map;");
                mv.visitInsn(ACONST_NULL);
                mv.visitMethodInsn(INVOKESPECIAL, className, "invokeAction",
                        "(Ljava/lang/String;Ljavax/ws/rs/core/UriInfo;Ljavax/ws/rs/core/MultivaluedMap;Ljava/util/Map;Ljava/lang/Object;)Ljava/lang/Object;");
                mv.visitVarInsn(ASTORE, 2);
                mv.visitVarInsn(ALOAD, 2);
                mv.visitInsn(ARETURN);
                mv.visitMaxs(6, 3);
                mv.visitEnd();
                continue;
            }
        }
        {
            if (serviceHandler.getHttpMethod().name().equalsIgnoreCase("head")) {

                {
                    String methodName = serviceHandler.getHttpMethod().name().toLowerCase();
                    if (duplicateCounter++ >= 0) {
                        methodName = methodName + "_" + duplicateCounter;
                    }
                    mv = cw.visitMethod(ACC_PUBLIC, methodName,
                            "(Ljavax/ws/rs/core/UriInfo;)Ljavax/ws/rs/core/Response;", null, null);
                    {
                        String p = convert(serviceHandler.path());
                        if (!p.equals("/") && !p.isEmpty()) {
                            av0 = mv.visitAnnotation("Ljavax/ws/rs/Path;", true);
                            av0.visit("value", p);
                            av0.visitEnd();
                        }
                    }
                    {
                        av0 = mv.visitAnnotation("Ljavax/ws/rs/HEAD;", true);
                        av0.visitEnd();
                    }
                    if (serviceHandler.consumeMediaType() != null) {
                        {
                            av0 = mv.visitAnnotation("Ljavax/ws/rs/Consumes;", true);
                            {
                                AnnotationVisitor av1 = av0.visitArray("value");
                                av1.visit(null, serviceHandler.consumeMediaType().toMediaType());
                                av1.visitEnd();
                            }
                            av0.visitEnd();
                        }
                    }
                    if (serviceHandler.mediaToProduce().size() > 0) {
                        {
                            av0 = mv.visitAnnotation("Ljavax/ws/rs/Produces;", true);
                            {
                                AnnotationVisitor av1 = av0.visitArray("value");
                                for (MediaType m : serviceHandler.mediaToProduce()) {
                                    av1.visit(null, m.toMediaType());
                                }
                                av1.visitEnd();
                            }
                            av0.visitEnd();
                        }
                    }
                    {
                        av0 = mv.visitParameterAnnotation(0, "Ljavax/ws/rs/core/Context;", true);
                        av0.visitEnd();
                    }
                    mv.visitCode();
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitLdcInsn("head");
                    mv.visitVarInsn(ALOAD, 1);
                    mv.visitInsn(ACONST_NULL);
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitVarInsn(ALOAD, 1);
                    mv.visitMethodInsn(INVOKESPECIAL, className, "mapMatrixParam",
                            "(Ljavax/ws/rs/core/UriInfo;)Ljava/util/Map;");
                    mv.visitInsn(ACONST_NULL);
                    mv.visitMethodInsn(INVOKESPECIAL, className, "invokeAction",
                            "(Ljava/lang/String;Ljavax/ws/rs/core/UriInfo;Ljavax/ws/rs/core/MultivaluedMap;Ljava/util/Map;Ljava/lang/Object;)Ljava/lang/Object;");
                    mv.visitVarInsn(ASTORE, 2);
                    mv.visitMethodInsn(INVOKESTATIC, "javax/ws/rs/core/Response", "ok",
                            "()Ljavax/ws/rs/core/Response$ResponseBuilder;");
                    mv.visitMethodInsn(INVOKEVIRTUAL, "javax/ws/rs/core/Response$ResponseBuilder", "build",
                            "()Ljavax/ws/rs/core/Response;");
                    mv.visitInsn(ARETURN);
                    mv.visitMaxs(6, 3);
                    mv.visitEnd();
                    continue;
                }
            }
        }
        {
            if (serviceHandler.getHttpMethod().name().equalsIgnoreCase("put")) {

                {
                    String methodName = serviceHandler.getHttpMethod().name().toLowerCase();
                    if (duplicateCounter++ >= 0) {
                        methodName = methodName + "_" + duplicateCounter;
                    }

                    String methodType = serviceHandler.consumeClass() != null
                            ? serviceHandler.consumeClass().getName().replace(".", "/")
                            : "java/lang/String";
                    mv = cw.visitMethod(ACC_PUBLIC, methodName,
                            "(Ljavax/ws/rs/core/UriInfo;L" + methodType + ";)Ljavax/ws/rs/core/Response;", null,
                            null);
                    {
                        String p = convert(serviceHandler.path());
                        if (!p.equals("/") && !p.isEmpty()) {
                            av0 = mv.visitAnnotation("Ljavax/ws/rs/Path;", true);
                            av0.visit("value", p);
                            av0.visitEnd();
                        }
                    }
                    {
                        av0 = mv.visitAnnotation("Ljavax/ws/rs/PUT;", true);
                        av0.visitEnd();
                    }
                    if (serviceHandler.consumeMediaType() != null) {
                        {
                            av0 = mv.visitAnnotation("Ljavax/ws/rs/Consumes;", true);
                            {
                                AnnotationVisitor av1 = av0.visitArray("value");
                                av1.visit(null, serviceHandler.consumeMediaType().toMediaType());
                                av1.visitEnd();
                            }
                            av0.visitEnd();
                        }
                    }
                    if (serviceHandler.mediaToProduce().size() > 0) {
                        {
                            av0 = mv.visitAnnotation("Ljavax/ws/rs/Produces;", true);
                            {
                                AnnotationVisitor av1 = av0.visitArray("value");
                                for (MediaType m : serviceHandler.mediaToProduce()) {
                                    av1.visit(null, m.toMediaType());
                                }
                                av1.visitEnd();
                            }
                            av0.visitEnd();
                        }
                    }
                    {
                        av0 = mv.visitParameterAnnotation(0, "Ljavax/ws/rs/core/Context;", true);
                        av0.visitEnd();
                    }
                    mv.visitCode();
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;");
                    mv.visitMethodInsn(INVOKESTATIC, "javax/ws/rs/core/UriBuilder", "fromResource",
                            "(Ljava/lang/Class;)Ljavax/ws/rs/core/UriBuilder;");
                    mv.visitInsn(ICONST_3);
                    mv.visitTypeInsn(ANEWARRAY, "java/lang/String");
                    mv.visitInsn(DUP);
                    mv.visitInsn(ICONST_0);
                    mv.visitLdcInsn("");
                    mv.visitInsn(AASTORE);
                    mv.visitInsn(DUP);
                    mv.visitInsn(ICONST_1);
                    mv.visitLdcInsn("");
                    mv.visitInsn(AASTORE);
                    mv.visitInsn(DUP);
                    mv.visitInsn(ICONST_2);
                    mv.visitLdcInsn("");
                    mv.visitInsn(AASTORE);
                    mv.visitMethodInsn(INVOKEVIRTUAL, "javax/ws/rs/core/UriBuilder", "build",
                            "([Ljava/lang/Object;)Ljava/net/URI;");
                    mv.visitVarInsn(ASTORE, 3);
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitLdcInsn("put");
                    mv.visitVarInsn(ALOAD, 1);
                    mv.visitVarInsn(ALOAD, 1);
                    mv.visitMethodInsn(INVOKEINTERFACE, "javax/ws/rs/core/UriInfo", "getQueryParameters",
                            "()Ljavax/ws/rs/core/MultivaluedMap;");
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitVarInsn(ALOAD, 1);
                    mv.visitMethodInsn(INVOKESPECIAL, className, "mapMatrixParam",
                            "(Ljavax/ws/rs/core/UriInfo;)Ljava/util/Map;");
                    mv.visitVarInsn(ALOAD, 2);
                    mv.visitMethodInsn(INVOKESPECIAL, className, "invokeAction",
                            "(Ljava/lang/String;Ljavax/ws/rs/core/UriInfo;Ljavax/ws/rs/core/MultivaluedMap;Ljava/util/Map;Ljava/lang/Object;)Ljava/lang/Object;");
                    mv.visitVarInsn(ASTORE, 4);
                    mv.visitVarInsn(ALOAD, 3);
                    mv.visitMethodInsn(INVOKESTATIC, "javax/ws/rs/core/Response", "created",
                            "(Ljava/net/URI;)Ljavax/ws/rs/core/Response$ResponseBuilder;");
                    mv.visitVarInsn(ALOAD, 4);
                    mv.visitMethodInsn(INVOKEVIRTUAL, "javax/ws/rs/core/Response$ResponseBuilder", "entity",
                            "(Ljava/lang/Object;)Ljavax/ws/rs/core/Response$ResponseBuilder;");
                    mv.visitMethodInsn(INVOKEVIRTUAL, "javax/ws/rs/core/Response$ResponseBuilder", "build",
                            "()Ljavax/ws/rs/core/Response;");
                    mv.visitInsn(ARETURN);
                    mv.visitMaxs(6, 5);
                    mv.visitEnd();
                    continue;
                }
            }
            {
                if (serviceHandler.getHttpMethod().name().equalsIgnoreCase("post")) {

                    String methodName = serviceHandler.getHttpMethod().name().toLowerCase();
                    if (duplicateCounter++ >= 0) {
                        methodName = methodName + "_" + duplicateCounter;
                    }

                    List<String> formsParam = PostServiceHandler.class.cast(serviceHandler).formParams();
                    if (formsParam.size() > 0) {
                        {
                            mv = cw.visitMethod(ACC_PUBLIC, methodName,
                                    "(Ljavax/ws/rs/core/UriInfo;Ljavax/ws/rs/core/MultivaluedMap;)Ljavax/ws/rs/core/Response;",
                                    "(Ljavax/ws/rs/core/UriInfo;Ljavax/ws/rs/core/MultivaluedMap<Ljava/lang/String;Ljava/lang/String;>;)Ljavax/ws/rs/core/Response;",
                                    null);
                            {
                                String p = convert(serviceHandler.path());
                                if (!p.equals("/") && !p.isEmpty()) {
                                    av0 = mv.visitAnnotation("Ljavax/ws/rs/Path;", true);
                                    av0.visit("value", p);
                                    av0.visitEnd();
                                }
                            }
                            {
                                av0 = mv.visitAnnotation("Ljavax/ws/rs/POST;", true);
                                av0.visitEnd();
                            }
                            {
                                av0 = mv.visitAnnotation("Ljavax/ws/rs/Consumes;", true);
                                {
                                    AnnotationVisitor av1 = av0.visitArray("value");
                                    av1.visit(null, "application/x-www-form-urlencoded");
                                    av1.visitEnd();
                                }
                                av0.visitEnd();
                            }
                            if (serviceHandler.mediaToProduce().size() > 0) {
                                {
                                    av0 = mv.visitAnnotation("Ljavax/ws/rs/Produces;", true);
                                    {
                                        AnnotationVisitor av1 = av0.visitArray("value");
                                        for (MediaType m : serviceHandler.mediaToProduce()) {
                                            av1.visit(null, m.toMediaType());
                                        }
                                        av1.visitEnd();
                                    }
                                    av0.visitEnd();
                                }
                            }
                            {
                                av0 = mv.visitParameterAnnotation(0, "Ljavax/ws/rs/core/Context;", true);
                                av0.visitEnd();
                            }
                            mv.visitCode();
                            mv.visitVarInsn(ALOAD, 0);
                            mv.visitLdcInsn("post");
                            mv.visitVarInsn(ALOAD, 1);
                            mv.visitVarInsn(ALOAD, 2);
                            mv.visitVarInsn(ALOAD, 0);
                            mv.visitVarInsn(ALOAD, 1);
                            mv.visitMethodInsn(INVOKESPECIAL, className, "mapMatrixParam",
                                    "(Ljavax/ws/rs/core/UriInfo;)Ljava/util/Map;");
                            mv.visitInsn(ACONST_NULL);
                            mv.visitMethodInsn(INVOKESPECIAL, className, "invokeAction",
                                    "(Ljava/lang/String;Ljavax/ws/rs/core/UriInfo;Ljavax/ws/rs/core/MultivaluedMap;Ljava/util/Map;Ljava/lang/Object;)Ljava/lang/Object;");
                            mv.visitVarInsn(ASTORE, 3);
                            mv.visitVarInsn(ALOAD, 3);
                            Label l0 = new Label();
                            mv.visitJumpInsn(IFNONNULL, l0);
                            mv.visitFieldInsn(GETSTATIC, "javax/ws/rs/core/Response$Status", "NO_CONTENT",
                                    "Ljavax/ws/rs/core/Response$Status;");
                            mv.visitMethodInsn(INVOKESTATIC, "javax/ws/rs/core/Response", "status",
                                    "(Ljavax/ws/rs/core/Response$Status;)Ljavax/ws/rs/core/Response$ResponseBuilder;");
                            mv.visitMethodInsn(INVOKEVIRTUAL, "javax/ws/rs/core/Response$ResponseBuilder",
                                    "build", "()Ljavax/ws/rs/core/Response;");
                            mv.visitInsn(ARETURN);
                            mv.visitLabel(l0);
                            mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] { "java/lang/Object" }, 0, null);
                            mv.visitVarInsn(ALOAD, 3);
                            mv.visitMethodInsn(INVOKESTATIC, "javax/ws/rs/core/Response", "ok",
                                    "(Ljava/lang/Object;)Ljavax/ws/rs/core/Response$ResponseBuilder;");
                            mv.visitMethodInsn(INVOKEVIRTUAL, "javax/ws/rs/core/Response$ResponseBuilder",
                                    "build", "()Ljavax/ws/rs/core/Response;");
                            mv.visitInsn(ARETURN);
                            mv.visitMaxs(6, 4);
                            mv.visitEnd();
                            continue;
                        }
                    } else {
                        String methodType = serviceHandler.consumeClass() != null
                                ? serviceHandler.consumeClass().getName().replace(".", "/")
                                : "java/lang/String";
                        mv = cw.visitMethod(ACC_PUBLIC, methodName,
                                "(Ljavax/ws/rs/core/UriInfo;L" + methodType + ";)Ljavax/ws/rs/core/Response;",
                                null, null);
                        {
                            String p = convert(serviceHandler.path());
                            if (!p.equals("/") && !p.isEmpty()) {
                                av0 = mv.visitAnnotation("Ljavax/ws/rs/Path;", true);
                                av0.visit("value", p);
                                av0.visitEnd();
                            }
                        }
                        {
                            av0 = mv.visitAnnotation("Ljavax/ws/rs/POST;", true);
                            av0.visitEnd();
                        }
                        if (serviceHandler.mediaToProduce().size() > 0) {
                            {
                                av0 = mv.visitAnnotation("Ljavax/ws/rs/Produces;", true);
                                {
                                    AnnotationVisitor av1 = av0.visitArray("value");
                                    for (MediaType m : serviceHandler.mediaToProduce()) {
                                        av1.visit(null, m.toMediaType());
                                    }
                                    av1.visitEnd();
                                }
                                av0.visitEnd();
                            }
                        }
                        if (serviceHandler.consumeMediaType() != null) {
                            {
                                av0 = mv.visitAnnotation("Ljavax/ws/rs/Consumes;", true);
                                {
                                    AnnotationVisitor av1 = av0.visitArray("value");
                                    av1.visit(null, serviceHandler.consumeMediaType().toMediaType());
                                    av1.visitEnd();
                                }
                                av0.visitEnd();
                            }
                        }
                        {
                            av0 = mv.visitParameterAnnotation(0, "Ljavax/ws/rs/core/Context;", true);
                            av0.visitEnd();
                        }
                        mv.visitCode();
                        mv.visitVarInsn(ALOAD, 0);
                        mv.visitLdcInsn("post");
                        mv.visitVarInsn(ALOAD, 1);
                        mv.visitVarInsn(ALOAD, 1);
                        mv.visitMethodInsn(INVOKEINTERFACE, "javax/ws/rs/core/UriInfo", "getQueryParameters",
                                "()Ljavax/ws/rs/core/MultivaluedMap;");
                        mv.visitVarInsn(ALOAD, 0);
                        mv.visitVarInsn(ALOAD, 1);
                        mv.visitMethodInsn(INVOKESPECIAL, className, "mapMatrixParam",
                                "(Ljavax/ws/rs/core/UriInfo;)Ljava/util/Map;");
                        mv.visitVarInsn(ALOAD, 2);
                        mv.visitMethodInsn(INVOKESPECIAL, className, "invokeAction",
                                "(Ljava/lang/String;Ljavax/ws/rs/core/UriInfo;Ljavax/ws/rs/core/MultivaluedMap;Ljava/util/Map;Ljava/lang/Object;)Ljava/lang/Object;");
                        mv.visitVarInsn(ASTORE, 3);
                        mv.visitVarInsn(ALOAD, 3);
                        Label l0 = new Label();
                        mv.visitJumpInsn(IFNONNULL, l0);
                        mv.visitFieldInsn(GETSTATIC, "javax/ws/rs/core/Response$Status", "NO_CONTENT",
                                "Ljavax/ws/rs/core/Response$Status;");
                        mv.visitMethodInsn(INVOKESTATIC, "javax/ws/rs/core/Response", "status",
                                "(Ljavax/ws/rs/core/Response$Status;)Ljavax/ws/rs/core/Response$ResponseBuilder;");
                        mv.visitMethodInsn(INVOKEVIRTUAL, "javax/ws/rs/core/Response$ResponseBuilder", "build",
                                "()Ljavax/ws/rs/core/Response;");
                        mv.visitInsn(ARETURN);
                        mv.visitLabel(l0);
                        mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] { "java/lang/Object" }, 0, null);
                        mv.visitVarInsn(ALOAD, 3);
                        mv.visitMethodInsn(INVOKESTATIC, "javax/ws/rs/core/Response", "ok",
                                "(Ljava/lang/Object;)Ljavax/ws/rs/core/Response$ResponseBuilder;");
                        mv.visitMethodInsn(INVOKEVIRTUAL, "javax/ws/rs/core/Response$ResponseBuilder", "build",
                                "()Ljavax/ws/rs/core/Response;");
                        mv.visitInsn(ARETURN);
                        mv.visitMaxs(6, 4);
                        mv.visitEnd();
                        continue;
                    }
                }
            }
            {
                if (serviceHandler.getHttpMethod().name().equalsIgnoreCase("delete")) {
                    {
                        String methodName = serviceHandler.getHttpMethod().name().toLowerCase();
                        if (duplicateCounter++ >= 0) {
                            methodName = methodName + "_" + duplicateCounter;
                        }
                        String methodType = serviceHandler.consumeClass() != null
                                ? serviceHandler.consumeClass().getName().replace(".", "/")
                                : "java/lang/String";
                        mv = cw.visitMethod(ACC_PUBLIC, methodName,
                                "(Ljavax/ws/rs/core/UriInfo;L" + methodType + ";)Ljavax/ws/rs/core/Response;",
                                null, null);

                        {
                            String p = convert(serviceHandler.path());
                            if (!p.equals("/") && !p.isEmpty()) {
                                av0 = mv.visitAnnotation("Ljavax/ws/rs/Path;", true);
                                av0.visit("value", p);
                                av0.visitEnd();
                            }
                        }
                        {
                            av0 = mv.visitAnnotation("Ljavax/ws/rs/DELETE;", true);
                            av0.visitEnd();
                        }
                        if (serviceHandler.mediaToProduce().size() > 0) {
                            {
                                av0 = mv.visitAnnotation("Ljavax/ws/rs/Produces;", true);
                                {
                                    AnnotationVisitor av1 = av0.visitArray("value");
                                    for (MediaType m : serviceHandler.mediaToProduce()) {
                                        av1.visit(null, m.toMediaType());
                                    }
                                    av1.visitEnd();
                                }
                                av0.visitEnd();
                            }
                        }
                        if (serviceHandler.consumeMediaType() != null) {
                            {
                                av0 = mv.visitAnnotation("Ljavax/ws/rs/Consumes;", true);
                                {
                                    AnnotationVisitor av1 = av0.visitArray("value");
                                    av1.visit(null, serviceHandler.consumeMediaType().toMediaType());
                                    av1.visitEnd();
                                }
                                av0.visitEnd();
                            }
                        }
                        {
                            av0 = mv.visitParameterAnnotation(0, "Ljavax/ws/rs/core/Context;", true);
                            av0.visitEnd();
                        }
                        mv.visitCode();
                        mv.visitVarInsn(ALOAD, 0);
                        mv.visitLdcInsn("delete");
                        mv.visitVarInsn(ALOAD, 1);
                        mv.visitInsn(ACONST_NULL);
                        mv.visitVarInsn(ALOAD, 0);
                        mv.visitVarInsn(ALOAD, 1);
                        mv.visitMethodInsn(INVOKESPECIAL, className, "mapMatrixParam",
                                "(Ljavax/ws/rs/core/UriInfo;)Ljava/util/Map;");
                        mv.visitVarInsn(ALOAD, 2);
                        mv.visitMethodInsn(INVOKESPECIAL, className, "invokeAction",
                                "(Ljava/lang/String;Ljavax/ws/rs/core/UriInfo;Ljavax/ws/rs/core/MultivaluedMap;Ljava/util/Map;Ljava/lang/Object;)Ljava/lang/Object;");
                        mv.visitVarInsn(ASTORE, 3);
                        mv.visitVarInsn(ALOAD, 3);
                        mv.visitMethodInsn(INVOKESTATIC, "javax/ws/rs/core/Response", "ok",
                                "(Ljava/lang/Object;)Ljavax/ws/rs/core/Response$ResponseBuilder;");
                        mv.visitMethodInsn(INVOKEVIRTUAL, "javax/ws/rs/core/Response$ResponseBuilder", "build",
                                "()Ljavax/ws/rs/core/Response;");
                        mv.visitInsn(ARETURN);
                        mv.visitMaxs(6, 4);
                        mv.visitEnd();
                        continue;
                    }
                }
            }
        }
    }
    {
        mv = cw.visitMethod(ACC_PRIVATE, "invokeAction",
                "(Ljava/lang/String;Ljavax/ws/rs/core/UriInfo;Ljavax/ws/rs/core/MultivaluedMap;Ljava/util/Map;Ljava/lang/Object;)Ljava/lang/Object;",
                "<T:Ljava/lang/Object;>(Ljava/lang/String;Ljavax/ws/rs/core/UriInfo;Ljavax/ws/rs/core/MultivaluedMap<Ljava/lang/String;Ljava/lang/String;>;Ljava/util/Map<Ljava/lang/String;Ljava/util/Collection<Ljava/lang/String;>;>;TT;)Ljava/lang/Object;",
                null);
        mv.visitCode();
        Label l0 = new Label();
        Label l1 = new Label();
        Label l2 = new Label();
        mv.visitTryCatchBlock(l0, l1, l2, "org/sonatype/restsimple/api/ActionException");
        Label l3 = new Label();
        mv.visitTryCatchBlock(l0, l1, l3, "java/lang/Throwable");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, className, "mapper", "Lorg/sonatype/restsimple/spi/ServiceHandlerMapper;");
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEINTERFACE, "javax/ws/rs/core/UriInfo", "getPath", "()Ljava/lang/String;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/sonatype/restsimple/spi/ServiceHandlerMapper", "map",
                "(Ljava/lang/String;Ljava/lang/String;)Lorg/sonatype/restsimple/api/ServiceHandler;");
        mv.visitVarInsn(ASTORE, 6);
        mv.visitVarInsn(ALOAD, 6);
        Label l4 = new Label();
        mv.visitJumpInsn(IFNONNULL, l4);
        mv.visitTypeInsn(NEW, "javax/ws/rs/WebApplicationException");
        mv.visitInsn(DUP);
        mv.visitIntInsn(SIPUSH, 405);
        mv.visitMethodInsn(INVOKESTATIC, "javax/ws/rs/core/Response", "status",
                "(I)Ljavax/ws/rs/core/Response$ResponseBuilder;");
        mv.visitLdcInsn("Method not allowed");
        mv.visitMethodInsn(INVOKEVIRTUAL, "javax/ws/rs/core/Response$ResponseBuilder", "entity",
                "(Ljava/lang/Object;)Ljavax/ws/rs/core/Response$ResponseBuilder;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "javax/ws/rs/core/Response$ResponseBuilder", "build",
                "()Ljavax/ws/rs/core/Response;");
        mv.visitMethodInsn(INVOKESPECIAL, "javax/ws/rs/WebApplicationException", "<init>",
                "(Ljavax/ws/rs/core/Response;)V");
        mv.visitInsn(ATHROW);
        mv.visitLabel(l4);
        mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] { "org/sonatype/restsimple/api/ServiceHandler" }, 0,
                null);
        mv.visitVarInsn(ALOAD, 6);
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/sonatype/restsimple/api/ServiceHandler", "getHttpMethod",
                "()Lorg/sonatype/restsimple/api/ServiceDefinition$METHOD;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/sonatype/restsimple/api/ServiceDefinition$METHOD", "name",
                "()Ljava/lang/String;");
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equalsIgnoreCase", "(Ljava/lang/String;)Z");
        Label l5 = new Label();
        mv.visitJumpInsn(IFNE, l5);
        mv.visitTypeInsn(NEW, "javax/ws/rs/WebApplicationException");
        mv.visitInsn(DUP);
        mv.visitIntInsn(SIPUSH, 405);
        mv.visitMethodInsn(INVOKESTATIC, "javax/ws/rs/core/Response", "status",
                "(I)Ljavax/ws/rs/core/Response$ResponseBuilder;");
        mv.visitLdcInsn("Method not allowed");
        mv.visitMethodInsn(INVOKEVIRTUAL, "javax/ws/rs/core/Response$ResponseBuilder", "entity",
                "(Ljava/lang/Object;)Ljavax/ws/rs/core/Response$ResponseBuilder;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "javax/ws/rs/core/Response$ResponseBuilder", "build",
                "()Ljavax/ws/rs/core/Response;");
        mv.visitMethodInsn(INVOKESPECIAL, "javax/ws/rs/WebApplicationException", "<init>",
                "(Ljavax/ws/rs/core/Response;)V");
        mv.visitInsn(ATHROW);
        mv.visitLabel(l5);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitInsn(ACONST_NULL);
        mv.visitVarInsn(ASTORE, 7);
        mv.visitVarInsn(ALOAD, 6);
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/sonatype/restsimple/api/ServiceHandler", "getAction",
                "()Lorg/sonatype/restsimple/api/Action;");
        mv.visitVarInsn(ASTORE, 8);
        mv.visitTypeInsn(NEW, "java/util/HashMap");
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, "java/util/HashMap", "<init>", "()V");
        mv.visitVarInsn(ASTORE, 9);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEINTERFACE, "javax/ws/rs/core/UriInfo", "getPathParameters",
                "()Ljavax/ws/rs/core/MultivaluedMap;");
        mv.visitMethodInsn(INVOKEINTERFACE, "javax/ws/rs/core/MultivaluedMap", "entrySet", "()Ljava/util/Set;");
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Set", "iterator", "()Ljava/util/Iterator;");
        mv.visitVarInsn(ASTORE, 10);
        Label l6 = new Label();
        mv.visitLabel(l6);
        mv.visitFrame(Opcodes.F_FULL, 11,
                new Object[] { className, "java/lang/String", "javax/ws/rs/core/UriInfo",
                        "javax/ws/rs/core/MultivaluedMap", "java/util/Map", "java/lang/Object",
                        "org/sonatype/restsimple/api/ServiceHandler", "java/lang/Object",
                        "org/sonatype/restsimple/api/Action", "java/util/Map", "java/util/Iterator" },
                0, new Object[] {});
        mv.visitVarInsn(ALOAD, 10);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "hasNext", "()Z");
        mv.visitJumpInsn(IFEQ, l0);
        mv.visitVarInsn(ALOAD, 10);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;");
        mv.visitTypeInsn(CHECKCAST, "java/util/Map$Entry");
        mv.visitVarInsn(ASTORE, 11);
        mv.visitVarInsn(ALOAD, 9);
        mv.visitVarInsn(ALOAD, 11);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map$Entry", "getKey", "()Ljava/lang/Object;");
        mv.visitVarInsn(ALOAD, 11);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map$Entry", "getValue", "()Ljava/lang/Object;");
        mv.visitTypeInsn(CHECKCAST, "java/util/List");
        mv.visitInsn(ICONST_0);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "get", "(I)Ljava/lang/Object;");
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "put",
                "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
        mv.visitInsn(POP);
        mv.visitJumpInsn(GOTO, l6);
        mv.visitLabel(l0);
        mv.visitFrame(Opcodes.F_CHOP, 1, null, 0, null);
        mv.visitTypeInsn(NEW, "org/sonatype/restsimple/api/ActionContext");
        mv.visitInsn(DUP);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, className, "request", "Ljavax/servlet/http/HttpServletRequest;");
        mv.visitMethodInsn(INVOKEINTERFACE, "javax/servlet/http/HttpServletRequest", "getMethod",
                "()Ljava/lang/String;");
        mv.visitMethodInsn(INVOKESPECIAL, className, "mapMethod",
                "(Ljava/lang/String;)Lorg/sonatype/restsimple/api/ServiceDefinition$METHOD;");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, className, "mapHeaders", "()Ljava/util/Map;");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKESPECIAL, className, "mapFormParams",
                "(Ljavax/ws/rs/core/MultivaluedMap;)Ljava/util/Map;");
        mv.visitVarInsn(ALOAD, 4);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, className, "request", "Ljavax/servlet/http/HttpServletRequest;");
        mv.visitMethodInsn(INVOKEINTERFACE, "javax/servlet/http/HttpServletRequest", "getInputStream",
                "()Ljavax/servlet/ServletInputStream;");
        mv.visitVarInsn(ALOAD, 9);
        mv.visitVarInsn(ALOAD, 5);
        mv.visitMethodInsn(INVOKESPECIAL, "org/sonatype/restsimple/api/ActionContext", "<init>",
                "(Lorg/sonatype/restsimple/api/ServiceDefinition$METHOD;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/io/InputStream;Ljava/util/Map;Ljava/lang/Object;)V");
        mv.visitVarInsn(ASTORE, 10);
        mv.visitVarInsn(ALOAD, 8);
        mv.visitVarInsn(ALOAD, 10);
        mv.visitMethodInsn(INVOKEINTERFACE, "org/sonatype/restsimple/api/Action", "action",
                "(Lorg/sonatype/restsimple/api/ActionContext;)Ljava/lang/Object;");
        mv.visitVarInsn(ASTORE, 7);
        mv.visitLabel(l1);
        Label l7 = new Label();
        mv.visitJumpInsn(GOTO, l7);
        mv.visitLabel(l2);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1,
                new Object[] { "org/sonatype/restsimple/api/ActionException" });
        mv.visitVarInsn(ASTORE, 10);
        mv.visitTypeInsn(NEW, "javax/ws/rs/WebApplicationException");
        mv.visitInsn(DUP);
        mv.visitVarInsn(ALOAD, 10);
        mv.visitVarInsn(ALOAD, 10);
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/sonatype/restsimple/api/ActionException", "getStatusCode",
                "()I");
        mv.visitMethodInsn(INVOKESPECIAL, "javax/ws/rs/WebApplicationException", "<init>",
                "(Ljava/lang/Throwable;I)V");
        mv.visitInsn(ATHROW);
        mv.visitLabel(l3);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/Throwable" });
        mv.visitVarInsn(ASTORE, 10);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, className, "logger", "Lorg/slf4j/Logger;");
        mv.visitLdcInsn("invokeAction");
        mv.visitVarInsn(ALOAD, 10);
        mv.visitMethodInsn(INVOKEINTERFACE, "org/slf4j/Logger", "error",
                "(Ljava/lang/String;Ljava/lang/Throwable;)V");
        mv.visitTypeInsn(NEW, "javax/ws/rs/WebApplicationException");
        mv.visitInsn(DUP);
        mv.visitVarInsn(ALOAD, 10);
        mv.visitMethodInsn(INVOKESPECIAL, "javax/ws/rs/WebApplicationException", "<init>",
                "(Ljava/lang/Throwable;)V");
        mv.visitInsn(ATHROW);
        mv.visitLabel(l7);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitVarInsn(ALOAD, 7);
        mv.visitInsn(ARETURN);
        mv.visitMaxs(9, 12);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PRIVATE, "mapFormParams", "(Ljavax/ws/rs/core/MultivaluedMap;)Ljava/util/Map;",
                "(Ljavax/ws/rs/core/MultivaluedMap<Ljava/lang/String;Ljava/lang/String;>;)Ljava/util/Map<Ljava/lang/String;Ljava/util/Collection<Ljava/lang/String;>;>;",
                null);
        mv.visitCode();
        mv.visitTypeInsn(NEW, "java/util/HashMap");
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, "java/util/HashMap", "<init>", "()V");
        mv.visitVarInsn(ASTORE, 2);
        mv.visitVarInsn(ALOAD, 1);
        Label l0 = new Label();
        mv.visitJumpInsn(IFNULL, l0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEINTERFACE, "javax/ws/rs/core/MultivaluedMap", "keySet", "()Ljava/util/Set;");
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Set", "iterator", "()Ljava/util/Iterator;");
        mv.visitVarInsn(ASTORE, 3);
        Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitFrame(Opcodes.F_APPEND, 2, new Object[] { "java/util/Map", "java/util/Iterator" }, 0, null);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "hasNext", "()Z");
        mv.visitJumpInsn(IFEQ, l0);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;");
        mv.visitTypeInsn(CHECKCAST, "java/lang/String");
        mv.visitVarInsn(ASTORE, 4);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "get", "(Ljava/lang/Object;)Ljava/lang/Object;");
        Label l2 = new Label();
        mv.visitJumpInsn(IFNULL, l2);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "get", "(Ljava/lang/Object;)Ljava/lang/Object;");
        mv.visitTypeInsn(CHECKCAST, "java/util/Collection");
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitMethodInsn(INVOKEINTERFACE, "javax/ws/rs/core/MultivaluedMap", "get",
                "(Ljava/lang/Object;)Ljava/lang/Object;");
        mv.visitTypeInsn(CHECKCAST, "java/util/Collection");
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Collection", "addAll", "(Ljava/util/Collection;)Z");
        mv.visitInsn(POP);
        Label l3 = new Label();
        mv.visitJumpInsn(GOTO, l3);
        mv.visitLabel(l2);
        mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] { "java/lang/String" }, 0, null);
        mv.visitTypeInsn(NEW, "java/util/ArrayList");
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, "java/util/ArrayList", "<init>", "()V");
        mv.visitVarInsn(ASTORE, 5);
        mv.visitVarInsn(ALOAD, 5);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitMethodInsn(INVOKEINTERFACE, "javax/ws/rs/core/MultivaluedMap", "get",
                "(Ljava/lang/Object;)Ljava/lang/Object;");
        mv.visitTypeInsn(CHECKCAST, "java/util/Collection");
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "addAll", "(Ljava/util/Collection;)Z");
        mv.visitInsn(POP);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitVarInsn(ALOAD, 5);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "put",
                "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
        mv.visitInsn(POP);
        mv.visitLabel(l3);
        mv.visitFrame(Opcodes.F_CHOP, 1, null, 0, null);
        mv.visitJumpInsn(GOTO, l1);
        mv.visitLabel(l0);
        mv.visitFrame(Opcodes.F_CHOP, 1, null, 0, null);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitInsn(ARETURN);
        mv.visitMaxs(3, 6);
        mv.visitEnd();
    }

    {
        mv = cw.visitMethod(ACC_PRIVATE, "mapMethod",
                "(Ljava/lang/String;)Lorg/sonatype/restsimple/api/ServiceDefinition$METHOD;", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 1);
        mv.visitLdcInsn("GET");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equalsIgnoreCase", "(Ljava/lang/String;)Z");
        Label l0 = new Label();
        mv.visitJumpInsn(IFEQ, l0);
        mv.visitFieldInsn(GETSTATIC, "org/sonatype/restsimple/api/ServiceDefinition$METHOD", "GET",
                "Lorg/sonatype/restsimple/api/ServiceDefinition$METHOD;");
        mv.visitInsn(ARETURN);
        mv.visitLabel(l0);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitLdcInsn("PUT");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equalsIgnoreCase", "(Ljava/lang/String;)Z");
        Label l1 = new Label();
        mv.visitJumpInsn(IFEQ, l1);
        mv.visitFieldInsn(GETSTATIC, "org/sonatype/restsimple/api/ServiceDefinition$METHOD", "PUT",
                "Lorg/sonatype/restsimple/api/ServiceDefinition$METHOD;");
        mv.visitInsn(ARETURN);
        mv.visitLabel(l1);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitLdcInsn("POST");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equalsIgnoreCase", "(Ljava/lang/String;)Z");
        Label l2 = new Label();
        mv.visitJumpInsn(IFEQ, l2);
        mv.visitFieldInsn(GETSTATIC, "org/sonatype/restsimple/api/ServiceDefinition$METHOD", "POST",
                "Lorg/sonatype/restsimple/api/ServiceDefinition$METHOD;");
        mv.visitInsn(ARETURN);
        mv.visitLabel(l2);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitLdcInsn("DELETE");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equalsIgnoreCase", "(Ljava/lang/String;)Z");
        Label l3 = new Label();
        mv.visitJumpInsn(IFEQ, l3);
        mv.visitFieldInsn(GETSTATIC, "org/sonatype/restsimple/api/ServiceDefinition$METHOD", "DELETE",
                "Lorg/sonatype/restsimple/api/ServiceDefinition$METHOD;");
        mv.visitInsn(ARETURN);
        mv.visitLabel(l3);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitLdcInsn("HEAD");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equalsIgnoreCase", "(Ljava/lang/String;)Z");
        Label l4 = new Label();
        mv.visitJumpInsn(IFEQ, l4);
        mv.visitFieldInsn(GETSTATIC, "org/sonatype/restsimple/api/ServiceDefinition$METHOD", "HEAD",
                "Lorg/sonatype/restsimple/api/ServiceDefinition$METHOD;");
        mv.visitInsn(ARETURN);
        mv.visitLabel(l4);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        mv.visitTypeInsn(NEW, "java/lang/IllegalStateException");
        mv.visitInsn(DUP);
        mv.visitLdcInsn("Invalid Method");
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/IllegalStateException", "<init>", "(Ljava/lang/String;)V");
        mv.visitInsn(ATHROW);
        mv.visitMaxs(3, 2);
        mv.visitEnd();
    }

    {
        mv = cw.visitMethod(ACC_PRIVATE, "mapHeaders", "()Ljava/util/Map;",
                "()Ljava/util/Map<Ljava/lang/String;Ljava/util/Collection<Ljava/lang/String;>;>;", null);
        mv.visitCode();
        mv.visitTypeInsn(NEW, "java/util/HashMap");
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, "java/util/HashMap", "<init>", "()V");
        mv.visitVarInsn(ASTORE, 1);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, className, "request", "Ljavax/servlet/http/HttpServletRequest;");
        mv.visitMethodInsn(INVOKEINTERFACE, "javax/servlet/http/HttpServletRequest", "getHeaderNames",
                "()Ljava/util/Enumeration;");
        mv.visitVarInsn(ASTORE, 2);
        Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitFrame(Opcodes.F_APPEND, 2, new Object[] { "java/util/Map", "java/util/Enumeration" }, 0, null);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Enumeration", "hasMoreElements", "()Z");
        Label l1 = new Label();
        mv.visitJumpInsn(IFEQ, l1);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Enumeration", "nextElement", "()Ljava/lang/Object;");
        mv.visitTypeInsn(CHECKCAST, "java/lang/String");
        mv.visitVarInsn(ASTORE, 3);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "get", "(Ljava/lang/Object;)Ljava/lang/Object;");
        Label l2 = new Label();
        mv.visitJumpInsn(IFNULL, l2);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "get", "(Ljava/lang/Object;)Ljava/lang/Object;");
        mv.visitTypeInsn(CHECKCAST, "java/util/Collection");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, className, "request", "Ljavax/servlet/http/HttpServletRequest;");
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKEINTERFACE, "javax/servlet/http/HttpServletRequest", "getHeader",
                "(Ljava/lang/String;)Ljava/lang/String;");
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Collection", "add", "(Ljava/lang/Object;)Z");
        mv.visitInsn(POP);
        mv.visitJumpInsn(GOTO, l0);
        mv.visitLabel(l2);
        mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] { "java/lang/String" }, 0, null);
        mv.visitTypeInsn(NEW, "java/util/ArrayList");
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, "java/util/ArrayList", "<init>", "()V");
        mv.visitVarInsn(ASTORE, 4);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, className, "request", "Ljavax/servlet/http/HttpServletRequest;");
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKEINTERFACE, "javax/servlet/http/HttpServletRequest", "getHeader",
                "(Ljava/lang/String;)Ljava/lang/String;");
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "add", "(Ljava/lang/Object;)Z");
        mv.visitInsn(POP);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "put",
                "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
        mv.visitInsn(POP);
        mv.visitJumpInsn(GOTO, l0);
        mv.visitLabel(l1);
        mv.visitFrame(Opcodes.F_CHOP, 1, null, 0, null);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKESTATIC, "java/util/Collections", "unmodifiableMap",
                "(Ljava/util/Map;)Ljava/util/Map;");
        mv.visitInsn(ARETURN);
        mv.visitMaxs(3, 5);
        mv.visitEnd();
    }

    {
        mv = cw.visitMethod(ACC_PRIVATE, "mapMatrixParam", "(Ljavax/ws/rs/core/UriInfo;)Ljava/util/Map;",
                "(Ljavax/ws/rs/core/UriInfo;)Ljava/util/Map<Ljava/lang/String;Ljava/util/Collection<Ljava/lang/String;>;>;",
                null);
        mv.visitCode();
        mv.visitTypeInsn(NEW, "java/util/HashMap");
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, "java/util/HashMap", "<init>", "()V");
        mv.visitVarInsn(ASTORE, 2);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEINTERFACE, "javax/ws/rs/core/UriInfo", "getPathSegments",
                "()Ljava/util/List;");
        mv.visitVarInsn(ASTORE, 3);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "iterator", "()Ljava/util/Iterator;");
        mv.visitVarInsn(ASTORE, 4);
        Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitFrame(Opcodes.F_APPEND, 3,
                new Object[] { "java/util/Map", "java/util/List", "java/util/Iterator" }, 0, null);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "hasNext", "()Z");
        Label l1 = new Label();
        mv.visitJumpInsn(IFEQ, l1);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;");
        mv.visitTypeInsn(CHECKCAST, "javax/ws/rs/core/PathSegment");
        mv.visitVarInsn(ASTORE, 5);
        mv.visitVarInsn(ALOAD, 5);
        mv.visitMethodInsn(INVOKEINTERFACE, "javax/ws/rs/core/PathSegment", "getMatrixParameters",
                "()Ljavax/ws/rs/core/MultivaluedMap;");
        mv.visitMethodInsn(INVOKEINTERFACE, "javax/ws/rs/core/MultivaluedMap", "keySet", "()Ljava/util/Set;");
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Set", "iterator", "()Ljava/util/Iterator;");
        mv.visitVarInsn(ASTORE, 6);
        Label l2 = new Label();
        mv.visitLabel(l2);
        mv.visitFrame(Opcodes.F_APPEND, 2,
                new Object[] { "javax/ws/rs/core/PathSegment", "java/util/Iterator" }, 0, null);
        mv.visitVarInsn(ALOAD, 6);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "hasNext", "()Z");
        Label l3 = new Label();
        mv.visitJumpInsn(IFEQ, l3);
        mv.visitVarInsn(ALOAD, 6);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;");
        mv.visitTypeInsn(CHECKCAST, "java/lang/String");
        mv.visitVarInsn(ASTORE, 7);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitVarInsn(ALOAD, 7);
        mv.visitVarInsn(ALOAD, 5);
        mv.visitMethodInsn(INVOKEINTERFACE, "javax/ws/rs/core/PathSegment", "getMatrixParameters",
                "()Ljavax/ws/rs/core/MultivaluedMap;");
        mv.visitVarInsn(ALOAD, 7);
        mv.visitMethodInsn(INVOKEINTERFACE, "javax/ws/rs/core/MultivaluedMap", "get",
                "(Ljava/lang/Object;)Ljava/lang/Object;");
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "put",
                "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
        mv.visitInsn(POP);
        mv.visitJumpInsn(GOTO, l2);
        mv.visitLabel(l3);
        mv.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
        mv.visitJumpInsn(GOTO, l0);
        mv.visitLabel(l1);
        mv.visitFrame(Opcodes.F_CHOP, 1, null, 0, null);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKESTATIC, "java/util/Collections", "unmodifiableMap",
                "(Ljava/util/Map;)Ljava/util/Map;");
        mv.visitInsn(ARETURN);
        mv.visitMaxs(4, 8);
        mv.visitEnd();
    }
    cw.visitEnd();

    byte[] bytes = cw.toByteArray();

    try {
        String classToLoad = className.replace("/", ".");
        ClassLoader cl = new ByteClassloader(bytes, this.getClass().getClassLoader(), classToLoad);
        Class<?> clazz = cl.loadClass(classToLoad);

        moduleConfig.bind(clazz);
        moduleConfig.bind(GenericMessageBodyWriter.class);
        bindExtension(serviceDefinition);
    } catch (Throwable e) {
        logger.error("generate", e);
    }
}

From source file:org.spongepowered.api.util.event.factory.ClassGenerator.java

License:MIT License

/**
 * Create the event class./*from w  w w . j a va 2s .c om*/
 *
 * @param type The type
 * @param name The canonical of the generated class
 * @param parentType The parent type
 * @return The class' contents, to be loaded via a {@link ClassLoader}
 */
public byte[] createClass(final Class<?> type, final String name, final Class<?> parentType) {
    checkNotNull(type, "type");
    checkNotNull(name, "name");
    checkNotNull(parentType, "parentType");

    final ImmutableSet<? extends Property> properties = this.propertySearch.findProperties(type);
    final String internalName = name.replace('.', '/');

    final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
    cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, internalName, null, Type.getInternalName(parentType),
            new String[] { Type.getInternalName(type) });

    // Create the fields
    for (Property property : properties) {
        FieldVisitor fv = cw.visitField(ACC_PRIVATE, property.getName(), Type.getDescriptor(property.getType()),
                null, null);
        fv.visitEnd();
    }

    // Create the constructor
    {
        MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(Ljava/util/Map;)V",
                "(Ljava/util/Map<Ljava/lang/String;Ljava/lang/Object;>;)V", null);
        mv.visitCode();

        // super()
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, Type.getInternalName(parentType), "<init>", "()V", false);

        for (Property property : properties) {
            if (hasImplementation(parentType, property.getAccessor())) {
                continue;
            }

            // Object value = map.get("key")
            mv.visitVarInsn(ALOAD, 1);
            mv.visitLdcInsn(property.getName());
            mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "remove",
                    "(Ljava/lang/Object;)Ljava/lang/Object;", true);
            mv.visitVarInsn(ASTORE, 2);

            // Only if we have a null policy:
            // if (value == null) throw new NullPointerException(...)
            if (this.nullPolicy != NullPolicy.DISABLE_PRECONDITIONS) {
                boolean useNullTest = (this.nullPolicy == NullPolicy.NON_NULL_BY_DEFAULT
                        && !property.hasNullable())
                        || (this.nullPolicy == NullPolicy.NULL_BY_DEFAULT && property.hasNonnull());

                if (useNullTest && (!property.getType().isPrimitive()
                        || !this.primitivePropertyExceptions.contains(property.getName()))) {
                    Label afterNullTest = new Label();
                    mv.visitVarInsn(ALOAD, 2);
                    mv.visitJumpInsn(IFNONNULL, afterNullTest);
                    mv.visitTypeInsn(NEW, "java/lang/NullPointerException");
                    mv.visitInsn(DUP);
                    mv.visitLdcInsn(property.getName());
                    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/NullPointerException", "<init>",
                            "(Ljava/lang/String;)V", false);
                    mv.visitInsn(ATHROW);
                    mv.visitLabel(afterNullTest);
                }
            }

            Label afterPut = new Label();

            // if (value != null) {
            mv.visitVarInsn(ALOAD, 2);
            mv.visitJumpInsn(IFNULL, afterPut);

            // stack: -> this
            mv.visitVarInsn(ALOAD, 0);

            // ProperObject newValue = (ProperObject) value
            mv.visitVarInsn(ALOAD, 2);
            visitUnboxingMethod(mv, property.getType());

            // this.field = newValue
            mv.visitFieldInsn(PUTFIELD, internalName, property.getName(),
                    Type.getDescriptor(property.getType()));
            // }

            mv.visitLabel(afterPut);
        }

        // if (!map.isEmpty()) throw new IllegalArgumentException(...)
        {
            Label afterException = new Label();

            mv.visitVarInsn(ALOAD, 1);
            mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "isEmpty", "()Z", true);
            mv.visitJumpInsn(IFNE, afterException);

            mv.visitTypeInsn(NEW, "java/lang/IllegalArgumentException");
            mv.visitInsn(DUP);
            mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
            mv.visitInsn(DUP);
            mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V", false);
            mv.visitLdcInsn("Some parameters are unused: ");
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                    "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
            mv.visitVarInsn(ALOAD, 1);
            mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "keySet", "()Ljava/util/Set;", true);
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                    "(Ljava/lang/Object;)Ljava/lang/StringBuilder;", false);
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;",
                    false);
            mv.visitMethodInsn(INVOKESPECIAL, "java/lang/IllegalArgumentException", "<init>",
                    "(Ljava/lang/String;)V", false);
            mv.visitInsn(ATHROW);

            mv.visitLabel(afterException);
        }

        mv.visitInsn(RETURN);
        mv.visitMaxs(0, 0);
        mv.visitEnd();
    }

    // Create the accessors and mutators
    for (Property property : properties) {
        if (!hasImplementation(parentType, property.getAccessor())) {
            Method accessor = property.getAccessor();

            MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, accessor.getName(),
                    Type.getMethodDescriptor(accessor), null, null);
            mv.visitCode();
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, internalName, property.getName(),
                    Type.getDescriptor(property.getType()));
            mv.visitInsn(getReturnOpcode(property.getType()));
            mv.visitMaxs(0, 0);
            mv.visitEnd();
        }

        Optional<Method> mutatorOptional = property.getMutator();
        if (mutatorOptional.isPresent() && !hasImplementation(parentType, mutatorOptional.get())) {
            Method mutator = mutatorOptional.get();

            MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, mutator.getName(), Type.getMethodDescriptor(mutator),
                    null, null);
            mv.visitCode();
            mv.visitVarInsn(ALOAD, 0);
            mv.visitVarInsn(getLoadOpcode(property.getType()), 1);
            mv.visitFieldInsn(PUTFIELD, internalName, property.getName(),
                    Type.getDescriptor(property.getType()));
            mv.visitInsn(RETURN);
            mv.visitMaxs(0, 0);
            mv.visitEnd();
        }
    }

    cw.visitEnd();

    return cw.toByteArray();
}