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.jayware.e2.component.impl.generation.writer.ComponentCopyOtherMethodWriter.java

License:Open Source License

public void writeCopyOtherMethodFor(ComponentGenerationPlan componentPlan) {
    final Class<? extends Component> componentClass = componentPlan.getComponentClass();
    final ClassWriter classWriter = componentPlan.getClassWriter();

    final MethodVisitor visitor = classWriter.visitMethod(ACC_PUBLIC, "copy",
            "(" + getDescriptor(Component.class) + ")" + getDescriptor(Component.class), null, null);
    final Label endIfNotInstanceOf = new Label();
    visitor.visitCode();//from  w  w  w  .j  av  a  2  s.com
    visitor.visitVarInsn(ALOAD, 1);
    visitor.visitInsn(DUP);
    visitor.visitTypeInsn(INSTANCEOF, getInternalName(componentClass));
    visitor.visitJumpInsn(IFNE, endIfNotInstanceOf);
    visitor.visitTypeInsn(NEW, getInternalName(IllegalArgumentException.class));
    visitor.visitInsn(DUP);
    visitor.visitLdcInsn("Copy source type has to be: " + componentClass);
    visitor.visitMethodInsn(INVOKESPECIAL, getInternalName(IllegalArgumentException.class), "<init>",
            "(" + getDescriptor(String.class) + ")V", false);
    visitor.visitInsn(ATHROW);
    visitor.visitLabel(endIfNotInstanceOf);
    visitor.visitTypeInsn(CHECKCAST, getInternalName(componentClass));
    visitor.visitVarInsn(ASTORE, 2);
    for (ComponentPropertyGenerationPlan propertyPlan : componentPlan.getComponentPropertyGenerationPlans()) {
        final String propertyName = propertyPlan.getPropertyName();
        final Class<?> propertyType = propertyPlan.getPropertyType();
        final String propertyTypeDescriptor = Type.getDescriptor(propertyPlan.getPropertyType());

        visitor.visitVarInsn(ALOAD, 0);
        visitor.visitVarInsn(ALOAD, 2);
        visitor.visitMethodInsn(INVOKEINTERFACE, getInternalName(componentClass),
                propertyPlan.getPropertyGetterMethodName(), propertyPlan.getPropertyGetterMethodDescriptor(),
                true);

        final Label ifNotNull = new Label();
        final Label endIfNotNull = new Label();

        if (propertyType.isArray()) {
            visitor.visitVarInsn(ASTORE, 3);
            visitor.visitVarInsn(ALOAD, 3);
            visitor.visitJumpInsn(IFNONNULL, ifNotNull);
            visitor.visitInsn(ACONST_NULL);
            visitor.visitJumpInsn(GOTO, endIfNotNull);
            visitor.visitLabel(ifNotNull);
            visitor.visitVarInsn(ALOAD, 3);
            visitor.visitInsn(ARRAYLENGTH);

            if (propertyType.getComponentType().isPrimitive()) {
                visitor.visitIntInsn(NEWARRAY, resolveOpcodePrimitiveType(propertyType.getComponentType()));
            } else {
                visitor.visitTypeInsn(ANEWARRAY, getInternalName(propertyType.getComponentType()));
            }

            visitor.visitVarInsn(ASTORE, 4);
            final Label endForLoop = new Label();
            final Label headForLoop = new Label();
            visitor.visitInsn(ICONST_0);
            visitor.visitVarInsn(ISTORE, 5);
            visitor.visitLabel(headForLoop);
            visitor.visitVarInsn(ILOAD, 5);
            visitor.visitVarInsn(ALOAD, 3);
            visitor.visitInsn(ARRAYLENGTH);
            visitor.visitJumpInsn(IF_ICMPGE, endForLoop);
            visitor.visitVarInsn(ALOAD, 4);
            visitor.visitVarInsn(ILOAD, 5);
            visitor.visitVarInsn(ALOAD, 3);
            visitor.visitVarInsn(ILOAD, 5);
            visitor.visitInsn(getType(propertyType.getComponentType()).getOpcode(IALOAD));
            visitor.visitInsn(getType(propertyType.getComponentType()).getOpcode(IASTORE));
            visitor.visitIincInsn(5, 1);
            visitor.visitJumpInsn(GOTO, headForLoop);
            visitor.visitLabel(endForLoop);
            visitor.visitVarInsn(ALOAD, 4);
        }

        visitor.visitLabel(endIfNotNull);
        visitor.visitFieldInsn(PUTFIELD, componentPlan.getGeneratedClassInternalName(), propertyName,
                propertyTypeDescriptor);
    }
    visitor.visitVarInsn(ALOAD, 0);
    visitor.visitInsn(ARETURN);
    visitor.visitMaxs(0, 0);
    visitor.visitEnd();
}

From source file:org.jayware.e2.component.impl.generation.writer.ComponentGetMethodWriter.java

License:Open Source License

public void writeGetMethodFor(ComponentGenerationPlan componentPlan) {
    final String classInternalName = componentPlan.getGeneratedClassInternalName();
    final ClassWriter classWriter = componentPlan.getClassWriter();
    final MethodVisitor visitor = classWriter.visitMethod(ACC_PUBLIC, "get",
            "(Ljava/lang/String;)Ljava/lang/String;", null, null);

    visitor.visitCode();/*from  w w  w .j  a va 2s . c  o  m*/

    for (ComponentPropertyGenerationPlan propertyPlan : componentPlan.getComponentPropertyGenerationPlans()) {
        final String propertyName = propertyPlan.getPropertyName();
        final Class<?> propertyType = propertyPlan.getPropertyType();
        final String propertyTypeDescriptor = Type.getDescriptor(propertyPlan.getPropertyType());

        final Label endIfPropertyNameEqualsLabel = new Label();

        visitor.visitLdcInsn(propertyName);
        visitor.visitVarInsn(ALOAD, 1);
        visitor.visitMethodInsn(INVOKEVIRTUAL, getInternalName(String.class), "equals", "(Ljava/lang/Object;)Z",
                false);
        visitor.visitJumpInsn(IFEQ, endIfPropertyNameEqualsLabel);

        if (propertyType.isPrimitive()
                || propertyType.isArray() && propertyType.getComponentType().isPrimitive()) {
            if (propertyType.isArray()) {
                visitor.visitVarInsn(ALOAD, 0);
                visitor.visitFieldInsn(GETFIELD, classInternalName, propertyName, propertyTypeDescriptor);
                visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Arrays.class), "toString",
                        "(" + propertyTypeDescriptor + ")" + getDescriptor(String.class), false);
            } else {
                visitor.visitVarInsn(ALOAD, 0);
                visitor.visitFieldInsn(GETFIELD, classInternalName, propertyName, propertyTypeDescriptor);
                visitor.visitMethodInsn(INVOKESTATIC, "java/lang/String", "valueOf",
                        "(" + propertyTypeDescriptor + ")Ljava/lang/String;", false);
            }
        } else if (propertyType.isEnum()) {
            final Label ifEnumValueNonNull = new Label();
            final Label endIf = new Label();
            visitor.visitVarInsn(ALOAD, 0);
            visitor.visitFieldInsn(GETFIELD, classInternalName, propertyName, propertyTypeDescriptor);
            visitor.visitVarInsn(ASTORE, 2);
            visitor.visitVarInsn(ALOAD, 2);
            visitor.visitJumpInsn(IFNONNULL, ifEnumValueNonNull);
            visitor.visitInsn(ACONST_NULL);
            visitor.visitJumpInsn(GOTO, endIf);
            visitor.visitLabel(ifEnumValueNonNull);
            visitor.visitVarInsn(ALOAD, 2);
            visitor.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Enum.class), "name", "()Ljava/lang/String;",
                    false);
            visitor.visitLabel(endIf);
        } else if (String.class.equals(propertyType)) {
            visitor.visitVarInsn(ALOAD, 0);
            visitor.visitFieldInsn(GETFIELD, classInternalName, propertyName, propertyTypeDescriptor);
        } else if (!propertyType.isPrimitive()
                || propertyType.isArray() && !propertyType.getComponentType().isPrimitive()) {
            final Label endIfAdapterNull = new Label();
            visitor.visitVarInsn(ALOAD, 0);
            visitor.visitFieldInsn(GETFIELD, getInternalName(AbstractComponent.class), "myComponentManager",
                    getDescriptor(ComponentManager.class));
            visitor.visitVarInsn(ALOAD, 0);
            visitor.visitFieldInsn(GETFIELD, getInternalName(AbstractComponent.class), "myContext",
                    getDescriptor(Context.class));
            visitor.visitLdcInsn(getType(propertyType));
            visitor.visitMethodInsn(INVOKEINTERFACE, getInternalName(ComponentManager.class),
                    "getPropertyAdapter", "(" + getDescriptor(Context.class) + getDescriptor(Class.class) + ")"
                            + getDescriptor(ComponentPropertyAdapter.class),
                    true);
            visitor.visitVarInsn(ASTORE, 2);
            visitor.visitVarInsn(ALOAD, 2);
            visitor.visitJumpInsn(IFNONNULL, endIfAdapterNull);
            visitor.visitTypeInsn(NEW, getInternalName(ComponentMarshalException.class));
            visitor.visitInsn(DUP);
            visitor.visitLdcInsn("No property adapter found for property '" + propertyName + "' of type '"
                    + propertyType.getName() + "'");
            visitor.visitMethodInsn(INVOKESPECIAL, getInternalName(ComponentMarshalException.class), "<init>",
                    "(" + getDescriptor(String.class) + ")V", false);
            visitor.visitInsn(ATHROW);
            visitor.visitLabel(endIfAdapterNull);
            visitor.visitVarInsn(ALOAD, 2);
            visitor.visitVarInsn(ALOAD, 0);
            visitor.visitFieldInsn(GETFIELD, getInternalName(AbstractComponent.class), "myContext",
                    getDescriptor(Context.class));
            visitor.visitVarInsn(ALOAD, 0);
            visitor.visitFieldInsn(GETFIELD, classInternalName, propertyName, propertyTypeDescriptor);
            visitor.visitMethodInsn(INVOKEINTERFACE, getInternalName(ComponentPropertyAdapter.class), "marshal",
                    "(" + getDescriptor(Context.class) + getDescriptor(Object.class) + ")"
                            + getDescriptor(String.class),
                    true);
        } else {
            throw new ComponentFactoryException();
        }

        visitor.visitInsn(ARETURN);
        visitor.visitLabel(endIfPropertyNameEqualsLabel);
    }

    visitor.visitInsn(ACONST_NULL);
    visitor.visitInsn(ARETURN);
    visitor.visitMaxs(0, 0);
    visitor.visitEnd();
}

From source file:org.jayware.e2.component.impl.generation.writer.ComponentSetMethodWriter.java

License:Open Source License

public void writeSetMethodFor(ComponentGenerationPlan componentPlan) {
    final String classInternalName = componentPlan.getGeneratedClassInternalName();
    final ClassWriter classWriter = componentPlan.getClassWriter();

    final MethodVisitor visitor = classWriter.visitMethod(ACC_PUBLIC, "set",
            "(Ljava/lang/String;Ljava/lang/String;)Z", null, null);
    visitor.visitCode();//from   w w  w  .  j  a va2s.  co  m

    for (ComponentPropertyGenerationPlan propertyPlan : componentPlan.getComponentPropertyGenerationPlans()) {
        final String propertyName = propertyPlan.getPropertyName();
        final Class<?> propertyType = propertyPlan.getPropertyType();

        final Label endIfPropertyNameEqualsLabel = new Label();

        visitor.visitLdcInsn(propertyName);
        visitor.visitVarInsn(ALOAD, 1);
        visitor.visitMethodInsn(INVOKEVIRTUAL, getInternalName(String.class), "equals", "(Ljava/lang/Object;)Z",
                false);
        visitor.visitJumpInsn(IFEQ, endIfPropertyNameEqualsLabel);
        visitor.visitVarInsn(ALOAD, 0);

        if (propertyType.isPrimitive()
                || propertyType.isArray() && propertyType.getComponentType().isPrimitive()) {
            if (!propertyType.isArray()) {
                visitor.visitVarInsn(ALOAD, 2);

                if (boolean.class.equals(propertyType)) {
                    visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Boolean.class), "parseBoolean",
                            "(Ljava/lang/String;)Z", false);
                } else if (byte.class.equals(propertyType)) {
                    visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Byte.class), "parseByte",
                            "(Ljava/lang/String;)B", false);
                } else if (short.class.equals(propertyType)) {
                    visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Short.class), "parseShort",
                            "(Ljava/lang/String;)S", false);
                } else if (int.class.equals(propertyType)) {
                    visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Integer.class), "parseInt",
                            "(Ljava/lang/String;)I", false);
                } else if (float.class.equals(propertyType)) {
                    visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Float.class), "parseFloat",
                            "(Ljava/lang/String;)F", false);
                } else if (double.class.equals(propertyType)) {
                    visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Double.class), "parseDouble",
                            "(Ljava/lang/String;)D", false);
                }
            } else {
                visitor.visitVarInsn(ALOAD, 2);
                visitor.visitInsn(ICONST_1);
                visitor.visitVarInsn(ALOAD, 2);
                visitor.visitMethodInsn(INVOKEVIRTUAL, getInternalName(String.class), "length", "()I", false);
                visitor.visitInsn(ICONST_1);
                visitor.visitInsn(ISUB);
                visitor.visitMethodInsn(INVOKEVIRTUAL, getInternalName(String.class), "substring",
                        "(II)" + getDescriptor(String.class), false);
                visitor.visitVarInsn(ASTORE, 2);
                visitor.visitVarInsn(ALOAD, 2);
                visitor.visitLdcInsn(", ");
                visitor.visitMethodInsn(INVOKEVIRTUAL, getInternalName(String.class), "split",
                        "(" + getDescriptor(String.class) + ")[" + getDescriptor(String.class), false);
                visitor.visitVarInsn(ASTORE, 3);
                visitor.visitVarInsn(ALOAD, 3);
                visitor.visitInsn(ARRAYLENGTH);
                visitor.visitIntInsn(NEWARRAY, resolveOpcodePrimitiveType(propertyType.getComponentType()));
                visitor.visitVarInsn(ASTORE, 4);
                final Label endForLoop = new Label();
                final Label headForLoop = new Label();
                visitor.visitInsn(ICONST_0);
                visitor.visitVarInsn(ISTORE, 5);
                visitor.visitLabel(headForLoop);
                visitor.visitVarInsn(ILOAD, 5);
                visitor.visitVarInsn(ALOAD, 3);
                visitor.visitInsn(ARRAYLENGTH);
                visitor.visitJumpInsn(IF_ICMPGE, endForLoop);
                visitor.visitVarInsn(ALOAD, 4);
                visitor.visitVarInsn(ILOAD, 5);
                visitor.visitVarInsn(ALOAD, 3);
                visitor.visitVarInsn(ILOAD, 5);
                visitor.visitInsn(AALOAD);

                if (boolean.class.equals(propertyType.getComponentType())) {
                    visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Boolean.class), "parseBoolean",
                            "(Ljava/lang/String;)Z", false);
                } else if (byte.class.equals(propertyType.getComponentType())) {
                    visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Byte.class), "parseByte",
                            "(Ljava/lang/String;)B", false);
                } else if (short.class.equals(propertyType.getComponentType())) {
                    visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Short.class), "parseShort",
                            "(Ljava/lang/String;)S", false);
                } else if (int.class.equals(propertyType.getComponentType())) {
                    visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Integer.class), "parseInt",
                            "(Ljava/lang/String;)I", false);
                } else if (float.class.equals(propertyType.getComponentType())) {
                    visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Float.class), "parseFloat",
                            "(Ljava/lang/String;)F", false);
                } else if (double.class.equals(propertyType.getComponentType())) {
                    visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Double.class), "parseDouble",
                            "(Ljava/lang/String;)D", false);
                }

                visitor.visitInsn(getType(propertyType.getComponentType()).getOpcode(IASTORE));

                visitor.visitIincInsn(5, 1);
                visitor.visitJumpInsn(GOTO, headForLoop);
                visitor.visitLabel(endForLoop);
                visitor.visitVarInsn(ALOAD, 4);
            }
        } else if (propertyType.isEnum()) {
            final Label ifEnumValueNonNull = new Label();
            final Label endIf = new Label();
            visitor.visitVarInsn(ALOAD, 2);
            visitor.visitJumpInsn(IFNONNULL, ifEnumValueNonNull);
            visitor.visitInsn(ACONST_NULL);
            visitor.visitJumpInsn(GOTO, endIf);
            visitor.visitLabel(ifEnumValueNonNull);
            visitor.visitLdcInsn(getType(propertyType));
            visitor.visitVarInsn(ALOAD, 2);
            visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Enum.class), "valueOf",
                    "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;", false);
            visitor.visitTypeInsn(CHECKCAST, getInternalName(propertyType));
            visitor.visitLabel(endIf);
        } else if (String.class.equals(propertyType)) {
            visitor.visitVarInsn(ALOAD, 2);
        } else if (!propertyType.isPrimitive()
                || propertyType.isArray() && !propertyType.getComponentType().isPrimitive()) {
            final Label endIfAdapterNull = new Label();
            visitor.visitVarInsn(ALOAD, 0);
            visitor.visitFieldInsn(GETFIELD, getInternalName(AbstractComponent.class), "myComponentManager",
                    getDescriptor(ComponentManager.class));
            visitor.visitVarInsn(ALOAD, 0);
            visitor.visitFieldInsn(GETFIELD, getInternalName(AbstractComponent.class), "myContext",
                    getDescriptor(Context.class));
            visitor.visitLdcInsn(getType(propertyType));
            visitor.visitMethodInsn(INVOKEINTERFACE, getInternalName(ComponentManager.class),
                    "getPropertyAdapter", "(" + getDescriptor(Context.class) + getDescriptor(Class.class) + ")"
                            + getDescriptor(ComponentPropertyAdapter.class),
                    true);
            visitor.visitVarInsn(ASTORE, 3);
            visitor.visitVarInsn(ALOAD, 3);
            visitor.visitJumpInsn(IFNONNULL, endIfAdapterNull);
            visitor.visitTypeInsn(NEW, getInternalName(ComponentUnmarshalException.class));
            visitor.visitInsn(DUP);
            visitor.visitLdcInsn("No property adapter found for property '" + propertyName + "' of type '"
                    + propertyType.getName() + "'");
            visitor.visitMethodInsn(INVOKESPECIAL, getInternalName(ComponentUnmarshalException.class), "<init>",
                    "(" + getDescriptor(String.class) + ")V", false);
            visitor.visitInsn(ATHROW);
            visitor.visitLabel(endIfAdapterNull);
            visitor.visitVarInsn(ALOAD, 3);
            visitor.visitVarInsn(ALOAD, 0);
            visitor.visitFieldInsn(GETFIELD, getInternalName(AbstractComponent.class), "myContext",
                    getDescriptor(Context.class));
            visitor.visitVarInsn(ALOAD, 2);
            visitor.visitMethodInsn(INVOKEINTERFACE, getInternalName(ComponentPropertyAdapter.class),
                    "unmarshal", "(" + getDescriptor(Context.class) + getDescriptor(String.class) + ")"
                            + getDescriptor(Object.class),
                    true);
            visitor.visitTypeInsn(CHECKCAST, getType(propertyType).getInternalName());
        } else {
            throw new ComponentFactoryException();
        }

        visitor.visitFieldInsn(PUTFIELD, classInternalName, propertyName,
                Type.getDescriptor(propertyPlan.getPropertyType()));
        visitor.visitInsn(ICONST_1);
        visitor.visitInsn(IRETURN);
        visitor.visitLabel(endIfPropertyNameEqualsLabel);
    }

    visitor.visitInsn(ICONST_0);
    visitor.visitInsn(IRETURN);
    visitor.visitMaxs(0, 0);
    visitor.visitEnd();
}

From source file:org.jayware.e2.event.impl.EventDispatcherFactoryImpl.java

License:Open Source License

private void createEventDispatcher(TargetDescriptor targetDescriptor) {
    final ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
    final Class<?> target = targetDescriptor.target;
    final String className = createDispatcherName(target);
    final String classInternalName = className.replace('.', '/');
    final String classFileName = classInternalName + ".class";
    final File classFile = new File(myOutputDirectory, classFileName);

    classWriter.visit(V1_8, ACC_PUBLIC + ACC_SUPER, classInternalName, null, getInternalName(Object.class),
            new String[] { getInternalName(EventDispatcher.class) });

    {/*  www.  j  a v a  2s . c o m*/
        final FieldVisitor fv = classWriter.visitField(ACC_PUBLIC + ACC_STATIC + ACC_FINAL, "log",
                getDescriptor(Logger.class), null, null);
    }

    { // <static>
        final MethodVisitor mv = classWriter.visitMethod(ACC_PUBLIC + ACC_STATIC, "<clinit>", "()V", null,
                null);
        mv.visitCode();
        mv.visitLdcInsn(getType(EventDispatcher.class));
        mv.visitMethodInsn(INVOKESTATIC, getInternalName(LoggerFactory.class), "getLogger",
                "(Ljava/lang/Class;)" + getDescriptor(Logger.class), false);
        mv.visitFieldInsn(PUTSTATIC, classInternalName, "log", getDescriptor(Logger.class));
        mv.visitInsn(RETURN);
        mv.visitMaxs(0, 0);
        mv.visitEnd();
    }

    { // Constructor
        final MethodVisitor mv = classWriter.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, getInternalName(Object.class), "<init>", "()V", false);
        mv.visitInsn(RETURN);
        mv.visitMaxs(0, 0);
        mv.visitEnd();
    }

    { // dispatch
        final MethodVisitor mv = classWriter.visitMethod(ACC_PUBLIC, "dispatch",
                "(" + getDescriptor(Event.class) + getDescriptor(Object.class) + ")V", null, null);
        final Label endMethod = new Label();

        mv.visitCode();

        // Is this a suitable dispatcher for the passed target? Sub-classes are
        // not allowed, therefore check the passed target's class for equality.
        mv.visitLdcInsn(targetDescriptor.getTargetType());
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Object.class), "getClass", "()Ljava/lang/Class;",
                false);
        mv.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Class.class), "equals", "(Ljava/lang/Object;)Z",
                false);
        mv.visitJumpInsn(IFEQ, endMethod);

        // Yeah...the right target...let's cast!
        mv.visitVarInsn(ALOAD, 2);
        mv.visitTypeInsn(CHECKCAST, targetDescriptor.getTargetInternalName());
        mv.visitVarInsn(ASTORE, 3);

        for (Class<? extends EventType> eventType : targetDescriptor.getEventTypeSet()) {
            final Label endEvenType = new Label();

            // Does the event match an event-type one of the handlers is interested?
            mv.visitVarInsn(ALOAD, 1);
            mv.visitLdcInsn(getType(eventType));
            mv.visitMethodInsn(INVOKEINTERFACE, getInternalName(Event.class), "matches", "(Ljava/lang/Class;)Z",
                    true);
            mv.visitJumpInsn(IFEQ, endEvenType);

            for (HandlerDescriptor descriptor : targetDescriptor.eventTypeHandlerDescriptorMap.get(eventType)) {
                final Label endHandler = new Label();

                // Required and conditional parameters have to be present
                for (HandlerDescriptor.ParameterDescriptor parameter : descriptor.getParameters()) {
                    if (!parameter.isEventParameter()) {
                        if (parameter.presence == Presence.Required
                                || parameter.presence == Presence.Conditional) {
                            final Label parameterNotPresent = new Label();
                            mv.visitVarInsn(ALOAD, 1);
                            mv.visitLdcInsn(parameter.getName());
                            mv.visitMethodInsn(INVOKEINTERFACE, getInternalName(Event.class), "hasParameter",
                                    "(Ljava/lang/String;)Z", true);
                            mv.visitJumpInsn(IFNE, parameterNotPresent);
                            mv.visitFieldInsn(GETSTATIC, classInternalName, "log", getDescriptor(Logger.class));
                            mv.visitLdcInsn("Could not dispatch '" + eventType.getName() + "' to "
                                    + descriptor.getMethod() + "', because the event does not provide the "
                                    + parameter.getPresence().toString().toLowerCase() + " parameter '"
                                    + parameter.getName() + "'!");
                            mv.visitMethodInsn(INVOKEINTERFACE, getInternalName(Logger.class), "error",
                                    "(Ljava/lang/String;)V", true);
                            mv.visitJumpInsn(GOTO, endHandler);
                            mv.visitLabel(parameterNotPresent);
                        }
                    }
                }

                final int startIndex = 4;
                int index = startIndex;
                for (HandlerDescriptor.ParameterDescriptor parameter : descriptor.getParameters()) {
                    final Class parameterType = parameter.getParameterClass();

                    if (!parameter.isEventParameter()) {
                        final Label endInstanceOf = new Label();

                        // Extract the parameter from the event and store it to a variable.
                        mv.visitVarInsn(ALOAD, 1);
                        mv.visitLdcInsn(parameter.getName());
                        mv.visitMethodInsn(INVOKEINTERFACE, getInternalName(Event.class), "getParameter",
                                "(Ljava/lang/String;)Ljava/lang/Object;", true);
                        mv.visitVarInsn(ASTORE, index);

                        // A required parameter mustn't be null ...
                        if (parameter.presence == Presence.Required) {
                            final Label notNull = new Label();
                            mv.visitVarInsn(ALOAD, index);
                            mv.visitJumpInsn(IFNONNULL, notNull);
                            mv.visitFieldInsn(GETSTATIC, classInternalName, "log", getDescriptor(Logger.class));
                            mv.visitLdcInsn("Could not dispatch '" + eventType.getName() + "' to "
                                    + descriptor.getMethod() + "', because the "
                                    + Presence.Required.toString().toLowerCase() + " parameter '"
                                    + parameter.getName() + "' was null!");
                            mv.visitMethodInsn(INVOKEINTERFACE, getInternalName(Logger.class), "error",
                                    "(Ljava/lang/String;)V", true);
                            mv.visitJumpInsn(GOTO, endHandler);
                            mv.visitLabel(notNull);
                        } else
                        // ...but instanceof-check is bad if the parameter is null
                        // which is legal for conditional and optional parameters.
                        {
                            mv.visitVarInsn(ALOAD, index);
                            mv.visitJumpInsn(IFNULL, endInstanceOf);
                        }

                        // Check the type of the parameter (only if it is not null)
                        // whether it matches the declared parameter type of the handler.
                        mv.visitVarInsn(ALOAD, index);

                        Class appropriateType = parameterType;

                        if (parameterType.isPrimitive()) {
                            if (boolean.class.equals(parameterType)) {
                                appropriateType = Boolean.class;
                            } else if (byte.class.equals(parameterType)) {
                                appropriateType = Byte.class;
                            } else if (short.class.equals(parameterType)) {
                                appropriateType = Short.class;
                            } else if (int.class.equals(parameterType)) {
                                appropriateType = Integer.class;
                            } else if (long.class.equals(parameterType)) {
                                appropriateType = Long.class;
                            } else if (float.class.equals(parameterType)) {
                                appropriateType = Float.class;
                            } else if (double.class.equals(parameterType)) {
                                appropriateType = Double.class;
                            }
                        }

                        mv.visitTypeInsn(INSTANCEOF, getInternalName(appropriateType));
                        mv.visitJumpInsn(IFNE, endInstanceOf);
                        mv.visitFieldInsn(GETSTATIC, classInternalName, "log", getDescriptor(Logger.class));
                        mv.visitLdcInsn("Could not dispatch '" + eventType.getName() + "' to "
                                + descriptor.getMethod() + "', because the parameter '" + parameter.getName()
                                + "' cannot be cast to the appropriate type '" + parameterType.getName()
                                + "'!");
                        mv.visitMethodInsn(INVOKEINTERFACE, getInternalName(Logger.class), "error",
                                "(Ljava/lang/String;)V", true);
                        mv.visitJumpInsn(GOTO, endHandler);
                        mv.visitLabel(endInstanceOf);

                        ++index;
                    }
                }

                mv.visitVarInsn(ALOAD, 3);

                // Load and cast all necessary parameters.
                index = startIndex;
                for (HandlerDescriptor.ParameterDescriptor parameter : descriptor.getParameters()) {
                    final Class parameterType = parameter.getParameterClass();

                    if (parameter.isEventParameter()) {
                        mv.visitVarInsn(ALOAD, 1);
                    } else {
                        mv.visitVarInsn(ALOAD, index++);

                        if (parameterType.isPrimitive()) {
                            if (boolean.class.equals(parameterType)) {
                                mv.visitTypeInsn(CHECKCAST, getInternalName(Boolean.class));
                                mv.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Boolean.class),
                                        "booleanValue", "()Z", false);
                            } else if (byte.class.equals(parameterType)) {
                                mv.visitTypeInsn(CHECKCAST, getInternalName(Byte.class));
                                mv.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Byte.class), "byteValue",
                                        "()B", false);
                            } else if (short.class.equals(parameterType)) {
                                mv.visitTypeInsn(CHECKCAST, getInternalName(Short.class));
                                mv.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Short.class), "shortValue",
                                        "()S", false);
                            } else if (int.class.equals(parameterType)) {
                                mv.visitTypeInsn(CHECKCAST, getInternalName(Integer.class));
                                mv.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Integer.class), "intValue",
                                        "()I", false);
                            } else if (long.class.equals(parameterType)) {
                                mv.visitTypeInsn(CHECKCAST, getInternalName(Long.class));
                                mv.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Long.class), "longValue",
                                        "()J", false);
                            } else if (float.class.equals(parameterType)) {
                                mv.visitTypeInsn(CHECKCAST, getInternalName(Float.class));
                                mv.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Float.class), "floatValue",
                                        "()F", false);
                            } else if (double.class.equals(parameterType)) {
                                mv.visitTypeInsn(CHECKCAST, getInternalName(Double.class));
                                mv.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Double.class), "doubleValue",
                                        "()D", false);
                            }
                        } else {
                            mv.visitTypeInsn(CHECKCAST, parameter.getParameterInternalName());
                        }
                    }
                }

                // At last call the handler.
                mv.visitMethodInsn(INVOKEVIRTUAL, targetDescriptor.getTargetInternalName(),
                        descriptor.getMethodName(), descriptor.getMethodDescriptor(), false);

                mv.visitLabel(endHandler);
            }

            mv.visitLabel(endEvenType);
        }

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

    { // accepts
        final MethodVisitor mv = classWriter.visitMethod(ACC_PUBLIC, "accepts", "(Ljava/lang/Class;)Z", null,
                null);
        mv.visitCode();
        for (Class<?> eventType : targetDescriptor.getEventTypeSet()) {
            final Label endIf = new Label();
            mv.visitLdcInsn(getType(eventType));
            mv.visitVarInsn(ALOAD, 1);
            mv.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Class.class), "isAssignableFrom",
                    "(Ljava/lang/Class;)Z", false);
            mv.visitJumpInsn(IFEQ, endIf);
            mv.visitInsn(ICONST_1);
            mv.visitInsn(IRETURN);
            mv.visitLabel(endIf);
        }
        mv.visitInsn(ICONST_0);
        mv.visitInsn(IRETURN);
        mv.visitMaxs(0, 0);
        mv.visitEnd();
    }

    try {
        final File parentFile = classFile.getParentFile();

        if (!parentFile.exists()) {
            if (!parentFile.mkdirs()) {
                throw new IOException("Failed to create output directory: " + parentFile.getAbsolutePath());
            }
        }

        DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream(classFile));
        dataOutputStream.write(classWriter.toByteArray());
        dataOutputStream.flush();
        dataOutputStream.close();
    } catch (IOException e) {
        log.error("Saving dispatcher class failed!", e);
    }

    try {
        Class<? extends EventDispatcher> eventDispatcherClass = (Class<? extends EventDispatcher>) new URLClassLoader(
                new URL[] { myOutputDirectory.toURI().toURL() }, getClass().getClassLoader())
                        .loadClass(className);
        targetDescriptor.eventDispatcher = eventDispatcherClass.newInstance();

        log.info("Created EventDispatcher for: '{}'. EventDispatcher class stored in: '{}' ", target,
                classFile.getAbsolutePath());
    } catch (ClassNotFoundException | MalformedURLException | InstantiationException
            | IllegalAccessException e) {
        e.printStackTrace();
    }
}

From source file:org.jboss.byteman.agent.JigsawAccessEnablerGenerator.java

License:Open Source License

public static byte[] getJigsawAccessEnablerClassBytes() {
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
    FieldVisitor fv;/*from   w  w  w .ja  va  2 s  .co  m*/
    MethodVisitor mv;

    // package org/jboss/byteman/jigsaw;
    // public class JigsawAccessEnabler implements AccessEnabler { ... }
    cw.visit(V9, ACC_PUBLIC + ACC_SUPER, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", null,
            "java/lang/Object", new String[] { "org/jboss/byteman/agent/AccessEnabler" });

    cw.visitSource("JigsawAccessEnabler.java", null);

    // this is here because we use String + String
    cw.visitInnerClass("java/lang/invoke/MethodHandles$Lookup", "java/lang/invoke/MethodHandles", "Lookup",
            ACC_PUBLIC + ACC_FINAL + ACC_STATIC);

    {
        // private Module THIS_MODULE = this.getClass().getModule();
        fv = cw.visitField(ACC_PRIVATE, "THIS_MODULE", "Ljava/lang/Module;", null, null);
        fv.visitEnd();
    }
    {
        // private Module UNPRIVILEGED_MODULE = AccessEnabler.class.getModule();
        fv = cw.visitField(ACC_PRIVATE, "UNPRIVILEGED_MODULE", "Ljava/lang/Module;", null, null);
        fv.visitEnd();
    }
    {
        // private Set<Module> THIS_MODULE_SET = Set.of(THIS_MODULE);
        fv = cw.visitField(ACC_PRIVATE, "THIS_MODULE_SET", "Ljava/util/Set;",
                "Ljava/util/Set<Ljava/lang/Module;>;", null);
        fv.visitEnd();
    }
    {
        // private Set<Module> EMPTY_READS_SET = Set.of();
        fv = cw.visitField(ACC_PRIVATE, "EMPTY_READS_SET", "Ljava/util/Set;",
                "Ljava/util/Set<Ljava/lang/Module;>;", null);
        fv.visitEnd();
    }
    {
        //  private Map<String,<Set<Module>> EMPTY_EXPORTS_MAP = Map.of();
        fv = cw.visitField(ACC_PRIVATE, "EMPTY_EXPORTS_MAP", "Ljava/util/Map;",
                "Ljava/util/Map<Ljava/lang/String;Ljava/util/Set<Ljava/lang/Module;>;>;", null);
        fv.visitEnd();
    }
    {
        //  private Map<String,<Set<Module>> EMPTY_OPENS_MAP = Map.of();
        fv = cw.visitField(ACC_PRIVATE, "EMPTY_OPENS_MAP", "Ljava/util/Map;",
                "Ljava/util/Map<Ljava/lang/String;Ljava/util/Set<Ljava/lang/Module;>;>;", null);
        fv.visitEnd();
    }
    {
        // private Set<Class<?>> EMPTY_USES_SET = Set.of()
        fv = cw.visitField(ACC_PRIVATE, "EMPTY_USES_SET", "Ljava/util/Set;",
                "Ljava/util/Set<Ljava/lang/Class<*>;>;", null);
        fv.visitEnd();
    }
    {
        // private Map<Class<?>,List<Class?>>> EMPTY_PROVIDES_MAP = Map.of();
        fv = cw.visitField(ACC_PRIVATE, "EMPTY_PROVIDES_MAP", "Ljava/util/Map;",
                "Ljava/util/Map<Ljava/lang/Class<*>;Ljava/util/List<Ljava/lang/Class<*>;>;>;", null);
        fv.visitEnd();
    }
    {
        //  private Instrumentation inst;
        fv = cw.visitField(ACC_PRIVATE, "inst", "Ljava/lang/instrument/Instrumentation;", null, null);
        fv.visitEnd();
    }
    {
        // private Lookup theLookup;
        fv = cw.visitField(ACC_PRIVATE, "theLookup", "Ljava/lang/invoke/MethodHandles$Lookup;", null, null);
        fv.visitEnd();
    }
    {
        // private DefaultAccessEnabler defaultAccessEnabler;
        fv = cw.visitField(ACC_PRIVATE, "defaultAccessEnabler",
                "Lorg/jboss/byteman/agent/DefaultAccessEnabler;", null, null);
        fv.visitEnd();
    }
    {
        // public JigsawAccessEnabler(Instrumentation inst)   {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(Ljava/lang/instrument/Instrumentation;)V", null, null);
        mv.visitCode();
        Label l0 = new Label();
        Label l1 = new Label();
        Label l2 = new Label();
        mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Exception");
        // super()
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
        // this.THIS_MODULE = this.getClass().getModule();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getModule", "()Ljava/lang/Module;", false);
        mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE",
                "Ljava/lang/Module;");
        // this.UNPRIVILEGED_MODULE = AccessEnabler.class.getModule();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitLdcInsn(Type.getType("Lorg/jboss/byteman/agent/AccessEnabler;"));
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getModule", "()Ljava/lang/Module;", false);
        mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "UNPRIVILEGED_MODULE",
                "Ljava/lang/Module;");
        // this.THIS_MODULE_SET = Set.of(this.THIS_MODULE);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE",
                "Ljava/lang/Module;");
        mv.visitMethodInsn(INVOKESTATIC, "java/util/Set", "of", "(Ljava/lang/Object;)Ljava/util/Set;", true);
        mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE_SET",
                "Ljava/util/Set;");
        // this.EMPTY_READS_SET = Set.of();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESTATIC, "java/util/Set", "of", "()Ljava/util/Set;", true);
        mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_READS_SET",
                "Ljava/util/Set;");
        // this.EMPTY_EXPORTS_MAP = Map.of();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESTATIC, "java/util/Map", "of", "()Ljava/util/Map;", true);
        mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_EXPORTS_MAP",
                "Ljava/util/Map;");
        // this.EMPTY_OPENS_MAP = Map.of();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESTATIC, "java/util/Map", "of", "()Ljava/util/Map;", true);
        mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_OPENS_MAP",
                "Ljava/util/Map;");
        // this.EMPTY_USES_SET = Set.of()
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESTATIC, "java/util/Set", "of", "()Ljava/util/Set;", true);
        mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_USES_SET",
                "Ljava/util/Set;");
        // this.EMPTY_PROVIDES_MAP = Map.of();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESTATIC, "java/util/Map", "of", "()Ljava/util/Map;", true);
        mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_PROVIDES_MAP",
                "Ljava/util/Map;");
        // if this.THIS_MODULE.isnamed()
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE",
                "Ljava/lang/Module;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "isNamed", "()Z", false);
        Label l3 = new Label();
        mv.visitJumpInsn(IFNE, l3);
        // {
        //   throw NEW RuntimeException("JigsawAccessEnabler : can only enable Jigsaw access from a named module not " + THIS_MODULE);
        mv.visitTypeInsn(NEW, "java/lang/RuntimeException");
        mv.visitInsn(DUP);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE",
                "Ljava/lang/Module;");
        mv.visitInvokeDynamicInsn("makeConcatWithConstants", "(Ljava/lang/Module;)Ljava/lang/String;",
                new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/StringConcatFactory",
                        "makeConcatWithConstants",
                        "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;"),
                new Object[] {
                        "JigsawAccessEnabler : can only enable Jigsaw access from a named module not \u0001" });
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/String;)V",
                false);
        mv.visitInsn(ATHROW);
        // }
        mv.visitLabel(l3);
        // if (inst == null)
        mv.visitVarInsn(ALOAD, 1);
        Label l4 = new Label();
        mv.visitJumpInsn(IFNONNULL, l4);
        // {
        //   throw New RuntimeException("JigsawAccessEnabler : can only be created if passed a real Instrumentation handle");
        mv.visitTypeInsn(NEW, "java/lang/RuntimeException");
        mv.visitInsn(DUP);
        mv.visitLdcInsn("JigsawAccessEnabler : can only be created if passed a real Instrumentation handle");
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/String;)V",
                false);
        mv.visitInsn(ATHROW);
        // }
        mv.visitLabel(l4);
        // this.inst = inst;
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "inst",
                "Ljava/lang/instrument/Instrumentation;");
        // try {
        mv.visitLabel(l0);
        // this.theLookup = MethodHandles.lookup();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodHandles", "lookup",
                "()Ljava/lang/invoke/MethodHandles$Lookup;", false);
        mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "theLookup",
                "Ljava/lang/invoke/MethodHandles$Lookup;");
        mv.visitLabel(l1);
        Label l5 = new Label();
        mv.visitJumpInsn(GOTO, l5);
        // } (catch Exception) {
        mv.visitLabel(l2);
        mv.visitVarInsn(ASTORE, 2);
        // throw new RuntimeException("JigsawAccessEnabler : cannot access Lookup.IMPL_LOOKUP", e);
        mv.visitTypeInsn(NEW, "java/lang/RuntimeException");
        mv.visitInsn(DUP);
        mv.visitLdcInsn("JigsawAccessEnabler : cannot obtain lookup from Byteman module");
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>",
                "(Ljava/lang/String;Ljava/lang/Throwable;)V", false);
        mv.visitInsn(ATHROW);
        // }
        mv.visitLabel(l5);
        // defaultAccessEnabler = new DefaultAccessEnabler();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitTypeInsn(NEW, "org/jboss/byteman/agent/DefaultAccessEnabler");
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/agent/DefaultAccessEnabler", "<init>", "()V",
                false);
        mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "defaultAccessEnabler",
                "Lorg/jboss/byteman/agent/DefaultAccessEnabler;");
        if (DEBUG) {
            // debug("created JigsawAccessEnabler")
            mv.visitVarInsn(ALOAD, 0);
            mv.visitInsn(ICONST_1);
            mv.visitTypeInsn(ANEWARRAY, "java/lang/String");
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_0);
            mv.visitLdcInsn("created JigsawAccessEnabler");
            mv.visitInsn(AASTORE);
            mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug",
                    "([Ljava/lang/String;)V", false);
        }
        // return
        mv.visitInsn(RETURN);
        // }
        mv.visitMaxs(5, 3);
        mv.visitEnd();
    }
    {
        // public boolean requiresAccess(Class<?> klazz)
        mv = cw.visitMethod(ACC_PUBLIC, "requiresAccess", "(Ljava/lang/Class;)Z", "(Ljava/lang/Class<*>;)Z",
                null);
        mv.visitCode();
        Label l0 = new Label();
        Label l1 = new Label();
        Label l2 = new Label();
        mv.visitTryCatchBlock(l0, l1, l2, "java/lang/SecurityException");
        // debug("JigsawAccessEnabler.requiresAccess( klazz == " + klazz.getName() + ")");
        if (DEBUG) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitInsn(ICONST_3);
            mv.visitTypeInsn(ANEWARRAY, "java/lang/String");
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_0);
            mv.visitLdcInsn("JigsawAccessEnabler.requiresAccess( klazz == ");
            mv.visitInsn(AASTORE);
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_1);
            mv.visitVarInsn(ALOAD, 1);
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;", false);
            mv.visitInsn(AASTORE);
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_2);
            mv.visitLdcInsn(")");
            mv.visitInsn(AASTORE);
            mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug",
                    "([Ljava/lang/String;)V", false);
        }
        Label l3 = new Label();
        mv.visitLabel(l3);
        // while (Modifier.isPublic(klazz.getModifiers()))
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getModifiers", "()I", false);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/reflect/Modifier", "isPublic", "(I)Z", false);
        Label l4 = new Label();
        mv.visitJumpInsn(IFEQ, l4);
        // {
        //   Module module = klazz.getModule();
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getModule", "()Ljava/lang/Module;", false);
        mv.visitVarInsn(ASTORE, 2);
        //   if (module.isNamed())
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "isNamed", "()Z", false);
        Label l5 = new Label();
        mv.visitJumpInsn(IFEQ, l5);
        //   {
        //     debug(" module == " + module.getName());
        if (DEBUG) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitInsn(ICONST_2);
            mv.visitTypeInsn(ANEWARRAY, "java/lang/String");
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_0);
            mv.visitLdcInsn(" module == ");
            mv.visitInsn(AASTORE);
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_1);
            mv.visitVarInsn(ALOAD, 2);
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "getName", "()Ljava/lang/String;", false);
            mv.visitInsn(AASTORE);
            mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug",
                    "([Ljava/lang/String;)V", false);
        }
        //     Package pkg = klazz.getPackage();
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getPackage", "()Ljava/lang/Package;", false);
        mv.visitVarInsn(ASTORE, 3);
        //     if (pkg == null)
        mv.visitVarInsn(ALOAD, 3);
        Label l6 = new Label();
        mv.visitJumpInsn(IFNONNULL, l6);
        //     {
        //        debug ("  (pkg == null) ==> false");
        if (DEBUG) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitInsn(ICONST_1);
            mv.visitTypeInsn(ANEWARRAY, "java/lang/String");
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_0);
            mv.visitLdcInsn("  (pkg == null) ==> false");
            mv.visitInsn(AASTORE);
            mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug",
                    "([Ljava/lang/String;)V", false);
        }
        mv.visitInsn(ICONST_0);
        mv.visitInsn(IRETURN);
        //     }
        mv.visitLabel(l6);
        //     if (!module.isExported(pkg.getName()))
        mv.visitVarInsn(ALOAD, 2);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Package", "getName", "()Ljava/lang/String;", false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "isExported", "(Ljava/lang/String;)Z", false);
        mv.visitJumpInsn(IFNE, l5);
        //     {
        //       debug (" !module.isExported(pkg.getName()) ==> true");
        if (DEBUG) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitInsn(ICONST_1);
            mv.visitTypeInsn(ANEWARRAY, "java/lang/String");
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_0);
            mv.visitLdcInsn(" !module.isExported(pkg.getName()) ==> true");
            mv.visitInsn(AASTORE);
            mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug",
                    "([Ljava/lang/String;)V", false);
        }
        //       return true;
        mv.visitInsn(ICONST_1);
        mv.visitInsn(IRETURN);
        //     }
        //   }
        mv.visitLabel(l5);
        //   if (!klazz.isMemberClass())
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "isMemberClass", "()Z", false);
        mv.visitJumpInsn(IFNE, l0);
        //   {
        //     debug(" !klazz.isMemberClass() ==> false") ;
        if (DEBUG) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitInsn(ICONST_1);
            mv.visitTypeInsn(ANEWARRAY, "java/lang/String");
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_0);
            mv.visitLdcInsn(" !klazz.isMemberClass() ==> false");
            mv.visitInsn(AASTORE);
            mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug",
                    "([Ljava/lang/String;)V", false);
        }
        mv.visitInsn(ICONST_0);
        mv.visitInsn(IRETURN);
        //   }
        //   try {
        mv.visitLabel(l0);
        //     klazz = klazz.getDeclaringClass();
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getDeclaringClass", "()Ljava/lang/Class;", false);
        mv.visitVarInsn(ASTORE, 1);
        //     debug(" klazz == " + klazz.getName());
        if (DEBUG) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitInsn(ICONST_2);
            mv.visitTypeInsn(ANEWARRAY, "java/lang/String");
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_0);
            mv.visitLdcInsn(" klazz == ");
            mv.visitInsn(AASTORE);
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_1);
            mv.visitVarInsn(ALOAD, 1);
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;", false);
            mv.visitInsn(AASTORE);
            mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug",
                    "([Ljava/lang/String;)V", false);
        }
        mv.visitLabel(l1);
        Label l7 = new Label();
        mv.visitJumpInsn(GOTO, l7);
        //   } catch (SecurityException se) {
        mv.visitLabel(l2);
        mv.visitVarInsn(ASTORE, 3);
        //     debug ("SecurityException ==> true");
        if (DEBUG) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitInsn(ICONST_1);
            mv.visitTypeInsn(ANEWARRAY, "java/lang/String");
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_0);
            mv.visitLdcInsn("SecurityException ==> true");
            mv.visitInsn(AASTORE);
            mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug",
                    "([Ljava/lang/String;)V", false);
        }
        mv.visitInsn(ICONST_1);
        mv.visitInsn(IRETURN);
        //   }
        mv.visitLabel(l7);
        // }
        mv.visitJumpInsn(GOTO, l3);
        mv.visitLabel(l4);
        //     debug ("  ==> true");
        if (DEBUG) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitInsn(ICONST_1);
            mv.visitTypeInsn(ANEWARRAY, "java/lang/String");
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_0);
            mv.visitLdcInsn("  ==> true");
            mv.visitInsn(AASTORE);
            mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug",
                    "([Ljava/lang/String;)V", false);
        }
        mv.visitInsn(ICONST_1);
        mv.visitInsn(IRETURN);
        mv.visitMaxs(5, 4);
        mv.visitEnd();
    }
    {
        // public boolean requiresAccess(AccessibleObject) {
        mv = cw.visitMethod(ACC_PUBLIC, "requiresAccess", "(Ljava/lang/reflect/AccessibleObject;)Z", null,
                null);
        mv.visitCode();
        // Member member = (Member)accessible;
        mv.visitVarInsn(ALOAD, 1);
        mv.visitTypeInsn(CHECKCAST, "java/lang/reflect/Member");
        mv.visitVarInsn(ASTORE, 2);
        // debug("JigsawAccessEnabler.requiresAccess( accessible == " + member.getDeclaringClass().getName() + member.getName() + ")");
        if (DEBUG) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitInsn(ICONST_5);
            mv.visitTypeInsn(ANEWARRAY, "java/lang/String");
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_0);
            mv.visitLdcInsn("JigsawAccessEnabler.requiresAccess( accessible == ");
            mv.visitInsn(AASTORE);
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_1);
            mv.visitVarInsn(ALOAD, 2);
            mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/reflect/Member", "getDeclaringClass",
                    "()Ljava/lang/Class;", true);
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;", false);
            mv.visitInsn(AASTORE);
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_2);
            mv.visitLdcInsn(".");
            mv.visitInsn(AASTORE);
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_3);
            mv.visitVarInsn(ALOAD, 2);
            mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/reflect/Member", "getName", "()Ljava/lang/String;",
                    true);
            mv.visitInsn(AASTORE);
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_4);
            mv.visitLdcInsn(")");
            mv.visitInsn(AASTORE);
            mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug",
                    "([Ljava/lang/String;)V", false);
        }
        // if (!Modifier.isPublic(member.getModifiers())
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/reflect/Member", "getModifiers", "()I", true);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/reflect/Modifier", "isPublic", "(I)Z", false);
        Label l0 = new Label();
        mv.visitJumpInsn(IFNE, l0);
        // {
        //   debug ("!Modifier.isPublic(member.getModifiers()) ==> true");
        if (DEBUG) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitInsn(ICONST_1);
            mv.visitTypeInsn(ANEWARRAY, "java/lang/String");
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_0);
            mv.visitLdcInsn("!Modifier.isPublic(member.getModifiers()) ==> true");
            mv.visitInsn(AASTORE);
            mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug",
                    "([Ljava/lang/String;)V", false);
        }
        //   return true
        mv.visitInsn(ICONST_1);
        mv.visitInsn(IRETURN);
        // }
        mv.visitLabel(l0);
        // Class<?> clazz = member.getDeclaringClass();
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/reflect/Member", "getDeclaringClass",
                "()Ljava/lang/Class;", true);
        mv.visitVarInsn(ASTORE, 3);
        // if (!Modifier.isPublic(clazz.getModifiers()))
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getModifiers", "()I", false);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/reflect/Modifier", "isPublic", "(I)Z", false);
        Label l1 = new Label();
        mv.visitJumpInsn(IFNE, l1);
        // {
        //   debug("!Modifier.isPublic(clazz.getModifiers()) ==> true");
        if (DEBUG) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitInsn(ICONST_1);
            mv.visitTypeInsn(ANEWARRAY, "java/lang/String");
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_0);
            mv.visitLdcInsn("!Modifier.isPublic(clazz.getModifiers()) ==> true");
            mv.visitInsn(AASTORE);
            mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug",
                    "([Ljava/lang/String;)V", false);
        }
        mv.visitInsn(ICONST_1);
        mv.visitInsn(IRETURN);
        // }
        mv.visitLabel(l1);
        // while (clazz.isMemberClass())
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "isMemberClass", "()Z", false);
        Label l2 = new Label();
        mv.visitJumpInsn(IFEQ, l2);
        // do {
        //   clazz = clazz.getEnclosingClass();
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getEnclosingClass", "()Ljava/lang/Class;", false);
        mv.visitVarInsn(ASTORE, 3);
        //   debug("klazz == " + clazz.getName());
        if (DEBUG) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitInsn(ICONST_2);
            mv.visitTypeInsn(ANEWARRAY, "java/lang/String");
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_0);
            mv.visitLdcInsn("klazz == ");
            mv.visitInsn(AASTORE);
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_1);
            mv.visitVarInsn(ALOAD, 3);
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;", false);
            mv.visitInsn(AASTORE);
            mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug",
                    "([Ljava/lang/String;)V", false);
        }
        //   if (!Modifier.isPublic(clazz.getModifiers()))
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getModifiers", "()I", false);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/reflect/Modifier", "isPublic", "(I)Z", false);
        mv.visitJumpInsn(IFNE, l1);
        //   {
        //     debug("!Modifier.isPublic(clazz.getModifiers()) ==> true");
        if (DEBUG) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitInsn(ICONST_1);
            mv.visitTypeInsn(ANEWARRAY, "java/lang/String");
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_0);
            mv.visitLdcInsn("!Modifier.isPublic(clazz.getModifiers()) ==> true");
            mv.visitInsn(AASTORE);
            mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug",
                    "([Ljava/lang/String;)V", false);
        }
        //     return true
        mv.visitInsn(ICONST_1);
        mv.visitInsn(IRETURN);
        //   }
        // } done
        mv.visitLabel(l2);
        // Module module = clazz.getModule();
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getModule", "()Ljava/lang/Module;", false);
        mv.visitVarInsn(ASTORE, 4);
        // if (!module.isNamed())
        mv.visitVarInsn(ALOAD, 4);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "isNamed", "()Z", false);
        Label l3 = new Label();
        mv.visitJumpInsn(IFNE, l3);
        // {
        //   debug ("!module.isNamed() ==> false");
        if (DEBUG) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitInsn(ICONST_1);
            mv.visitTypeInsn(ANEWARRAY, "java/lang/String");
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_0);
            mv.visitLdcInsn("!module.isNamed() ==> false");
            mv.visitInsn(AASTORE);
            mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug",
                    "([Ljava/lang/String;)V", false);
        }
        //   return false
        mv.visitInsn(ICONST_0);
        mv.visitInsn(IRETURN);
        // }
        mv.visitLabel(l3);
        if (DEBUG) {
            // debug("module == " + module.getName());
            mv.visitVarInsn(ALOAD, 0);
            mv.visitInsn(ICONST_2);
            mv.visitTypeInsn(ANEWARRAY, "java/lang/String");
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_0);
            mv.visitLdcInsn("module == ");
            mv.visitInsn(AASTORE);
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_1);
            mv.visitVarInsn(ALOAD, 4);
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "getName", "()Ljava/lang/String;", false);
            mv.visitInsn(AASTORE);
            mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug",
                    "([Ljava/lang/String;)V", false);
        }
        // String pkg = clazz.getPackageName();
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getPackageName", "()Ljava/lang/String;", false);
        mv.visitVarInsn(ASTORE, 5);
        if (DEBUG) {
            // debug("pkg == " + pkg);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitInsn(ICONST_2);
            mv.visitTypeInsn(ANEWARRAY, "java/lang/String");
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_0);
            mv.visitLdcInsn("pkg == ");
            mv.visitInsn(AASTORE);
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_1);
            mv.visitVarInsn(ALOAD, 5);
            mv.visitInsn(AASTORE);
            mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug",
                    "([Ljava/lang/String;)V", false);
        }
        // if (module.isExported(pkg, UNPRIVILEGED_MODULE))
        mv.visitVarInsn(ALOAD, 4);
        mv.visitVarInsn(ALOAD, 5);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "UNPRIVILEGED_MODULE",
                "Ljava/lang/Module;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "isExported",
                "(Ljava/lang/String;Ljava/lang/Module;)Z", false);
        Label l4 = new Label();
        mv.visitJumpInsn(IFEQ, l4);
        // {
        //   debug ("module.isExported(pkg, UNPRIVILEGED_MODULE) ==> false");
        if (DEBUG) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitInsn(ICONST_1);
            mv.visitTypeInsn(ANEWARRAY, "java/lang/String");
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_0);
            mv.visitLdcInsn("module.isExported(pkg, UNPRIVILEGED_MODULE) ==> false");
            mv.visitInsn(AASTORE);
            mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug",
                    "([Ljava/lang/String;)V", false);
        }
        //   return false
        mv.visitInsn(ICONST_0);
        mv.visitInsn(IRETURN);
        // }
        mv.visitLabel(l4);
        // debug(" ==> true");
        if (DEBUG) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitInsn(ICONST_1);
            mv.visitTypeInsn(ANEWARRAY, "java/lang/String");
            mv.visitInsn(DUP);
            mv.visitInsn(ICONST_0);
            mv.visitLdcInsn(" ==> true");
            mv.visitInsn(AASTORE);
            mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug",
                    "([Ljava/lang/String;)V", false);
        }
        // return true
        mv.visitInsn(ICONST_1);
        mv.visitInsn(IRETURN);
        // }
        mv.visitMaxs(5, 6);
        mv.visitEnd();
    }
    {
        // public void ensureAccess(AccessibleObject) {
        mv = cw.visitMethod(ACC_PUBLIC, "ensureAccess", "(Ljava/lang/reflect/AccessibleObject;)V", null, null);
        mv.visitCode();
        //  ensureModuleAccess(accessible);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "ensureModuleAccess",
                "(Ljava/lang/reflect/AccessibleObject;)V", false);
        // accessible.setAccessible(true);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitInsn(ICONST_1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/AccessibleObject", "setAccessible", "(Z)V", false);
        mv.visitInsn(RETURN);
        // }
        mv.visitMaxs(2, 2);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "createMethodInvoker",
                "(Ljava/lang/reflect/Method;)Lorg/jboss/byteman/agent/AccessibleMethodInvoker;", null, null);
        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/IllegalAccessException");
        // ensureModuleAccess(method);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "ensureModuleAccess",
                "(Ljava/lang/reflect/AccessibleObject;)V", false);
        //  Lookup privateLookup = null;
        mv.visitInsn(ACONST_NULL);
        mv.visitVarInsn(ASTORE, 2);
        //   try {
        mv.visitLabel(l0);
        // privateLookup = MethodHandles.privateLookupIn(method.getDeclaringClass(), theLookup);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Method", "getDeclaringClass",
                "()Ljava/lang/Class;", false);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "theLookup",
                "Ljava/lang/invoke/MethodHandles$Lookup;");
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodHandles", "privateLookupIn",
                "(Ljava/lang/Class;Ljava/lang/invoke/MethodHandles$Lookup;)Ljava/lang/invoke/MethodHandles$Lookup;",
                false);
        mv.visitVarInsn(ASTORE, 2);
        mv.visitLabel(l1);
        Label l4 = new Label();
        mv.visitJumpInsn(GOTO, l4);
        // } catch (IllegalArgumentException e) {
        mv.visitLabel(l2);
        mv.visitVarInsn(ASTORE, 3);
        // method.setAccessible(true);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitInsn(ICONST_1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Method", "setAccessible", "(Z)V", false);
        // return defaultAccessEnabler.createMethodInvoker(method, true);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "defaultAccessEnabler",
                "Lorg/jboss/byteman/agent/DefaultAccessEnabler;");
        mv.visitVarInsn(ALOAD, 1);
        mv.visitInsn(ICONST_1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/agent/DefaultAccessEnabler", "createMethodInvoker",
                "(Ljava/lang/reflect/Method;Z)Lorg/jboss/byteman/agent/AccessibleMethodInvoker;", false);
        mv.visitInsn(ARETURN);
        // } catch (IllegalAccessException e) {
        mv.visitLabel(l3);
        mv.visitVarInsn(ASTORE, 3);
        // }
        mv.visitLabel(l4);
        // return new JigsawAccessibleMethodInvoker(privateLookup, method);
        mv.visitTypeInsn(NEW, "org/jboss/byteman/jigsaw/JigsawAccessibleMethodInvoker");
        mv.visitInsn(DUP);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessibleMethodInvoker", "<init>",
                "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/reflect/Method;)V", false);
        mv.visitInsn(ARETURN);
        mv.visitMaxs(4, 4);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "createConstructorInvoker",
                "(Ljava/lang/reflect/Constructor;)Lorg/jboss/byteman/agent/AccessibleConstructorInvoker;", null,
                null);
        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/IllegalAccessException");
        // ensureModuleAccess(constructor);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "ensureModuleAccess",
                "(Ljava/lang/reflect/AccessibleObject;)V", false);
        //  Lookup privateLookup = null;
        mv.visitInsn(ACONST_NULL);
        mv.visitVarInsn(ASTORE, 2);
        // try {
        mv.visitLabel(l0);
        // privateLookup = MethodHandles.privateLookupIn(constructor.getDeclaringClass(), theLookup)
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Constructor", "getDeclaringClass",
                "()Ljava/lang/Class;", false);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "theLookup",
                "Ljava/lang/invoke/MethodHandles$Lookup;");
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodHandles", "privateLookupIn",
                "(Ljava/lang/Class;Ljava/lang/invoke/MethodHandles$Lookup;)Ljava/lang/invoke/MethodHandles$Lookup;",
                false);
        mv.visitVarInsn(ASTORE, 2);
        mv.visitLabel(l1);
        Label l4 = new Label();
        mv.visitJumpInsn(GOTO, l4);
        // } catch (IllegalArgumentException e) {
        mv.visitLabel(l2);
        mv.visitVarInsn(ASTORE, 3);
        // constructor.setAccessible(true);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitInsn(ICONST_1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Constructor", "setAccessible", "(Z)V", false);
        // return defaultAccessEnabler.createConstructorInvoker(constructor);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "defaultAccessEnabler",
                "Lorg/jboss/byteman/agent/DefaultAccessEnabler;");
        mv.visitVarInsn(ALOAD, 1);
        mv.visitInsn(ICONST_1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/agent/DefaultAccessEnabler",
                "createConstructorInvoker",
                "(Ljava/lang/reflect/Constructor;Z)Lorg/jboss/byteman/agent/AccessibleConstructorInvoker;",
                false);
        mv.visitInsn(ARETURN);
        // } catch (IllegalAccessException e) {
        mv.visitLabel(l3);
        mv.visitVarInsn(ASTORE, 3);
        // }
        mv.visitLabel(l4);
        // return new JigsawAccessibleConstructorInvoker(privateLookup, constructor);
        mv.visitTypeInsn(NEW, "org/jboss/byteman/jigsaw/JigsawAccessibleConstructorInvoker");
        mv.visitInsn(DUP);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessibleConstructorInvoker",
                "<init>", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/reflect/Constructor;)V", false);
        mv.visitInsn(ARETURN);
        mv.visitMaxs(4, 4);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "createFieldGetter",
                "(Ljava/lang/reflect/Field;)Lorg/jboss/byteman/agent/AccessibleFieldGetter;", null, null);
        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/IllegalAccessException");
        // ensureModuleAccess(field);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "ensureModuleAccess",
                "(Ljava/lang/reflect/AccessibleObject;)V", false);
        // Lookup privateLookup = null;
        mv.visitInsn(ACONST_NULL);
        mv.visitVarInsn(ASTORE, 2);
        // try {
        mv.visitLabel(l0);
        // privateLookup = MethodHandles.privateLookupIn(field.getDeclaringClass(), theLookup)
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getDeclaringClass", "()Ljava/lang/Class;",
                false);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "theLookup",
                "Ljava/lang/invoke/MethodHandles$Lookup;");
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodHandles", "privateLookupIn",
                "(Ljava/lang/Class;Ljava/lang/invoke/MethodHandles$Lookup;)Ljava/lang/invoke/MethodHandles$Lookup;",
                false);
        mv.visitVarInsn(ASTORE, 2);
        mv.visitLabel(l1);
        Label l4 = new Label();
        mv.visitJumpInsn(GOTO, l4);
        // } catch (IllegalArgumentException e) {
        mv.visitLabel(l2);
        mv.visitVarInsn(ASTORE, 3);
        // field.setAccessible(true);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitInsn(ICONST_1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "setAccessible", "(Z)V", false);
        // return defaultAccessEnabler.createFieldGetter(method);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "defaultAccessEnabler",
                "Lorg/jboss/byteman/agent/DefaultAccessEnabler;");
        mv.visitVarInsn(ALOAD, 1);
        mv.visitInsn(ICONST_1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/agent/DefaultAccessEnabler", "createFieldGetter",
                "(Ljava/lang/reflect/Field;Z)Lorg/jboss/byteman/agent/AccessibleFieldGetter;", false);
        mv.visitInsn(ARETURN);
        // } catch (IllegalAccessException e) {
        mv.visitLabel(l3);
        mv.visitVarInsn(ASTORE, 3);
        // }
        mv.visitLabel(l4);
        // return new JigsawAccessibleFieldGetter(privateLookup, field);
        mv.visitTypeInsn(NEW, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldGetter");
        mv.visitInsn(DUP);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldGetter", "<init>",
                "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/reflect/Field;)V", false);
        mv.visitInsn(ARETURN);
        mv.visitMaxs(4, 4);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "createFieldSetter",
                "(Ljava/lang/reflect/Field;)Lorg/jboss/byteman/agent/AccessibleFieldSetter;", null, null);
        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/IllegalAccessException");
        // ensureModuleAccess(field);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "ensureModuleAccess",
                "(Ljava/lang/reflect/AccessibleObject;)V", false);
        // Lookup privateLookup = null;
        mv.visitInsn(ACONST_NULL);
        mv.visitVarInsn(ASTORE, 2);
        // try {
        mv.visitLabel(l0);
        // privateLookup = MethodHandles.privateLookupIn(field.getDeclaringClass(), theLookup)
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getDeclaringClass", "()Ljava/lang/Class;",
                false);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "theLookup",
                "Ljava/lang/invoke/MethodHandles$Lookup;");
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodHandles", "privateLookupIn",
                "(Ljava/lang/Class;Ljava/lang/invoke/MethodHandles$Lookup;)Ljava/lang/invoke/MethodHandles$Lookup;",
                false);
        mv.visitVarInsn(ASTORE, 2);
        mv.visitLabel(l1);
        Label l4 = new Label();
        mv.visitJumpInsn(GOTO, l4);
        // } catch (IllegalArgumentException e) {
        mv.visitLabel(l2);
        mv.visitVarInsn(ASTORE, 3);
        // field.setAccessible(true);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitInsn(ICONST_1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "setAccessible", "(Z)V", false);
        // return defaultAccessEnabler.createFieldSetter(method);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "defaultAccessEnabler",
                "Lorg/jboss/byteman/agent/DefaultAccessEnabler;");
        mv.visitVarInsn(ALOAD, 1);
        mv.visitInsn(ICONST_1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/agent/DefaultAccessEnabler", "createFieldSetter",
                "(Ljava/lang/reflect/Field;Z)Lorg/jboss/byteman/agent/AccessibleFieldSetter;", false);
        mv.visitInsn(ARETURN);
        // } catch (IllegalAccessException e) {
        mv.visitLabel(l3);
        mv.visitVarInsn(ASTORE, 3);
        // }
        mv.visitLabel(l4);
        // return new JigsawAccessibleFieldSetter(privateLookup, field);
        mv.visitTypeInsn(NEW, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldSetter");
        mv.visitInsn(DUP);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldSetter", "<init>",
                "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/reflect/Field;)V", false);
        mv.visitInsn(ARETURN);
        mv.visitMaxs(4, 4);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PRIVATE, "ensureModuleAccess", "(Ljava/lang/reflect/AccessibleObject;)V", null,
                null);
        mv.visitCode();
        // Member member = (Member)accessible;
        mv.visitVarInsn(ALOAD, 1);
        mv.visitTypeInsn(CHECKCAST, "java/lang/reflect/Member");
        mv.visitVarInsn(ASTORE, 2);
        // Class<?> clazz = member.getDeclaringClass();
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/reflect/Member", "getDeclaringClass",
                "()Ljava/lang/Class;", true);
        mv.visitVarInsn(ASTORE, 3);
        // Module module = clazz.getModule();
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getModule", "()Ljava/lang/Module;", false);
        mv.visitVarInsn(ASTORE, 4);
        // if (!module.isNamed()) {
        mv.visitVarInsn(ALOAD, 4);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "isNamed", "()Z", false);
        Label l0 = new Label();
        mv.visitJumpInsn(IFNE, l0);
        // if (!THIS_MODULE.canRead(module)) {
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE",
                "Ljava/lang/Module;");
        mv.visitVarInsn(ALOAD, 4);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "canRead", "(Ljava/lang/Module;)Z", false);
        Label ltmp0 = new Label();
        mv.visitJumpInsn(IFNE, ltmp0);
        // inst.redefineModule(THIS_MODULE, Set.of(module), EMPTY_EXPORTS_MAP, EMPTY_OPENS_MAP, EMPTY_USES_SET, EMPTY_PROVIDES_MAP);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "inst",
                "Ljava/lang/instrument/Instrumentation;");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE",
                "Ljava/lang/Module;");
        mv.visitVarInsn(ALOAD, 4);
        mv.visitMethodInsn(INVOKESTATIC, "java/util/Set", "of", "(Ljava/lang/Object;)Ljava/util/Set;", true);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_EXPORTS_MAP",
                "Ljava/util/Map;");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_OPENS_MAP",
                "Ljava/util/Map;");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_USES_SET",
                "Ljava/util/Set;");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_PROVIDES_MAP",
                "Ljava/util/Map;");
        mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/instrument/Instrumentation", "redefineModule",
                "(Ljava/lang/Module;Ljava/util/Set;Ljava/util/Map;Ljava/util/Map;Ljava/util/Set;Ljava/util/Map;)V",
                true);
        // }
        mv.visitLabel(ltmp0);
        // return;
        mv.visitInsn(RETURN);
        // }
        mv.visitLabel(l0);
        // String pkg = clazz.getPackageName();
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getPackageName", "()Ljava/lang/String;", false);
        mv.visitVarInsn(ASTORE, 5);
        // if (!module.isOpen(pkg, THIS_MODULE)) {
        mv.visitVarInsn(ALOAD, 4);
        mv.visitVarInsn(ALOAD, 5);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE",
                "Ljava/lang/Module;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "isOpen",
                "(Ljava/lang/String;Ljava/lang/Module;)Z", false);
        Label l1 = new Label();
        mv.visitJumpInsn(IFNE, l1);
        // Map<String, Set<Module>> extraOpens = Map.of(pkg, THIS_MODULE_SET);
        mv.visitVarInsn(ALOAD, 5);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE_SET",
                "Ljava/util/Set;");
        mv.visitMethodInsn(INVOKESTATIC, "java/util/Map", "of",
                "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;", true);
        mv.visitVarInsn(ASTORE, 6);
        // inst.redefineModule(module, EMPTY_READS_SET, EMPTY_EXPORTS_MAP, extraOpens, EMPTY_USES_SET, EMPTY_PROVIDES_MAP);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "inst",
                "Ljava/lang/instrument/Instrumentation;");
        mv.visitVarInsn(ALOAD, 4);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_READS_SET",
                "Ljava/util/Set;");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_EXPORTS_MAP",
                "Ljava/util/Map;");
        mv.visitVarInsn(ALOAD, 6);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_USES_SET",
                "Ljava/util/Set;");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_PROVIDES_MAP",
                "Ljava/util/Map;");
        mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/instrument/Instrumentation", "redefineModule",
                "(Ljava/lang/Module;Ljava/util/Set;Ljava/util/Map;Ljava/util/Map;Ljava/util/Set;Ljava/util/Map;)V",
                true);
        // inst.redefineModule(THIS_MODULE, Set.of(module), EMPTY_EXPORTS_MAP, extraOpens, EMPTY_USES_SET, EMPTY_PROVIDES_MAP);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "inst",
                "Ljava/lang/instrument/Instrumentation;");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE",
                "Ljava/lang/Module;");
        mv.visitVarInsn(ALOAD, 4);
        mv.visitMethodInsn(INVOKESTATIC, "java/util/Set", "of", "(Ljava/lang/Object;)Ljava/util/Set;", true);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_EXPORTS_MAP",
                "Ljava/util/Map;");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_OPENS_MAP",
                "Ljava/util/Map;");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_USES_SET",
                "Ljava/util/Set;");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_PROVIDES_MAP",
                "Ljava/util/Map;");
        mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/instrument/Instrumentation", "redefineModule",
                "(Ljava/lang/Module;Ljava/util/Set;Ljava/util/Map;Ljava/util/Map;Ljava/util/Set;Ljava/util/Map;)V",
                true);
        mv.visitLabel(l1);
        // }
        mv.visitInsn(RETURN);
        mv.visitMaxs(7, 7);
        mv.visitEnd();
    }
    {
        if (DEBUG) {
            mv = cw.visitMethod(ACC_PRIVATE + ACC_VARARGS, "debug", "([Ljava/lang/String;)V", null, null);
            mv.visitCode();
            // StringBuilder builder = new StringBuilder();
            mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
            mv.visitInsn(DUP);
            mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V", false);
            mv.visitVarInsn(ASTORE, 2);
            // for (String s : args)
            mv.visitVarInsn(ALOAD, 1);
            mv.visitVarInsn(ASTORE, 3);
            mv.visitVarInsn(ALOAD, 3);
            mv.visitInsn(ARRAYLENGTH);
            mv.visitVarInsn(ISTORE, 4);
            mv.visitInsn(ICONST_0);
            mv.visitVarInsn(ISTORE, 5);
            Label l0 = new Label();
            mv.visitLabel(l0);
            // {
            //
            mv.visitVarInsn(ILOAD, 5);
            mv.visitVarInsn(ILOAD, 4);
            Label l1 = new Label();
            mv.visitJumpInsn(IF_ICMPGE, l1);
            mv.visitVarInsn(ALOAD, 3);
            mv.visitVarInsn(ILOAD, 5);
            mv.visitInsn(AALOAD);
            //    builder.append(s);
            mv.visitVarInsn(ASTORE, 6);
            mv.visitVarInsn(ALOAD, 2);
            mv.visitVarInsn(ALOAD, 6);
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                    "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
            mv.visitInsn(POP);
            mv.visitIincInsn(5, 1);
            mv.visitJumpInsn(GOTO, l0);
            // }
            mv.visitLabel(l1);
            // System.out.println(builder.toString());
            mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
            mv.visitVarInsn(ALOAD, 2);
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;",
                    false);
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
            mv.visitInsn(RETURN);
            mv.visitMaxs(2, 7);
            mv.visitEnd();
        }
    }
    cw.visitEnd();

    return cw.toByteArray();
}

From source file:org.jboss.byteman.agent.JigsawAccessEnablerGenerator.java

License:Open Source License

private static byte[] getJigsawAccessibleConstructorInvokerClassBytes() {
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
    FieldVisitor fv;//from  w  ww.  j  a  va2s  .c om
    MethodVisitor mv;

    cw.visit(V9, ACC_PUBLIC + ACC_SUPER, "org/jboss/byteman/jigsaw/JigsawAccessibleConstructorInvoker", null,
            "java/lang/Object", new String[] { "org/jboss/byteman/agent/AccessibleConstructorInvoker" });

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

    {
        fv = cw.visitField(ACC_PRIVATE, "handle", "Ljava/lang/invoke/MethodHandle;", null, null);
        fv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>",
                "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/reflect/Constructor;)V", null, null);
        mv.visitCode();
        Label l0 = new Label();
        Label l1 = new Label();
        Label l2 = new Label();
        mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Exception");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
        mv.visitLabel(l0);
        mv.visitFieldInsn(GETSTATIC, "java/lang/Void", "TYPE", "Ljava/lang/Class;");
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Constructor", "getParameterTypes",
                "()[Ljava/lang/Class;", false);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodType", "methodType",
                "(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/invoke/MethodType;", false);
        mv.visitVarInsn(ASTORE, 3);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Constructor", "getDeclaringClass",
                "()Ljava/lang/Class;", false);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandles$Lookup", "findConstructor",
                "(Ljava/lang/Class;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;", false);
        mv.visitVarInsn(ASTORE, 4);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Constructor", "isVarArgs", "()Z", false);
        Label l3 = new Label();
        mv.visitJumpInsn(IFEQ, l3);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "asFixedArity",
                "()Ljava/lang/invoke/MethodHandle;", false);
        mv.visitVarInsn(ASTORE, 4);
        mv.visitLabel(l3);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleConstructorInvoker", "handle",
                "Ljava/lang/invoke/MethodHandle;");
        mv.visitLabel(l1);
        Label l4 = new Label();
        mv.visitJumpInsn(GOTO, l4);
        mv.visitLabel(l2);
        mv.visitVarInsn(ASTORE, 3);
        mv.visitTypeInsn(NEW, "java/lang/RuntimeException");
        mv.visitInsn(DUP);
        mv.visitLdcInsn(
                "JigsawAccessibleConstructorInvoker : exception creating method handle for constructor ");
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>",
                "(Ljava/lang/String;Ljava/lang/Throwable;)V", false);
        mv.visitInsn(ATHROW);
        mv.visitLabel(l4);
        mv.visitInsn(RETURN);
        mv.visitMaxs(4, 5);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "invoke", "([Ljava/lang/Object;)Ljava/lang/Object;", 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/jboss/byteman/jigsaw/JigsawAccessibleConstructorInvoker", "handle",
                "Ljava/lang/invoke/MethodHandle;");
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invokeWithArguments",
                "([Ljava/lang/Object;)Ljava/lang/Object;", false);
        mv.visitLabel(l1);
        mv.visitInsn(ARETURN);
        mv.visitLabel(l2);
        mv.visitVarInsn(ASTORE, 2);
        mv.visitTypeInsn(NEW, "org/jboss/byteman/rule/exception/ExecuteException");
        mv.visitInsn(DUP);
        mv.visitLdcInsn("JigsawAccessibleConstructorInvoker.invoke : exception invoking methodhandle ");
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/rule/exception/ExecuteException", "<init>",
                "(Ljava/lang/String;Ljava/lang/Throwable;)V", false);
        mv.visitInsn(ATHROW);
        mv.visitMaxs(4, 3);
        mv.visitEnd();
    }
    cw.visitEnd();

    return cw.toByteArray();
}

From source file:org.jboss.byteman.agent.JigsawAccessEnablerGenerator.java

License:Open Source License

private static byte[] getJigsawAccessibleMethodInvokerClassBytes() {
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
    FieldVisitor fv;//from  w  w w .j  av  a  2  s  .  c  o m
    MethodVisitor mv;

    cw.visit(V9, ACC_PUBLIC + ACC_SUPER, "org/jboss/byteman/jigsaw/JigsawAccessibleMethodInvoker", null,
            "java/lang/Object", new String[] { "org/jboss/byteman/agent/AccessibleMethodInvoker" });

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

    {
        fv = cw.visitField(ACC_PRIVATE, "handle", "Ljava/lang/invoke/MethodHandle;", null, null);
        fv.visitEnd();
    }
    {
        fv = cw.visitField(ACC_PRIVATE, "isStatic", "Z", null, null);
        fv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>",
                "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/reflect/Method;)V", null, null);
        mv.visitCode();
        Label l0 = new Label();
        Label l1 = new Label();
        Label l2 = new Label();
        mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Exception");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
        mv.visitLabel(l0);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Method", "getReturnType", "()Ljava/lang/Class;",
                false);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Method", "getParameterTypes",
                "()[Ljava/lang/Class;", false);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodType", "methodType",
                "(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/invoke/MethodType;", false);
        mv.visitVarInsn(ASTORE, 3);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Method", "getModifiers", "()I", false);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/reflect/Modifier", "isStatic", "(I)Z", false);
        mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleMethodInvoker", "isStatic", "Z");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleMethodInvoker", "isStatic", "Z");
        Label l3 = new Label();
        mv.visitJumpInsn(IFEQ, l3);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Method", "getDeclaringClass",
                "()Ljava/lang/Class;", false);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Method", "getName", "()Ljava/lang/String;", false);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandles$Lookup", "findStatic",
                "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;",
                false);
        mv.visitVarInsn(ASTORE, 4);
        Label l4 = new Label();
        mv.visitJumpInsn(GOTO, l4);
        mv.visitLabel(l3);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Method", "getDeclaringClass",
                "()Ljava/lang/Class;", false);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Method", "getName", "()Ljava/lang/String;", false);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandles$Lookup", "findVirtual",
                "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;",
                false);
        mv.visitVarInsn(ASTORE, 4);
        mv.visitLabel(l4);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Method", "isVarArgs", "()Z", false);
        Label l5 = new Label();
        mv.visitJumpInsn(IFEQ, l5);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "asFixedArity",
                "()Ljava/lang/invoke/MethodHandle;", false);
        mv.visitVarInsn(ASTORE, 4);
        mv.visitLabel(l5);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleMethodInvoker", "handle",
                "Ljava/lang/invoke/MethodHandle;");
        mv.visitLabel(l1);
        Label l6 = new Label();
        mv.visitJumpInsn(GOTO, l6);
        mv.visitLabel(l2);
        mv.visitVarInsn(ASTORE, 3);
        mv.visitTypeInsn(NEW, "java/lang/RuntimeException");
        mv.visitInsn(DUP);
        mv.visitLdcInsn("JigsawAccessibleMethodInvoker : exception creating methodhandle for method ");
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>",
                "(Ljava/lang/String;Ljava/lang/Throwable;)V", false);
        mv.visitInsn(ATHROW);
        mv.visitLabel(l6);
        mv.visitInsn(RETURN);
        mv.visitMaxs(4, 5);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "invoke", "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;",
                null, null);
        mv.visitCode();
        Label l0 = new Label();
        Label l1 = new Label();
        Label l2 = new Label();
        mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Throwable");
        Label l3 = new Label();
        Label l4 = new Label();
        mv.visitTryCatchBlock(l3, l4, l2, "java/lang/Throwable");
        mv.visitLabel(l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleMethodInvoker", "isStatic", "Z");
        mv.visitJumpInsn(IFEQ, l3);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleMethodInvoker", "handle",
                "Ljava/lang/invoke/MethodHandle;");
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invokeWithArguments",
                "([Ljava/lang/Object;)Ljava/lang/Object;", false);
        mv.visitLabel(l1);
        mv.visitInsn(ARETURN);
        mv.visitLabel(l3);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleMethodInvoker", "handle",
                "Ljava/lang/invoke/MethodHandle;");
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "bindTo",
                "(Ljava/lang/Object;)Ljava/lang/invoke/MethodHandle;", false);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invokeWithArguments",
                "([Ljava/lang/Object;)Ljava/lang/Object;", false);
        mv.visitLabel(l4);
        mv.visitInsn(ARETURN);
        mv.visitLabel(l2);
        mv.visitVarInsn(ASTORE, 3);
        mv.visitTypeInsn(NEW, "org/jboss/byteman/rule/exception/ExecuteException");
        mv.visitInsn(DUP);
        mv.visitLdcInsn("JigsawAccessibleMethodInvoker.invoke : exception invoking methodhandle ");
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/rule/exception/ExecuteException", "<init>",
                "(Ljava/lang/String;Ljava/lang/Throwable;)V", false);
        mv.visitInsn(ATHROW);
        mv.visitMaxs(4, 4);
        mv.visitEnd();
    }
    cw.visitEnd();

    return cw.toByteArray();
}

From source file:org.jboss.byteman.agent.JigsawAccessEnablerGenerator.java

License:Open Source License

private static byte[] getJigsawAccessibleFieldGetterClassBytes() {
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
    FieldVisitor fv;/*w  ww  .  j ava 2  s. c o m*/
    MethodVisitor mv;

    cw.visit(V9, ACC_PUBLIC + ACC_SUPER, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldGetter", null,
            "java/lang/Object", new String[] { "org/jboss/byteman/agent/AccessibleFieldGetter" });

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

    {
        fv = cw.visitField(ACC_PRIVATE, "handle", "Ljava/lang/invoke/MethodHandle;", null, null);
        fv.visitEnd();
    }
    {
        fv = cw.visitField(0, "isStatic", "Z", null, null);
        fv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>",
                "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/reflect/Field;)V", null, null);
        mv.visitCode();
        Label l0 = new Label();
        Label l1 = new Label();
        Label l2 = new Label();
        mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Exception");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getModifiers", "()I", false);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/reflect/Modifier", "isStatic", "(I)Z", false);
        mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldGetter", "isStatic", "Z");
        mv.visitLabel(l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldGetter", "isStatic", "Z");
        Label l3 = new Label();
        mv.visitJumpInsn(IFEQ, l3);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getDeclaringClass", "()Ljava/lang/Class;",
                false);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getName", "()Ljava/lang/String;", false);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getType", "()Ljava/lang/Class;", false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandles$Lookup", "findStaticGetter",
                "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;", false);
        mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldGetter", "handle",
                "Ljava/lang/invoke/MethodHandle;");
        mv.visitJumpInsn(GOTO, l1);
        mv.visitLabel(l3);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getDeclaringClass", "()Ljava/lang/Class;",
                false);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getName", "()Ljava/lang/String;", false);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getType", "()Ljava/lang/Class;", false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandles$Lookup", "findGetter",
                "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;", false);
        mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldGetter", "handle",
                "Ljava/lang/invoke/MethodHandle;");
        mv.visitLabel(l1);
        Label l4 = new Label();
        mv.visitJumpInsn(GOTO, l4);
        mv.visitLabel(l2);
        mv.visitVarInsn(ASTORE, 3);
        mv.visitTypeInsn(NEW, "java/lang/RuntimeException");
        mv.visitInsn(DUP);
        mv.visitLdcInsn("JigsawAccessibleFieldGetter : exception creating getter method handle for field ");
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>",
                "(Ljava/lang/String;Ljava/lang/Throwable;)V", false);
        mv.visitInsn(ATHROW);
        mv.visitLabel(l4);
        mv.visitInsn(RETURN);
        mv.visitMaxs(5, 4);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "get", "(Ljava/lang/Object;)Ljava/lang/Object;", null, null);
        mv.visitCode();
        Label l0 = new Label();
        Label l1 = new Label();
        Label l2 = new Label();
        mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Throwable");
        Label l3 = new Label();
        Label l4 = new Label();
        mv.visitTryCatchBlock(l3, l4, l2, "java/lang/Throwable");
        mv.visitLabel(l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldGetter", "isStatic", "Z");
        mv.visitJumpInsn(IFEQ, l3);
        mv.visitVarInsn(ALOAD, 1);
        Label l5 = new Label();
        mv.visitJumpInsn(IFNULL, l5);
        mv.visitTypeInsn(NEW, "org/jboss/byteman/rule/exception/ExecuteException");
        mv.visitInsn(DUP);
        mv.visitLdcInsn("JigsawAccessibleFieldGetter.get : expecting null owner for static get!");
        mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/rule/exception/ExecuteException", "<init>",
                "(Ljava/lang/String;)V", false);
        mv.visitInsn(ATHROW);
        mv.visitLabel(l5);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldGetter", "handle",
                "Ljava/lang/invoke/MethodHandle;");
        mv.visitInsn(ICONST_0);
        mv.visitTypeInsn(ANEWARRAY, "java/lang/Object");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invokeWithArguments",
                "([Ljava/lang/Object;)Ljava/lang/Object;", false);
        mv.visitLabel(l1);
        mv.visitInsn(ARETURN);
        mv.visitLabel(l3);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldGetter", "handle",
                "Ljava/lang/invoke/MethodHandle;");
        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(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invokeWithArguments",
                "([Ljava/lang/Object;)Ljava/lang/Object;", false);
        mv.visitLabel(l4);
        mv.visitInsn(ARETURN);
        mv.visitLabel(l2);
        mv.visitVarInsn(ASTORE, 2);
        mv.visitTypeInsn(NEW, "org/jboss/byteman/rule/exception/ExecuteException");
        mv.visitInsn(DUP);
        mv.visitLdcInsn("JigsawAccessibleFieldGetter.invoke : exception invoking getter methodhandle ");
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/rule/exception/ExecuteException", "<init>",
                "(Ljava/lang/String;Ljava/lang/Throwable;)V", false);
        mv.visitInsn(ATHROW);
        mv.visitMaxs(5, 3);
        mv.visitEnd();
    }
    cw.visitEnd();

    return cw.toByteArray();
}

From source file:org.jboss.byteman.agent.JigsawAccessEnablerGenerator.java

License:Open Source License

private static byte[] getJigsawAccessibleFieldSetterClassBytes() {
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
    FieldVisitor fv;//from  w ww  .j  a va2s  .  c  o  m
    MethodVisitor mv;

    cw.visit(V9, ACC_PUBLIC + ACC_SUPER, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldSetter", null,
            "java/lang/Object", new String[] { "org/jboss/byteman/agent/AccessibleFieldSetter" });

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

    {
        fv = cw.visitField(ACC_PRIVATE, "handle", "Ljava/lang/invoke/MethodHandle;", null, null);
        fv.visitEnd();
    }
    {
        fv = cw.visitField(0, "isStatic", "Z", null, null);
        fv.visitEnd();
    }
    {
        fv = cw.visitField(ACC_PRIVATE, "field", "Ljava/lang/reflect/Field;", null, null);
        fv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>",
                "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/reflect/Field;)V", null, null);
        mv.visitCode();
        Label l0 = new Label();
        Label l1 = new Label();
        Label l2 = new Label();
        mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Exception");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getModifiers", "()I", false);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/reflect/Modifier", "isStatic", "(I)Z", false);
        mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldSetter", "isStatic", "Z");
        mv.visitLabel(l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldSetter", "isStatic", "Z");
        Label l3 = new Label();
        mv.visitJumpInsn(IFEQ, l3);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getDeclaringClass", "()Ljava/lang/Class;",
                false);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getName", "()Ljava/lang/String;", false);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getType", "()Ljava/lang/Class;", false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandles$Lookup", "findStaticSetter",
                "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;", false);
        mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldSetter", "handle",
                "Ljava/lang/invoke/MethodHandle;");
        mv.visitJumpInsn(GOTO, l1);
        mv.visitLabel(l3);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getDeclaringClass", "()Ljava/lang/Class;",
                false);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getName", "()Ljava/lang/String;", false);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getType", "()Ljava/lang/Class;", false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandles$Lookup", "findSetter",
                "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;", false);
        mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldSetter", "handle",
                "Ljava/lang/invoke/MethodHandle;");
        mv.visitLabel(l1);
        Label l4 = new Label();
        mv.visitJumpInsn(GOTO, l4);
        mv.visitLabel(l2);
        mv.visitVarInsn(ASTORE, 3);
        mv.visitTypeInsn(NEW, "java/lang/RuntimeException");
        mv.visitInsn(DUP);
        mv.visitLdcInsn("JigsawAccessibleFieldSetter : exception creating etter method handle for field ");
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>",
                "(Ljava/lang/String;Ljava/lang/Throwable;)V", false);
        mv.visitInsn(ATHROW);
        mv.visitLabel(l4);
        mv.visitInsn(RETURN);
        mv.visitMaxs(5, 4);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "set", "(Ljava/lang/Object;Ljava/lang/Object;)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/jboss/byteman/jigsaw/JigsawAccessibleFieldSetter", "isStatic", "Z");
        Label l3 = new Label();
        mv.visitJumpInsn(IFEQ, l3);
        mv.visitVarInsn(ALOAD, 1);
        Label l4 = new Label();
        mv.visitJumpInsn(IFNULL, l4);
        mv.visitTypeInsn(NEW, "org/jboss/byteman/rule/exception/ExecuteException");
        mv.visitInsn(DUP);
        mv.visitLdcInsn("JigsawAccessibleFieldSetter.set : expecting null owner for static set!");
        mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/rule/exception/ExecuteException", "<init>",
                "(Ljava/lang/String;)V", false);
        mv.visitInsn(ATHROW);
        mv.visitLabel(l4);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldSetter", "handle",
                "Ljava/lang/invoke/MethodHandle;");
        mv.visitInsn(ICONST_1);
        mv.visitTypeInsn(ANEWARRAY, "java/lang/Object");
        mv.visitInsn(DUP);
        mv.visitInsn(ICONST_0);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitInsn(AASTORE);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invokeWithArguments",
                "([Ljava/lang/Object;)Ljava/lang/Object;", false);
        mv.visitInsn(POP);
        mv.visitJumpInsn(GOTO, l1);
        mv.visitLabel(l3);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldSetter", "handle",
                "Ljava/lang/invoke/MethodHandle;");
        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(ALOAD, 2);
        mv.visitInsn(AASTORE);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invokeWithArguments",
                "([Ljava/lang/Object;)Ljava/lang/Object;", false);
        mv.visitInsn(POP);
        mv.visitLabel(l1);
        Label l5 = new Label();
        mv.visitJumpInsn(GOTO, l5);
        mv.visitLabel(l2);
        mv.visitVarInsn(ASTORE, 3);
        mv.visitTypeInsn(NEW, "org/jboss/byteman/rule/exception/ExecuteException");
        mv.visitInsn(DUP);
        mv.visitLdcInsn("JigsawAccessibleFieldSetter.set : exception invoking setter methodhandle ");
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/rule/exception/ExecuteException", "<init>",
                "(Ljava/lang/String;Ljava/lang/Throwable;)V", false);
        mv.visitInsn(ATHROW);
        mv.visitLabel(l5);
        mv.visitInsn(RETURN);
        mv.visitMaxs(5, 4);
        mv.visitEnd();
    }
    cw.visitEnd();

    return cw.toByteArray();
}

From source file:org.jboss.byteman.rule.compiler.Compiler.java

License:Open Source License

private static byte[] compileBytes(Rule rule, Class helperClass, String helperName, String compiledHelperName,
        boolean compileToBytecode) throws Exception {
    ClassWriter cw = new ClassWriter(0);
    FieldVisitor fv;/* w ww.  jav  a  2  s.  c o m*/
    MethodVisitor mv;
    AnnotationVisitor av0;
    // create the class as a subclass of the rule helper class, appending Compiled to the front
    // of the class name and a unique number to the end of the class helperName
    // also ensure it implements the HelperAdapter interface
    //
    // public class foo.bar.Compiled_<helper>_<NNN> extends foo.bar.<helper> implements HelperAdapter

    cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER, compiledHelperName, null, helperName,
            new String[] { "org/jboss/byteman/rule/helper/HelperAdapter" });
    // we need to install the source file name
    {
        String fullFileName = rule.getFile();
        int idx = fullFileName.lastIndexOf(java.io.File.separatorChar);
        String basicFileName = (idx < 0 ? fullFileName : fullFileName.substring(idx + 1));
        String debug = "// compiled from: " + fullFileName + "\n// generated by Byteman\n";
        cw.visitSource(basicFileName, debug);
    }
    {
        // we need a Hashmap field to hold the bindings
        //
        // private HashMap<String, Object> bindingMap;

        fv = cw.visitField(ACC_PRIVATE, "bindingMap", "Ljava/util/HashMap;",
                "Ljava/util/HashMap<Ljava/lang/String;Ljava/lang/Object;>;", null);
        fv.visitEnd();
    }
    {
        // and a rule field to hold the rule
        //
        // private Rule rule;

        fv = cw.visitField(ACC_PRIVATE, "rule", "Lorg/jboss/byteman/rule/Rule;",
                "Lorg/jboss/byteman/rule/Rule;", null);
        fv.visitEnd();
    }
    {
        // we need a constructor which takes a Rule as argument
        // if the helper implements a constructor which takes a Rule as argument then we invoke it
        // otherwise we invoke the empty helper constructor

        Constructor superConstructor = null;
        try {
            superConstructor = helperClass.getDeclaredConstructor(Rule.class);
        } catch (NoSuchMethodException e) {
            // hmm, ok see if there is an empty constructor
        } catch (SecurityException e) {
            throw new CompileException("Compiler.compileBytes : unable to access constructor for helper class "
                    + helperClass.getCanonicalName());
        }
        boolean superWantsRule = (superConstructor != null);
        if (!superWantsRule) {
            try {
                superConstructor = helperClass.getDeclaredConstructor();
            } catch (NoSuchMethodException e) {
                throw new CompileException(
                        "Compiler.compileBytes : no valid constructor found for helper class "
                                + helperClass.getCanonicalName());
            } catch (SecurityException e) {
                throw new CompileException(
                        "Compiler.compileBytes : unable to access constructor for helper class "
                                + helperClass.getCanonicalName());
            }
        }
        //
        //  public Compiled<helper>_<NNN>()Rule rule)
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(Lorg/jboss/byteman/rule/Rule;)V", null, null);
        mv.visitCode();
        // super();
        //
        // or
        //
        // super(Rule);
        if (superWantsRule) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitVarInsn(ALOAD, 1);
            mv.visitMethodInsn(INVOKESPECIAL, helperName, "<init>", "(Lorg/jboss/byteman/rule/Rule;)V");
        } else {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKESPECIAL, helperName, "<init>", "()V");
        }
        // bindingMap = new HashMap<String, Object);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitTypeInsn(NEW, "java/util/HashMap");
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, "java/util/HashMap", "<init>", "()V");
        mv.visitFieldInsn(PUTFIELD, compiledHelperName, "bindingMap", "Ljava/util/HashMap;");
        // this.rule = rule
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitFieldInsn(PUTFIELD, compiledHelperName, "rule", "Lorg/jboss/byteman/rule/Rule;");
        // return;
        mv.visitInsn(RETURN);
        mv.visitMaxs(3, 2);
        mv.visitEnd();
    }
    {
        // create the execute method
        //
        // public void execute(Bindings bindings, Object recipient, Object[] args) throws ExecuteException
        mv = cw.visitMethod(ACC_PUBLIC, "execute", "(Ljava/lang/Object;[Ljava/lang/Object;)V", null,
                new String[] { "org/jboss/byteman/rule/exception/ExecuteException" });
        mv.visitCode();
        // if (Transformer.isVerbose())
        mv.visitMethodInsn(INVOKESTATIC, "org/jboss/byteman/agent/Transformer", "isVerbose", "()Z");
        Label l0 = new Label();
        mv.visitJumpInsn(IFEQ, l0);
        // then
        // System.out.println(rule.getName() + " execute");
        mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
        mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, compiledHelperName, "rule", "Lorg/jboss/byteman/rule/Rule;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/rule/Rule", "getName", "()Ljava/lang/String;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                "(Ljava/lang/String;)Ljava/lang/StringBuilder;");
        mv.visitLdcInsn(" execute()");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                "(Ljava/lang/String;)Ljava/lang/StringBuilder;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
        // end if
        mv.visitLabel(l0);

        Bindings bindings = rule.getBindings();
        Iterator<Binding> iterator = bindings.iterator();

        while (iterator.hasNext()) {
            Binding binding = iterator.next();
            String name = binding.getName();
            if (binding.isAlias()) {
                // lookups and updates will use the aliased name
                continue;
            }
            if (binding.isHelper()) {
                // bindingMap.put(name, this);
                mv.visitVarInsn(ALOAD, 0);
                mv.visitFieldInsn(GETFIELD, compiledHelperName, "bindingMap", "Ljava/util/HashMap;");
                mv.visitLdcInsn(name);
                mv.visitVarInsn(ALOAD, 0);
                mv.visitMethodInsn(INVOKEVIRTUAL, "java/util/HashMap", "put",
                        "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
                mv.visitInsn(POP);
            } else if (binding.isRecipient()) {
                // bindingMap.put(name, recipient);
                mv.visitVarInsn(ALOAD, 0);
                mv.visitFieldInsn(GETFIELD, compiledHelperName, "bindingMap", "Ljava/util/HashMap;");
                mv.visitLdcInsn(name);
                mv.visitVarInsn(ALOAD, 1);
                mv.visitMethodInsn(INVOKEVIRTUAL, "java/util/HashMap", "put",
                        "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
                mv.visitInsn(POP);
                // } else if (binding.isParam() || binding.isLocalVar() || binding.isReturn() ||
                //             binding.isThrowable() || binding.isParamCount() || binding.isParamArray()) {
            } else if (!binding.isBindVar()) {
                // bindingMap.put(name, args[binding.getCallArrayIndex()]);
                mv.visitVarInsn(ALOAD, 0);
                mv.visitFieldInsn(GETFIELD, compiledHelperName, "bindingMap", "Ljava/util/HashMap;");
                mv.visitLdcInsn(name);
                mv.visitVarInsn(ALOAD, 2);
                mv.visitLdcInsn(binding.getCallArrayIndex());
                mv.visitInsn(AALOAD);
                mv.visitMethodInsn(INVOKEVIRTUAL, "java/util/HashMap", "put",
                        "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
                mv.visitInsn(POP);
            }
        }

        // execute0()
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKEVIRTUAL, compiledHelperName, "execute0", "()V");

        // now restore update bindings

        iterator = bindings.iterator();

        while (iterator.hasNext()) {
            Binding binding = iterator.next();
            if (binding.isAlias()) {
                continue;
            }
            String name = binding.getName();

            if (binding.isUpdated()) {
                // if (binding.isParam() || binding.isLocalVar() || binding.isReturn()) {
                if (!binding.isBindVar()) {
                    int idx = binding.getCallArrayIndex();
                    // Object value = bindingMap.get(name);
                    // args[idx] = value;
                    mv.visitVarInsn(ALOAD, 2); // args
                    mv.visitLdcInsn(idx);
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitFieldInsn(GETFIELD, compiledHelperName, "bindingMap", "Ljava/util/HashMap;");
                    mv.visitLdcInsn(name);
                    mv.visitMethodInsn(INVOKEVIRTUAL, "java/util/HashMap", "get",
                            "(Ljava/lang/Object;)Ljava/lang/Object;");
                    mv.visitInsn(AASTORE);
                }
            }
        }

        // return
        mv.visitInsn(RETURN);
        mv.visitMaxs(4, 3);
        mv.visitEnd();
    }
    {
        // create the setBinding method
        //
        // public void setBinding(String name, Object value)
        mv = cw.visitMethod(ACC_PUBLIC, "setBinding", "(Ljava/lang/String;Ljava/lang/Object;)V", null, null);
        mv.visitCode();
        //  bindingMap.put(name, value);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, compiledHelperName, "bindingMap", "Ljava/util/HashMap;");
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/util/HashMap", "put",
                "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
        mv.visitInsn(POP);
        // return
        mv.visitInsn(RETURN);
        mv.visitMaxs(3, 3);
        mv.visitEnd();
    }
    {
        // create the getBinding method
        //
        // public Object getBinding(String name)
        mv = cw.visitMethod(ACC_PUBLIC, "getBinding", "(Ljava/lang/String;)Ljava/lang/Object;", null, null);
        mv.visitCode();
        // {TOS} <== bindingMap.get(name);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, compiledHelperName, "bindingMap", "Ljava/util/HashMap;");
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/util/HashMap", "get", "(Ljava/lang/Object;)Ljava/lang/Object;");
        // return {TOS}
        mv.visitInsn(ARETURN);
        mv.visitMaxs(2, 2);
        mv.visitEnd();
    }
    {
        // create the getName method
        //
        // public String getName()
        mv = cw.visitMethod(ACC_PUBLIC, "getName", "()Ljava/lang/String;", null, null);
        mv.visitCode();
        // {TOS} <== rule.getName()
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, compiledHelperName, "rule", "Lorg/jboss/byteman/rule/Rule;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/rule/Rule", "getName", "()Ljava/lang/String;");
        // return {TOS}
        mv.visitInsn(ARETURN);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    // create the getAccessibleField method
    //
    // public Object getAccessibleField(Object owner, int fieldIndex)
    {
        mv = cw.visitMethod(ACC_PUBLIC, "getAccessibleField", "(Ljava/lang/Object;I)Ljava/lang/Object;", null,
                null);
        mv.visitCode();
        // {TOS} <== rule.getAccessibleField(owner, fieldIndex);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, compiledHelperName, "rule", "Lorg/jboss/byteman/rule/Rule;");
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ILOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/rule/Rule", "getAccessibleField",
                "(Ljava/lang/Object;I)Ljava/lang/Object;");
        // return {TOS}
        mv.visitInsn(ARETURN);
        mv.visitMaxs(3, 3);
        mv.visitEnd();
    }

    // create the setAccessibleField method
    //
    // public void setAccessibleField(Object owner, Object value, int fieldIndex)
    // rule.setAccessibleField(owner, value, fieldIndex);
    {
        mv = cw.visitMethod(ACC_PUBLIC, "setAccessibleField", "(Ljava/lang/Object;Ljava/lang/Object;I)V", null,
                null);
        mv.visitCode();
        // rule.setAccessibleField(owner, value, fieldIndex);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, compiledHelperName, "rule", "Lorg/jboss/byteman/rule/Rule;");
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitVarInsn(ILOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/rule/Rule", "setAccessibleField",
                "(Ljava/lang/Object;Ljava/lang/Object;I)V");
        // return
        mv.visitInsn(RETURN);
        mv.visitMaxs(4, 4);
        mv.visitEnd();
    }

    // create the invokeAccessibleMethod method
    //
    // public Object invokeAccessibleMethod(Object target, Object[] args, int methodIndex)
    // {TOS} <==  rule.invokeAccessibleMethod(target, args, methodIndex);
    {
        mv = cw.visitMethod(ACC_PUBLIC, "invokeAccessibleMethod",
                "(Ljava/lang/Object;[Ljava/lang/Object;I)Ljava/lang/Object;", null, null);
        mv.visitCode();
        // rule.invokeAccessibleMethod(target, args, fieldIndex);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, compiledHelperName, "rule", "Lorg/jboss/byteman/rule/Rule;");
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitVarInsn(ILOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/rule/Rule", "invokeAccessibleMethod",
                "(Ljava/lang/Object;[Ljava/lang/Object;I)Ljava/lang/Object;");
        // return {TOS}
        mv.visitInsn(ARETURN);
        mv.visitMaxs(4, 4);
        mv.visitEnd();
    }
    if (compileToBytecode) {
        // we generate a single execute0 method if we want to run compiled and get
        // the event, condiiton and action to insert the relevant bytecode to implement
        // bind(), test() and fire()

        {
            // create the execute0() method
            //
            // private void execute0()
            mv = cw.visitMethod(ACC_PRIVATE, "execute0", "()V", null,
                    new String[] { "org/jboss/byteman/rule/exception/ExecuteException" });
            mv.visitCode();
            CompileContext compileContext = new CompileContext(mv);
            // make sure we set the first line number before generating any code
            compileContext.notifySourceLine(rule.getLine());
            compileContext.addLocalCount(3); // for this and 2 object args
            // bind();
            rule.getEvent().compile(mv, compileContext);
            // if (test())
            rule.getCondition().compile(mv, compileContext);
            Label l0 = new Label();
            mv.visitJumpInsn(IFEQ, l0);
            compileContext.addStackCount(-1);
            // then
            rule.getAction().compile(mv, compileContext);
            // fire();
            // end if
            mv.visitLabel(l0);
            // this will match the ENDRULE line
            compileContext.notifySourceEnd();
            // return
            mv.visitInsn(RETURN);
            // need to specify correct Maxs values
            mv.visitMaxs(compileContext.getStackMax(), compileContext.getLocalMax());
            mv.visitEnd();
        }
    } else {
        // we generate the following methods if we want to run interpreted
        {
            // create the execute0() method
            //
            // private void execute0()
            mv = cw.visitMethod(ACC_PRIVATE, "execute0", "()V", null,
                    new String[] { "org/jboss/byteman/rule/exception/ExecuteException" });
            mv.visitCode();
            // bind();
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKESPECIAL, compiledHelperName, "bind", "()V");
            // if (test())
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKESPECIAL, compiledHelperName, "test", "()Z");
            Label l0 = new Label();
            mv.visitJumpInsn(IFEQ, l0);
            // then
            // fire();
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKESPECIAL, compiledHelperName, "fire", "()V");
            // end if
            mv.visitLabel(l0);
            // return
            mv.visitInsn(RETURN);
            mv.visitMaxs(1, 1);
            mv.visitEnd();
        }
        {
            // create the bind method
            //
            // private void bind()
            mv = cw.visitMethod(ACC_PRIVATE, "bind", "()V", null,
                    new String[] { "org/jboss/byteman/rule/exception/ExecuteException" });
            mv.visitCode();
            // rule.getEvent().interpret(this);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, compiledHelperName, "rule", "Lorg/jboss/byteman/rule/Rule;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/rule/Rule", "getEvent",
                    "()Lorg/jboss/byteman/rule/Event;");
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/rule/Event", "interpret",
                    "(Lorg/jboss/byteman/rule/helper/HelperAdapter;)Ljava/lang/Object;");
            mv.visitInsn(RETURN);
            mv.visitMaxs(2, 1);
            mv.visitEnd();
        }
        {
            // create the test method
            //
            // private boolean test()
            mv = cw.visitMethod(ACC_PRIVATE, "test", "()Z", null,
                    new String[] { "org/jboss/byteman/rule/exception/ExecuteException" });
            mv.visitCode();
            // {TOS} <== rule.getCondition().interpret(this);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, compiledHelperName, "rule", "Lorg/jboss/byteman/rule/Rule;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/rule/Rule", "getCondition",
                    "()Lorg/jboss/byteman/rule/Condition;");
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/rule/Condition", "interpret",
                    "(Lorg/jboss/byteman/rule/helper/HelperAdapter;)Ljava/lang/Object;");
            mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Boolean");
            // unbox the returned Boolean
            mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Boolean", "booleanValue", "()Z");
            // return {TOS}
            mv.visitInsn(IRETURN);
            mv.visitMaxs(2, 1);
            mv.visitEnd();
        }
        {
            // create the fire method
            //
            // private void fire()
            mv = cw.visitMethod(ACC_PRIVATE, "fire", "()V", null,
                    new String[] { "org/jboss/byteman/rule/exception/ExecuteException" });
            mv.visitCode();
            // rule.getAction().interpret(this);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, compiledHelperName, "rule", "Lorg/jboss/byteman/rule/Rule;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/rule/Rule", "getAction",
                    "()Lorg/jboss/byteman/rule/Action;");
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/rule/Action", "interpret",
                    "(Lorg/jboss/byteman/rule/helper/HelperAdapter;)Ljava/lang/Object;");
            // return
            mv.visitInsn(RETURN);
            mv.visitMaxs(2, 1);
            mv.visitEnd();
        }
    }

    cw.visitEnd();

    return cw.toByteArray();
}