Example usage for org.objectweb.asm MethodVisitor visitIincInsn

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

Introduction

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

Prototype

public void visitIincInsn(final int var, final int increment) 

Source Link

Document

Visits an IINC instruction.

Usage

From source file:org.codehaus.aspectwerkz.transform.inlining.compiler.AbstractJoinPointCompiler.java

License:Open Source License

/**
 * Creates invocations fo the after finally interceptors.
 *
 * @param cv//from  w  w w  .  j a v a  2  s .c o m
 * @param joinPointInstanceIndex
 * @param registerDepth
 */
private void createAfterInterceptorInvocations(final MethodVisitor cv, final int joinPointInstanceIndex,
        final int registerDepth) {
    final int loopIndex = registerDepth + 1;
    cv.visitVarInsn(ALOAD, joinPointInstanceIndex);
    cv.visitFieldInsn(GETFIELD, m_joinPointClassName, NR_OF_AFTER_INTERCEPTORS_FIELD_NAME, I);
    cv.visitInsn(ICONST_1);
    cv.visitInsn(ISUB);
    cv.visitVarInsn(ISTORE, loopIndex);
    Label loopLabel1 = new Label();
    cv.visitLabel(loopLabel1);
    cv.visitVarInsn(ILOAD, loopIndex);
    Label loopLabel2 = new Label();
    cv.visitJumpInsn(IFLT, loopLabel2);
    cv.visitVarInsn(ALOAD, joinPointInstanceIndex);
    cv.visitFieldInsn(GETFIELD, m_joinPointClassName, AFTER_INTERCEPTORS_FIELD_NAME,
            AFTER_ADVICE_ARRAY_CLASS_SIGNATURE);
    cv.visitVarInsn(ILOAD, loopIndex);
    cv.visitInsn(AALOAD);
    cv.visitVarInsn(ALOAD, joinPointInstanceIndex);
    cv.visitMethodInsn(INVOKEINTERFACE, AFTER_ADVICE_CLASS_NAME, INTERCEPT_INVOKE_METHOD_NAME,
            AFTER_ADVICE_INVOKE_METHOD_SIGNATURE);
    cv.visitIincInsn(loopIndex, -1);
    cv.visitJumpInsn(GOTO, loopLabel1);
    cv.visitLabel(loopLabel2);
}

From source file:org.codehaus.aspectwerkz.transform.inlining.compiler.AbstractJoinPointCompiler.java

License:Open Source License

/**
 * Creates invocations fo the after returning interceptors.
 *
 * @param cv/*  w ww.j a v a  2 s . c om*/
 * @param joinPointInstanceIndex
 * @param returnValueInstanceIndex
 */
private void createAfterReturningInterceptorInvocations(final MethodVisitor cv,
        final int joinPointInstanceIndex, final int returnValueInstanceIndex) {
    final int loopIndex = returnValueInstanceIndex + 1;
    cv.visitVarInsn(ALOAD, joinPointInstanceIndex);
    cv.visitFieldInsn(GETFIELD, m_joinPointClassName, NR_OF_AFTER_RETURNING_INTERCEPTORS_FIELD_NAME, I);
    cv.visitInsn(ICONST_1);
    cv.visitInsn(ISUB);
    cv.visitVarInsn(ISTORE, loopIndex);
    Label loopLabel1 = new Label();
    cv.visitLabel(loopLabel1);
    cv.visitVarInsn(ILOAD, loopIndex);
    Label loopLabel2 = new Label();
    cv.visitJumpInsn(IFLT, loopLabel2);
    cv.visitVarInsn(ALOAD, joinPointInstanceIndex);
    cv.visitFieldInsn(GETFIELD, m_joinPointClassName, AFTER_RETURNING_INTERCEPTORS_FIELD_NAME,
            AFTER_RETURNING_ADVICE_ARRAY_CLASS_SIGNATURE);
    cv.visitVarInsn(ILOAD, loopIndex);
    cv.visitInsn(AALOAD);
    cv.visitVarInsn(ALOAD, joinPointInstanceIndex);
    cv.visitVarInsn(ALOAD, returnValueInstanceIndex);
    cv.visitMethodInsn(INVOKEINTERFACE, AFTER_RETURNING_ADVICE_CLASS_NAME, INTERCEPT_INVOKE_METHOD_NAME,
            AFTER_RETURNING_ADVICE_INVOKE_METHOD_SIGNATURE);
    cv.visitIincInsn(loopIndex, -1);
    cv.visitJumpInsn(GOTO, loopLabel1);
    cv.visitLabel(loopLabel2);
}

From source file:org.codehaus.aspectwerkz.transform.inlining.compiler.AbstractJoinPointCompiler.java

License:Open Source License

/**
 * Creates invocations fo the after returning interceptors.
 *
 * @param cv//www.  j a  v  a2  s  . com
 * @param joinPointInstanceIndex
 * @param exceptionInstanceIndex
 */
private void createAfterThrowingInterceptorInvocations(final MethodVisitor cv, final int joinPointInstanceIndex,
        final int exceptionInstanceIndex) {
    final int loopIndex = exceptionInstanceIndex + 1;
    cv.visitVarInsn(ALOAD, joinPointInstanceIndex);
    cv.visitFieldInsn(GETFIELD, m_joinPointClassName, NR_OF_AFTER_THROWING_INTERCEPTORS_FIELD_NAME, I);
    cv.visitInsn(ICONST_1);
    cv.visitInsn(ISUB);
    cv.visitVarInsn(ISTORE, loopIndex);
    Label loopLabel1 = new Label();
    cv.visitLabel(loopLabel1);
    cv.visitVarInsn(ILOAD, loopIndex);
    Label loopLabel2 = new Label();
    cv.visitJumpInsn(IFLT, loopLabel2);
    cv.visitVarInsn(ALOAD, joinPointInstanceIndex);
    cv.visitFieldInsn(GETFIELD, m_joinPointClassName, AFTER_THROWING_INTERCEPTORS_FIELD_NAME,
            AFTER_THROWING_ADVICE_ARRAY_CLASS_SIGNATURE);
    cv.visitVarInsn(ILOAD, loopIndex);
    cv.visitInsn(AALOAD);
    cv.visitVarInsn(ALOAD, joinPointInstanceIndex);
    cv.visitVarInsn(ALOAD, exceptionInstanceIndex);
    cv.visitMethodInsn(INVOKEINTERFACE, AFTER_THROWING_ADVICE_CLASS_NAME, INTERCEPT_INVOKE_METHOD_NAME,
            AFTER_THROWING_ADVICE_INVOKE_METHOD_SIGNATURE);
    cv.visitIincInsn(loopIndex, -1);
    cv.visitJumpInsn(GOTO, loopLabel1);
    cv.visitLabel(loopLabel2);
}

From source file:org.codehaus.groovy.classgen.asm.sc.StaticTypesStatementWriter.java

License:Apache License

private void writeOptimizedForEachLoop(CompileStack compileStack, OperandStack operandStack, MethodVisitor mv,
        ForStatement loop, Expression collectionExpression, ClassNode collectionType, Parameter loopVariable) {
    BytecodeVariable variable = compileStack.defineVariable(loopVariable, false);

    Label continueLabel = compileStack.getContinueLabel();
    Label breakLabel = compileStack.getBreakLabel();

    AsmClassGenerator acg = controller.getAcg();

    // load array on stack
    collectionExpression.visit(acg);/*  w  w w . j av a2s.c om*/
    mv.visitInsn(DUP);
    int array = compileStack.defineTemporaryVariable("$arr", collectionType, true);
    mv.visitJumpInsn(IFNULL, breakLabel);

    // $len = array.length
    mv.visitVarInsn(ALOAD, array);
    mv.visitInsn(ARRAYLENGTH);
    operandStack.push(ClassHelper.int_TYPE);
    int arrayLen = compileStack.defineTemporaryVariable("$len", ClassHelper.int_TYPE, true);

    // $idx = 0
    mv.visitInsn(ICONST_0);
    operandStack.push(ClassHelper.int_TYPE);
    int loopIdx = compileStack.defineTemporaryVariable("$idx", ClassHelper.int_TYPE, true);

    mv.visitLabel(continueLabel);
    // $idx<$len?
    mv.visitVarInsn(ILOAD, loopIdx);
    mv.visitVarInsn(ILOAD, arrayLen);
    mv.visitJumpInsn(IF_ICMPGE, breakLabel);

    // get array element
    loadFromArray(mv, variable, array, loopIdx);

    // $idx++
    mv.visitIincInsn(loopIdx, 1);

    // loop body
    loop.getLoopBlock().visit(acg);

    mv.visitJumpInsn(GOTO, continueLabel);

    mv.visitLabel(breakLabel);

    compileStack.removeVar(loopIdx);
    compileStack.removeVar(arrayLen);
    compileStack.removeVar(array);
}

From source file:org.fabric3.monitor.impl.proxy.BytecodeMonitorProxyService.java

License:Open Source License

/**
 * Creates the writeParameters method. The method signature will take the same arguments as the proxy interface method that it is to be invoked from.
 *
 * @param cw         the class writer/*from   ww w .j  a va  2s . c o m*/
 * @param index      the method index
 * @param signature  the parameter signature
 * @param paramTypes the parameter types
 */
private void writeGenerateParametersMethod(ClassWriter cw, int index, String signature, Class<?>[] paramTypes) {
    int varMethodArgOffset = 1;

    int offset = calculateParameterSpace(paramTypes);

    int varEntryPosition = offset + 1;
    int varNumberArgsPosition = varEntryPosition + 1;
    int varParamEntryPosition = varNumberArgsPosition + 1;
    int varIPosition = varParamEntryPosition + 1;

    MethodVisitor mv = cw.visitMethod(ACC_PRIVATE, "writeParameters" + index, signature, null, null);

    mv.visitCode();
    Label l0 = new Label();
    mv.visitLabel(l0);
    mv.visitLineNumber(103, l0);

    // set the number of arguments for this method
    pushInteger(paramTypes.length, mv);
    mv.visitVarInsn(ISTORE, varNumberArgsPosition);

    Label l1 = new Label();
    mv.visitLabel(l1);
    mv.visitLineNumber(104, l1);

    mv.visitVarInsn(ALOAD, varEntryPosition); //set the param entry limit
    mv.visitVarInsn(ILOAD, varNumberArgsPosition);
    mv.visitMethodInsn(INVOKEVIRTUAL, MONITOR_EVENT_ENTRY, "setLimit", "(I)V");

    Label l2 = new Label();
    mv.visitLabel(l2);
    mv.visitLineNumber(112, l2);

    // Setup i variable for the for loop and then iterate until the number of arguments is reached
    mv.visitInsn(ICONST_0);
    mv.visitVarInsn(ISTORE, varIPosition);

    Label l3 = new Label();
    mv.visitLabel(l3);

    // jump if i (specified by the for loop) is greater than the number of arguments
    mv.visitVarInsn(ILOAD, varIPosition);
    mv.visitVarInsn(ILOAD, varNumberArgsPosition);
    Label l4 = new Label();
    mv.visitJumpInsn(IF_ICMPGE, l4);

    Label endIf = new Label();
    for (int i = 0; i < paramTypes.length; i++) {
        // load ring buffer entry
        mv.visitVarInsn(ALOAD, varEntryPosition);
        mv.visitMethodInsn(INVOKEVIRTUAL, MONITOR_EVENT_ENTRY, "getEntries", "()[L" + PARAM_ENTRY + ";");
        pushInteger(i, mv);
        mv.visitInsn(AALOAD);
        mv.visitVarInsn(ASTORE, varParamEntryPosition);
        mv.visitVarInsn(ALOAD, varParamEntryPosition);

        Class<?> paramType = paramTypes[i];
        if (Character.TYPE.equals(paramType)) {
            // load method parameter
            mv.visitVarInsn(ILOAD, varMethodArgOffset + i);
            mv.visitMethodInsn(INVOKEVIRTUAL, PARAM_ENTRY, "setCharValue", "(C)V");
        } else if (Integer.TYPE.equals(paramType)) {
            mv.visitVarInsn(ILOAD, varMethodArgOffset + i);
            mv.visitMethodInsn(INVOKEVIRTUAL, PARAM_ENTRY, "setIntValue", "(I)V");
        } else if (Long.TYPE.equals(paramType)) {
            mv.visitVarInsn(LLOAD, varMethodArgOffset + i);
            mv.visitMethodInsn(INVOKEVIRTUAL, PARAM_ENTRY, "setLongValue", "(J)V");
        } else if (Double.TYPE.equals(paramType)) {
            mv.visitVarInsn(DLOAD, varMethodArgOffset + i);
            mv.visitMethodInsn(INVOKEVIRTUAL, PARAM_ENTRY, "setDoubleValue", "(D)V");
        } else if (Boolean.TYPE.equals(paramType)) {
            mv.visitVarInsn(ILOAD, varMethodArgOffset + i);
            mv.visitMethodInsn(INVOKEVIRTUAL, PARAM_ENTRY, "setBooleanValue", "(Z)V");
        } else if (Float.TYPE.equals(paramType)) {
            mv.visitVarInsn(FLOAD, varMethodArgOffset + i);
            mv.visitMethodInsn(INVOKEVIRTUAL, PARAM_ENTRY, "setFloatValue", "(F)V");
        } else if (Short.TYPE.equals(paramType)) {
            mv.visitVarInsn(ILOAD, varMethodArgOffset + i);
            mv.visitMethodInsn(INVOKEVIRTUAL, PARAM_ENTRY, "setShortValue", "(S)V");
        } else if (Byte.TYPE.equals(paramType)) {
            mv.visitVarInsn(ILOAD, varMethodArgOffset + i);
            mv.visitMethodInsn(INVOKEVIRTUAL, PARAM_ENTRY, "setByteValue", "(B)V");
        } else if (Object.class.isAssignableFrom(paramType)) {
            mv.visitVarInsn(ALOAD, varMethodArgOffset + i);
            mv.visitMethodInsn(INVOKEVIRTUAL, PARAM_ENTRY, "setObjectValue", "(Ljava/lang/Object;)V");
        } else {
            throw new AssertionError("Unhandled type: " + paramType);
        }
    }
    mv.visitLabel(endIf);
    mv.visitLineNumber(121, endIf);

    // increment i and counter, then loop
    mv.visitIincInsn(varIPosition, 1);
    mv.visitJumpInsn(GOTO, l3);
    // end of for loop

    mv.visitLabel(l4);

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

    mv.visitLocalVariable("this", "L" + ABSTRACT_MONITOR_HANDLER + ";", null, l0, endMethod, 0);

    for (int i = 1; i <= paramTypes.length; i++) {
        Class<?> paramType = paramTypes[i - 1];
        if (Integer.TYPE.equals(paramType)) {
            mv.visitLocalVariable("arg" + i, "I", null, l0, endMethod, i + 1);
        } else if (Long.TYPE.equals(paramType)) {
            mv.visitLocalVariable("arg" + i, "J", null, l0, endMethod, i + 1);
        } else if (Double.TYPE.equals(paramType)) {
            mv.visitLocalVariable("arg" + i, "D", null, l0, endMethod, i + 1);
        } else if (Boolean.TYPE.equals(paramType)) {
            mv.visitLocalVariable("arg" + i, "Z", null, l0, endMethod, i + 1);
        } else if (Float.TYPE.equals(paramType)) {
            mv.visitLocalVariable("arg" + i, "F", null, l0, endMethod, i + 1);
        } else if (Short.TYPE.equals(paramType)) {
            mv.visitLocalVariable("arg" + i, "S", null, l0, endMethod, i + 1);
        } else if (Byte.TYPE.equals(paramType)) {
            mv.visitLocalVariable("arg" + i, "B", null, l0, endMethod, i + 1);
        } else if (Character.TYPE.equals(paramType)) {
            mv.visitLocalVariable("arg" + i, "C", null, l0, endMethod, i + 1);
        } else if (paramType.isPrimitive()) {
            throw new AssertionError("Unhandled type");
        } else {
            mv.visitLocalVariable("arg" + i, "Ljava/lang/Object;", null, l0, endMethod, i + 1);
        }
    }

    mv.visitLocalVariable("entry", "L" + MONITOR_EVENT_ENTRY + ";", null, l0, endMethod, varEntryPosition);
    mv.visitLocalVariable("numberArgs", "I", null, l1, endMethod, varNumberArgsPosition);
    mv.visitLocalVariable("current", "L" + PARAM_ENTRY + ";", null, l2, endMethod, varParamEntryPosition);
    mv.visitLocalVariable("i", "I", null, l2, endMethod, varIPosition);

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

}

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  a  va  2  s.co m
    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.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  . ja  v  a  2  s. c o 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.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;/*  www  . j  a v a  2s .  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.lwjglx.autostack.Transformer.java

License:Open Source License

public byte[] transform(ClassLoader loader, final String className, Class<?> classBeingRedefined,
        ProtectionDomain protectionDomain, byte[] classfileBuffer) {
    try {//from   w  w  w.j  a  v a2 s  .c  o  m
        if (className == null || className.startsWith("java/") || className.startsWith("sun/")
                || className.startsWith("jdk/internal/") || className.startsWith("org/lwjgl/"))
            return null;
        for (String pack : packages)
            if (!className.startsWith(pack))
                return null;
        ClassReader cr = new ClassReader(classfileBuffer);
        final Map<String, Integer> stackMethods = new HashMap<String, Integer>();
        // Scan all methods that need auto-stack
        if (debugTransform)
            System.out.println("[autostack] scanning methods in class: " + className.replace('/', '.'));
        cr.accept(new ClassVisitor(ASM7) {
            public MethodVisitor visitMethod(final int access, final String methodName, final String methodDesc,
                    String signature, String[] exceptions) {
                if ((access & (ACC_NATIVE | ACC_ABSTRACT)) != 0) {
                    // Don't try to analyze native or abstract methods.
                    return null;
                }
                MethodVisitor mv = new MethodVisitor(ASM7) {
                    boolean mark, catches, notransform, nostackparam, forcestack;

                    public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
                        if ("Lorg/lwjglx/autostack/NoTransform;".equals(desc))
                            notransform = true;
                        else if ("Lorg/lwjglx/autostack/NoStackParam;".equals(desc))
                            nostackparam = true;
                        else if ("Lorg/lwjglx/autostack/UseNewStack;".equals(desc))
                            forcestack = true;
                        return null;
                    }

                    public void visitMethodInsn(int opcode, String owner, String name, String desc,
                            boolean itf) {
                        if (opcode == INVOKESTATIC && !itf && (owner.startsWith("org/lwjgl/")
                                && (name.equals("mallocStack") || name.equals("callocStack"))
                                || owner.equals(MEMORYSTACK) && (name.equals("stackGet")
                                        || name.equals("stackPop") || name.equals("stackPush")
                                        || name.startsWith("stackMalloc") || name.startsWith("stackCalloc")
                                        || name.startsWith("nstackMalloc") || name.startsWith("nstackCalloc")
                                        || name.equals("stackUTF8") || name.equals("stackASCII")
                                        || name.equals("stackUTF16") || name.equals("stackFloats")
                                        || name.equals("stackInts") || name.equals("stackBytes")
                                        || name.equals("stackShorts") || name.equals("stackPointers")
                                        || name.equals("stackLongs")))) {
                            mark = true;
                        }
                    }

                    public void visitTryCatchBlock(Label start, Label end, Label handler, String type) {
                        catches = true;
                    }

                    public void visitEnd() {
                        int flag = (access & ACC_PRIVATE) != 0 ? 8 : 0;
                        flag |= nostackparam ? 16 : 0;
                        if (mark || notransform || forcestack || nostackparam) {
                            if (notransform) {
                                flag |= 2;
                                if (debugTransform)
                                    System.out.println("[autostack]   will not transform method: "
                                            + className.replace('/', '.') + "." + methodName);
                            } else {
                                if (checkStack)
                                    flag |= 4;
                                flag |= catches ? 1 : 0;
                                if (debugTransform)
                                    System.out.println("[autostack]   will transform method: "
                                            + className.replace('/', '.') + "." + methodName);
                            }
                            stackMethods.put(methodName + methodDesc, Integer.valueOf(flag));
                        }
                    }
                };
                return mv;
            }
        }, ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
        if (stackMethods.isEmpty())
            return null;

        // Now, transform all such methods
        if (debugTransform)
            System.out.println("[autostack] transforming methods in class: " + className.replace('/', '.'));
        ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS);
        cr.accept(new ClassVisitor(ASM7, cw) {
            boolean classDefaultNewStack = defaultNewStack;
            boolean classNoTransform;

            @Override
            public void visit(int version, int access, String name, String signature, String superName,
                    String[] interfaces) {
                cv.visit(version, access, name, signature, superName, interfaces);
                if (!checkStack) {
                    return;
                }
                /* Generate simple synthetic "compare stack pointers and throw if not equal" method */
                MethodVisitor mv = cv.visitMethod(ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC, "$checkStack$",
                        "(II)V", null, new String[] { "java/lang/AssertionError" });
                {
                    mv.visitCode();
                    mv.visitVarInsn(ILOAD, 0);
                    mv.visitVarInsn(ILOAD, 1);
                    Label l0 = new Label();
                    mv.visitJumpInsn(IF_ICMPEQ, l0);
                    mv.visitTypeInsn(NEW, "java/lang/IllegalStateException");
                    mv.visitInsn(DUP);
                    mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
                    mv.visitInsn(DUP);
                    mv.visitLdcInsn("Stack pointers differ: ");
                    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>",
                            "(Ljava/lang/String;)V", false);
                    mv.visitVarInsn(ILOAD, 0);
                    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                            "(I)Ljava/lang/StringBuilder;", false);
                    mv.visitLdcInsn(" != ");
                    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                            "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
                    mv.visitVarInsn(ILOAD, 1);
                    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                            "(I)Ljava/lang/StringBuilder;", false);
                    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString",
                            "()Ljava/lang/String;", false);
                    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/IllegalStateException", "<init>",
                            "(Ljava/lang/String;)V", false);
                    mv.visitInsn(ATHROW);
                    mv.visitLabel(l0);
                    mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
                    mv.visitInsn(RETURN);
                    mv.visitMaxs(5, 2);
                    mv.visitEnd();
                }

                mv = cv.visitMethod(ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC, "$checkStackWithThrowable$",
                        "(Ljava/lang/Throwable;II)Ljava/lang/Throwable;", null, null);
                {
                    mv.visitCode();
                    mv.visitVarInsn(ILOAD, 1);
                    mv.visitVarInsn(ILOAD, 2);
                    Label l0 = new Label();
                    mv.visitJumpInsn(IF_ICMPEQ, l0);
                    mv.visitTypeInsn(NEW, "java/lang/IllegalStateException");
                    mv.visitInsn(DUP);
                    mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
                    mv.visitInsn(DUP);
                    mv.visitLdcInsn("Stack pointers differ: ");
                    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>",
                            "(Ljava/lang/String;)V", false);
                    mv.visitVarInsn(ILOAD, 1);
                    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                            "(I)Ljava/lang/StringBuilder;", false);
                    mv.visitLdcInsn(" != ");
                    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                            "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
                    mv.visitVarInsn(ILOAD, 2);
                    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                            "(I)Ljava/lang/StringBuilder;", false);
                    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString",
                            "()Ljava/lang/String;", false);
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/IllegalStateException", "<init>",
                            "(Ljava/lang/String;Ljava/lang/Throwable;)V", false);
                    mv.visitInsn(ARETURN);
                    mv.visitLabel(l0);
                    mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitInsn(ARETURN);
                    mv.visitMaxs(5, 3);
                    mv.visitEnd();
                }
            }

            public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
                if ("Lorg/lwjglx/autostack/UseCallerStack;".equals(desc)) {
                    if (debugTransform)
                        System.out.println(
                                "[autostack]   class declares to use caller stack for all methods, unless overridden by method");
                    classDefaultNewStack = false;
                    return null;
                } else if ("Lorg/lwjglx/autostack/UseNewStack;".equals(desc)) {
                    if (debugTransform)
                        System.out.println(
                                "[autostack]   class declares to use new stack for all methods, unless overridden by method");
                    classDefaultNewStack = true;
                    return null;
                } else if ("Lorg/lwjglx/autostack/NoTransform;".equals(desc)) {
                    if (debugTransform)
                        System.out.println("[autostack]   class declares to not transform any methods");
                    classNoTransform = true;
                    return null;
                }
                return cv.visitAnnotation(desc, visible);
            }

            public MethodVisitor visitMethod(final int access, final String name, final String desc,
                    String signature, String[] exceptions) {
                Integer info = stackMethods.get(name + desc);
                if (info == null)
                    return super.visitMethod(access, name, desc, signature, exceptions);
                boolean catches = (info.intValue() & 1) == 1;
                final boolean notransform = classNoTransform || (info.intValue() & 2) == 2;
                if (debugTransform && !notransform)
                    System.out.println(
                            "[autostack]   transform method: " + className.replace('/', '.') + "." + name);
                final boolean memoryStackParam = stackAsParameter && (access & ACC_PRIVATE) != 0
                        && (info.intValue() & 16) == 0;
                MethodVisitor mv;
                final Type[] paramTypes = Type.getArgumentTypes(desc);
                final boolean isStatic = (access & ACC_STATIC) != 0;
                final boolean isConstructor = "<init>".equals(name);
                if (memoryStackParam) {
                    if (debugTransform)
                        System.out.println(
                                "[autostack]     changing signature of method to add additional MemoryStack parameter");

                    // Add additional MemoryStack parameter to the method signature index of the local stays the same
                    int paramEndIndex = desc.indexOf(')');
                    String beforeDesc = desc.substring(0, paramEndIndex);
                    String afterDesc = desc.substring(paramEndIndex);
                    mv = super.visitMethod(access | ACC_SYNTHETIC, name,
                            beforeDesc + "L" + MEMORYSTACK + ";" + afterDesc, signature, exceptions);

                    // Re-introduce the original method which just delegates
                    if (debugTransform)
                        System.out.println("[autostack]     adding delegate method with original signature");
                    MethodVisitor omv = super.visitMethod(access, name, desc, signature, exceptions);
                    omv.visitCode();
                    int param = 0;
                    if (!isStatic) {
                        omv.visitVarInsn(ALOAD, 0);
                        param++;
                    }
                    for (int i = 0; i < paramTypes.length; i++) {
                        omv.visitVarInsn(paramTypes[i].getOpcode(ILOAD), param);
                        param += paramTypes[i].getSize();
                    }
                    omv.visitMethodInsn(INVOKESTATIC, MEMORYSTACK, "stackGet", "()L" + MEMORYSTACK + ";",
                            false);
                    boolean isPrivate = (access & ACC_PRIVATE) != 0;
                    int opcode = isStatic ? INVOKESTATIC : isPrivate ? INVOKESPECIAL : INVOKEVIRTUAL;
                    omv.visitMethodInsn(opcode, className, name,
                            beforeDesc + "L" + MEMORYSTACK + ";" + afterDesc, false);
                    Type retType = Type.getReturnType(desc);
                    omv.visitInsn(retType.getOpcode(IRETURN));
                    omv.visitMaxs(-1, -1);
                    omv.visitEnd();
                } else {
                    mv = super.visitMethod(access, name, desc, signature, exceptions);
                }
                if (catches)
                    mv = new TryCatchBlockSorter(mv, access, name, desc, signature, exceptions);
                mv = new MethodVisitor(ASM7, mv) {
                    Label tryLabel = new Label();
                    Label finallyLabel = new Label();
                    int lastLine = 0;
                    boolean newStack = classDefaultNewStack;
                    int stackVarIndex;
                    int stackPointerVarIndex;
                    int firstAdditionalLocal;
                    int additionalLocals;
                    Object[] replacedLocals;

                    public void visitInsn(int opcode) {
                        if (notransform) {
                            mv.visitInsn(opcode);
                            return;
                        }
                        if (opcode >= IRETURN && opcode <= RETURN && (newStack || checkStack)) {
                            if (debugRuntime && newStack && !checkStack) {
                                mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out",
                                        "Ljava/io/PrintStream;");
                                mv.visitLdcInsn("[autostack] restore stack pointer because of return at "
                                        + className.replace('/', '.') + "." + name + ":" + lastLine);
                                mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println",
                                        "(Ljava/lang/String;)V", false);
                            }
                            if (newStack && !checkStack) {
                                mv.visitVarInsn(ALOAD, stackVarIndex);
                                mv.visitVarInsn(ILOAD, stackPointerVarIndex);
                                mv.visitMethodInsn(INVOKEVIRTUAL, MEMORYSTACK, "setPointer", "(I)V", false);
                            } else if (checkStack) {
                                mv.visitVarInsn(ILOAD, stackPointerVarIndex);
                                mv.visitVarInsn(ALOAD, stackVarIndex);
                                mv.visitMethodInsn(INVOKEVIRTUAL, MEMORYSTACK, "getPointer", "()I", false);
                                mv.visitMethodInsn(INVOKESTATIC, className, "$checkStack$", "(II)V", false);
                            }
                        }
                        mv.visitInsn(opcode);
                    }

                    public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
                        if ("Lorg/lwjglx/autostack/UseCallerStack;".equals(desc)) {
                            if (!notransform) {
                                if (debugTransform)
                                    System.out.println("[autostack]     method declares to use caller stack");
                                newStack = false;
                            }
                            return null;
                        } else if ("Lorg/lwjglx/autostack/UseNewStack;".equals(desc)) {
                            if (!notransform) {
                                if (debugTransform)
                                    System.out.println("[autostack]     method declares to use new stack");
                                newStack = true;
                            }
                            return null;
                        } else if ("Lorg/lwjglx/autostack/NoTransform;".equals(desc)) {
                            return null;
                        } else if ("Lorg/lwjglx/autostack/NoStackParam;".equals(desc)) {
                            return null;
                        }
                        return mv.visitAnnotation(desc, visible);
                    }

                    public void visitVarInsn(int opcode, int var) {
                        if (notransform) {
                            mv.visitVarInsn(opcode, var);
                            return;
                        }
                        if (var >= firstAdditionalLocal)
                            var += additionalLocals;
                        mv.visitVarInsn(opcode, var);
                    }

                    public void visitIincInsn(int var, int increment) {
                        if (notransform) {
                            mv.visitIincInsn(var, increment);
                            return;
                        }
                        if (var >= firstAdditionalLocal)
                            var += additionalLocals;
                        mv.visitIincInsn(var, increment);
                    }

                    public void visitFrame(int type, int nLocal, Object[] local, int nStack, Object[] stack) {
                        if (notransform) {
                            mv.visitFrame(type, nLocal, local, nStack, stack);
                            return;
                        }
                        if (type == F_FULL) {
                            int noThis = isStatic ? 0 : 1;
                            Object[] locals = new Object[local.length + additionalLocals];
                            if (!isStatic)
                                locals[0] = local[0];
                            int replacementLength = replacedLocals.length;
                            System.arraycopy(replacedLocals, noThis, locals, noThis,
                                    replacementLength - noThis);
                            int len = locals.length - replacementLength;
                            System.arraycopy(local, replacementLength - additionalLocals, locals,
                                    replacementLength, len);
                            mv.visitFrame(type, nLocal + additionalLocals, locals, nStack, stack);
                        } else
                            mv.visitFrame(type, nLocal, local, nStack, stack);
                    }

                    public void visitLocalVariable(String name, String desc, String signature, Label start,
                            Label end, int index) {
                        if (notransform) {
                            mv.visitLocalVariable(name, desc, signature, start, end, index);
                            return;
                        }
                        if (index >= firstAdditionalLocal)
                            index += additionalLocals;
                        mv.visitLocalVariable(name, desc, signature, start, end, index);
                    }

                    private boolean doesNotTakeStackItself(String desc) {
                        return desc.lastIndexOf("L" + MEMORYSTACK + ";)") == -1;
                    }

                    public void visitMethodInsn(int opcode, String owner, String name, String desc,
                            boolean itf) {
                        String completeName = name + desc;
                        Integer info = stackMethods.get(completeName);
                        if (opcode != INVOKESTATIC || notransform) {
                            mv.visitMethodInsn(opcode, owner, name, desc, itf);
                            return;
                        }
                        if (stackAsParameter && info != null && (info.intValue() & 8) != 0
                                && (info.intValue() & 16) == 0) {
                            /* Rewrite invocation to have additional MemoryStack parameter */
                            if (debugTransform)
                                System.out.println(
                                        "[autostack]     rewrite invocation of " + owner.replace('/', '.') + "."
                                                + name + " at line " + lastLine + " --> "
                                                + owner.replace('/', '.') + "." + name + "(..., MemoryStack)");
                            int paramEndIndex = desc.indexOf(')');
                            String beforeDesc = desc.substring(0, paramEndIndex);
                            String afterDesc = desc.substring(paramEndIndex);
                            mv.visitVarInsn(ALOAD, stackVarIndex);
                            mv.visitMethodInsn(opcode, owner, name,
                                    beforeDesc + "L" + MEMORYSTACK + ";" + afterDesc, itf);
                            return;
                        }
                        if (owner.startsWith("org/lwjgl/")
                                && (name.equals("mallocStack") || name.equals("callocStack"))
                                && doesNotTakeStackItself(desc)) {
                            if (debugTransform)
                                System.out.println(
                                        "[autostack]     rewrite invocation of " + owner.replace('/', '.') + "."
                                                + name + " at line " + lastLine + " --> aload " + stackVarIndex
                                                + "; invokestatic " + owner.replace('/', '.') + "." + name);
                            mv.visitVarInsn(ALOAD, stackVarIndex);
                            int paramEndIndex = desc.indexOf(')');
                            String beforeDesc = desc.substring(0, paramEndIndex);
                            String afterDesc = desc.substring(paramEndIndex);
                            mv.visitMethodInsn(opcode, owner, name,
                                    beforeDesc + "L" + MEMORYSTACK + ";" + afterDesc, false);
                        } else if (owner.equals(MEMORYSTACK) && name.equals("stackGet")) {
                            if (debugTransform)
                                System.out.println("[autostack]     rewrite invocation of "
                                        + owner.replace('/', '.') + "." + name + " at line " + lastLine
                                        + " --> aload " + stackVarIndex);
                            mv.visitVarInsn(ALOAD, stackVarIndex);
                        } else if (owner.equals(MEMORYSTACK)
                                && (name.equals("stackPush") || name.equals("stackPop"))) {
                            String newName = "p" + name.substring(6);
                            if (debugTransform)
                                System.out.println("[autostack]     rewrite invocation of "
                                        + owner.replace('/', '.') + "." + name + " at line " + lastLine
                                        + " --> aload " + stackVarIndex + "; invokevirtual "
                                        + MEMORYSTACK.replace('/', '.') + "." + newName);
                            mv.visitVarInsn(ALOAD, stackVarIndex);
                            mv.visitMethodInsn(INVOKEVIRTUAL, MEMORYSTACK, newName, desc, itf);
                        } else if (owner.equals(MEMORYSTACK)
                                && (name.startsWith("stackMalloc") || name.startsWith("stackCalloc"))) {
                            String newName = name.substring(5, 6).toLowerCase() + name.substring(6);
                            if (debugTransform)
                                System.out.println("[autostack]     rewrite invocation of "
                                        + owner.replace('/', '.') + "." + name + " at line " + lastLine
                                        + " --> aload " + stackVarIndex + "; invokevirtual "
                                        + MEMORYSTACK.replace('/', '.') + "." + newName);
                            mv.visitVarInsn(ALOAD, stackVarIndex);
                            mv.visitInsn(SWAP);
                            mv.visitMethodInsn(INVOKEVIRTUAL, MEMORYSTACK, newName, desc, itf);
                        } else if (owner.equals(MEMORYSTACK)
                                && (name.startsWith("nstackMalloc") || name.startsWith("nstackCalloc"))) {
                            String newName = "n" + name.substring(6, 7).toLowerCase() + name.substring(7);
                            if (debugTransform)
                                System.out.println("[autostack]     rewrite invocation of "
                                        + owner.replace('/', '.') + "." + name + " at line " + lastLine
                                        + " --> aload " + stackVarIndex + "; invokevirtual "
                                        + MEMORYSTACK.replace('/', '.') + "." + newName);
                            mv.visitVarInsn(ALOAD, stackVarIndex);
                            if ("(I)J".equals(desc)) {
                                mv.visitInsn(SWAP);
                            } else {
                                // (II)J
                                mv.visitInsn(DUP_X2);
                                mv.visitInsn(POP);
                            }
                            mv.visitMethodInsn(INVOKEVIRTUAL, MEMORYSTACK, newName, desc, itf);
                        } else if (owner.equals(MEMORYSTACK) && (name.equals("stackASCII")
                                || name.equals("stackUTF8") || name.equals("stackUTF16"))) {
                            String newName = name.substring(5);
                            boolean withBoolean = desc.startsWith("(Ljava/lang/CharSequence;Z");
                            if (debugTransform)
                                System.out.println("[autostack]     rewrite invocation of "
                                        + owner.replace('/', '.') + "." + name + " at line " + lastLine
                                        + " --> aload " + stackVarIndex + "; invokevirtual "
                                        + MEMORYSTACK.replace('/', '.') + "." + newName);
                            mv.visitVarInsn(ALOAD, stackVarIndex);
                            if (withBoolean) {
                                mv.visitInsn(DUP_X2);
                                mv.visitInsn(POP);
                            } else {
                                mv.visitInsn(SWAP);
                            }
                            mv.visitMethodInsn(INVOKEVIRTUAL, MEMORYSTACK, newName, desc, itf);
                        } else if (owner.equals(MEMORYSTACK)
                                && (name.equals("stackFloats") || name.equals("stackInts")
                                        || name.equals("stackBytes") || name.equals("stackShorts")
                                        || name.equals("stackPointers")
                                                && (desc.startsWith("([Lorg/lwjgl/system/Pointer;")
                                                        || desc.startsWith("(Lorg/lwjgl/system/Pointer;")))) {
                            String newName = name.substring(5, 6).toLowerCase() + name.substring(6);
                            Type[] argTypes = Type.getArgumentTypes(desc);
                            if (argTypes.length == 1 && argTypes[0].getSort() == Type.ARRAY) {
                                if (debugTransform)
                                    System.out.println("[autostack]     rewrite invocation of "
                                            + owner.replace('/', '.') + "." + name + " at line " + lastLine
                                            + " --> aload " + stackVarIndex + "; invokevirtual "
                                            + MEMORYSTACK.replace('/', '.') + "." + newName);
                                mv.visitVarInsn(ALOAD, stackVarIndex);
                                mv.visitInsn(SWAP);
                                mv.visitMethodInsn(INVOKEVIRTUAL, MEMORYSTACK, newName, desc, itf);
                            } else if (argTypes.length == 1) {
                                if (debugTransform)
                                    System.out.println("[autostack]     rewrite invocation of "
                                            + owner.replace('/', '.') + "." + name + " at line " + lastLine
                                            + " --> aload " + stackVarIndex + "; invokevirtual "
                                            + MEMORYSTACK.replace('/', '.') + "." + newName);
                                mv.visitVarInsn(ALOAD, stackVarIndex);
                                mv.visitInsn(SWAP);
                                mv.visitMethodInsn(INVOKEVIRTUAL, MEMORYSTACK, newName, desc, itf);
                            } else if (argTypes.length == 2) {
                                if (debugTransform)
                                    System.out.println("[autostack]     rewrite invocation of "
                                            + owner.replace('/', '.') + "." + name + " at line " + lastLine
                                            + " --> aload " + stackVarIndex + "; invokevirtual "
                                            + MEMORYSTACK.replace('/', '.') + "." + newName);
                                mv.visitVarInsn(ALOAD, stackVarIndex);
                                mv.visitInsn(DUP_X2);
                                mv.visitInsn(POP);
                                mv.visitMethodInsn(INVOKEVIRTUAL, MEMORYSTACK, newName, desc, itf);
                            } else if (argTypes.length == 3) {
                                if (debugTransform)
                                    System.out.println("[autostack]     rewrite invocation of "
                                            + owner.replace('/', '.') + "." + name + " at line " + lastLine
                                            + " --> aload " + stackVarIndex + "; invokevirtual "
                                            + MEMORYSTACK.replace('/', '.') + "." + newName);
                                mv.visitVarInsn(ALOAD, stackVarIndex);
                                mv.visitInsn(DUP2_X2);
                                mv.visitInsn(POP);
                                mv.visitMethodInsn(INVOKEVIRTUAL, MEMORYSTACK, newName, desc, itf);
                                mv.visitInsn(SWAP);
                                mv.visitInsn(POP);
                            } else {
                                if (debugTransform)
                                    System.out.println("[autostack]     failed to rewrite invocation of "
                                            + owner.replace('/', '.') + "." + name + " at line " + lastLine
                                            + ". Not yet implemented.");
                                /* Give up. Not possible without an additional local */
                                mv.visitMethodInsn(INVOKESTATIC, MEMORYSTACK, name, desc, itf);
                            }
                        } else if (owner.equals(MEMORYSTACK) && name.equals("stackLongs")) {
                            String newName = name.substring(5, 6).toLowerCase() + name.substring(6);
                            Type[] argTypes = Type.getArgumentTypes(desc);
                            if (argTypes.length == 1 && argTypes[0].getSort() == Type.ARRAY) {
                                if (debugTransform)
                                    System.out.println("[autostack]     rewrite invocation of "
                                            + owner.replace('/', '.') + "." + name + " at line " + lastLine
                                            + " --> aload " + stackVarIndex + "; invokevirtual "
                                            + MEMORYSTACK.replace('/', '.') + "." + newName);
                                mv.visitVarInsn(ALOAD, stackVarIndex);
                                mv.visitInsn(SWAP);
                                mv.visitMethodInsn(INVOKEVIRTUAL, MEMORYSTACK, newName, desc, itf);
                            } else if (argTypes.length == 1) {
                                if (debugTransform)
                                    System.out.println("[autostack]     rewrite invocation of "
                                            + owner.replace('/', '.') + "." + name + " at line " + lastLine
                                            + " --> aload " + stackVarIndex + "; invokevirtual "
                                            + MEMORYSTACK.replace('/', '.') + "." + newName);
                                mv.visitVarInsn(ALOAD, stackVarIndex);
                                mv.visitInsn(DUP_X2);
                                mv.visitInsn(POP);
                                mv.visitMethodInsn(INVOKEVIRTUAL, MEMORYSTACK, newName, desc, itf);
                            } else {
                                if (debugTransform)
                                    System.out.println("[autostack]     failed to rewrite invocation of "
                                            + owner.replace('/', '.') + "." + name + " at line " + lastLine
                                            + ". Not yet implemented.");
                                /* Give up. Not possible without an additional local */
                                mv.visitMethodInsn(INVOKESTATIC, MEMORYSTACK, name, desc, itf);
                            }
                        } else {
                            mv.visitMethodInsn(opcode, owner, name, desc, itf);
                        }
                    }

                    public void visitLineNumber(int line, Label start) {
                        mv.visitLineNumber(line, start);
                        lastLine = line;
                    }

                    public void visitCode() {
                        if (notransform) {
                            mv.visitCode();
                            return;
                        }
                        additionalLocals = newStack || checkStack ? 2 : 1;
                        replacedLocals = new Object[paramTypes.length + additionalLocals + (isStatic ? 0 : 1)];
                        if (!newStack && !checkStack) {
                            replacedLocals[replacedLocals.length - 1] = MEMORYSTACK;
                        } else {
                            replacedLocals[replacedLocals.length - 2] = MEMORYSTACK;
                            replacedLocals[replacedLocals.length - 1] = INTEGER;
                        }
                        if (!isStatic)
                            replacedLocals[0] = isConstructor ? TOP : className;
                        int var = isStatic ? 0 : 1;
                        for (int t = 0, i = var; t < paramTypes.length; t++, i++) {
                            Type type = paramTypes[t];
                            var += type.getSize();
                            switch (type.getSort()) {
                            case Type.INT:
                            case Type.BYTE:
                            case Type.BOOLEAN:
                            case Type.SHORT:
                            case Type.CHAR:
                                replacedLocals[i] = INTEGER;
                                break;
                            case Type.LONG:
                                replacedLocals[i] = LONG;
                                break;
                            case Type.FLOAT:
                                replacedLocals[i] = FLOAT;
                                break;
                            case Type.DOUBLE:
                                replacedLocals[i] = DOUBLE;
                                break;
                            case Type.OBJECT:
                            case Type.ARRAY:
                                replacedLocals[i] = type.getInternalName();
                                break;
                            default:
                                throw new AssertionError("Unhandled parameter type: " + type);
                            }
                        }
                        firstAdditionalLocal = var;
                        stackVarIndex = var;
                        stackPointerVarIndex = var + 1;
                        mv.visitCode();
                        if (newStack && !checkStack || checkStack) {
                            if (!memoryStackParam) {
                                mv.visitMethodInsn(INVOKESTATIC, MEMORYSTACK, "stackGet",
                                        "()L" + MEMORYSTACK + ";", false);
                                mv.visitInsn(DUP);
                                mv.visitVarInsn(ASTORE, stackVarIndex);
                            } else {
                                mv.visitVarInsn(ALOAD, stackVarIndex);
                            }
                            mv.visitMethodInsn(INVOKEVIRTUAL, MEMORYSTACK, "getPointer", "()I", false);
                            mv.visitVarInsn(ISTORE, stackPointerVarIndex);
                            if (debugRuntime && newStack && !checkStack) {
                                mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out",
                                        "Ljava/io/PrintStream;");
                                mv.visitLdcInsn("[autostack] save stack pointer [");
                                mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "print",
                                        "(Ljava/lang/String;)V", false);
                                mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out",
                                        "Ljava/io/PrintStream;");
                                mv.visitVarInsn(ILOAD, stackPointerVarIndex);
                                mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "toString",
                                        "(I)Ljava/lang/String;", false);
                                mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "print",
                                        "(Ljava/lang/String;)V", false);
                                mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out",
                                        "Ljava/io/PrintStream;");
                                mv.visitLdcInsn("] at begin of " + className.replace('/', '.') + "." + name);
                                mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println",
                                        "(Ljava/lang/String;)V", false);
                            }
                            mv.visitLabel(tryLabel);
                            if (!memoryStackParam)
                                mv.visitFrame(F_APPEND, 2, new Object[] { MEMORYSTACK, INTEGER }, 0, null);
                            else
                                mv.visitFrame(F_APPEND, 1, new Object[] { INTEGER }, 0, null);
                        } else if (!newStack && !checkStack) {
                            if (!memoryStackParam) {
                                mv.visitMethodInsn(INVOKESTATIC, MEMORYSTACK, "stackGet",
                                        "()L" + MEMORYSTACK + ";", false);
                                mv.visitVarInsn(ASTORE, stackVarIndex);
                            }
                            if (debugRuntime) {
                                mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out",
                                        "Ljava/io/PrintStream;");
                                mv.visitLdcInsn("[autostack] current stack pointer is [");
                                mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "print",
                                        "(Ljava/lang/String;)V", false);
                                mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out",
                                        "Ljava/io/PrintStream;");
                                mv.visitVarInsn(ALOAD, stackVarIndex);
                                mv.visitMethodInsn(INVOKEVIRTUAL, MEMORYSTACK, "getPointer", "()I", false);
                                mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "toString",
                                        "(I)Ljava/lang/String;", false);
                                mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "print",
                                        "(Ljava/lang/String;)V", false);
                                mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out",
                                        "Ljava/io/PrintStream;");
                                mv.visitLdcInsn("] at begin of " + className.replace('/', '.') + "." + name);
                                mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println",
                                        "(Ljava/lang/String;)V", false);
                            }
                            mv.visitLabel(tryLabel);
                            if (!memoryStackParam)
                                mv.visitFrame(F_APPEND, 1, new Object[] { MEMORYSTACK }, 0, null);
                        }
                    }

                    public void visitMaxs(int maxStack, int maxLocals) {
                        if (notransform) {
                            mv.visitMaxs(maxStack, maxLocals);
                            return;
                        }
                        if (newStack && !checkStack || checkStack) {
                            mv.visitLabel(finallyLabel);
                            mv.visitFrame(F_FULL, replacedLocals.length, replacedLocals, 1,
                                    new Object[] { "java/lang/Throwable" });
                            mv.visitTryCatchBlock(tryLabel, finallyLabel, finallyLabel, null);
                            if (debugRuntime && newStack && !checkStack) {
                                mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out",
                                        "Ljava/io/PrintStream;");
                                mv.visitLdcInsn("[autostack] restore stack pointer because of throw [");
                                mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "print",
                                        "(Ljava/lang/String;)V", false);
                                mv.visitInsn(DUP);
                                mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out",
                                        "Ljava/io/PrintStream;");
                                mv.visitInsn(SWAP);
                                mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "toString",
                                        "()Ljava/lang/String;", false);
                                mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "print",
                                        "(Ljava/lang/String;)V", false);
                                mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out",
                                        "Ljava/io/PrintStream;");
                                mv.visitLdcInsn(
                                        "] at " + className.replace('/', '.') + "." + name + ":" + lastLine);
                                mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println",
                                        "(Ljava/lang/String;)V", false);
                            }
                            if (newStack && !checkStack) {
                                mv.visitVarInsn(ALOAD, stackVarIndex);
                                mv.visitVarInsn(ILOAD, stackPointerVarIndex);
                                mv.visitMethodInsn(INVOKEVIRTUAL, MEMORYSTACK, "setPointer", "(I)V", false);
                            }
                            if (checkStack) {
                                mv.visitVarInsn(ILOAD, stackPointerVarIndex);
                                mv.visitVarInsn(ALOAD, stackVarIndex);
                                mv.visitMethodInsn(INVOKEVIRTUAL, MEMORYSTACK, "getPointer", "()I", false);
                                mv.visitMethodInsn(INVOKESTATIC, className, "$checkStackWithThrowable$",
                                        "(Ljava/lang/Throwable;II)Ljava/lang/Throwable;", false);
                            }
                            mv.visitInsn(ATHROW);
                        }
                        mv.visitMaxs(-1, maxLocals + additionalLocals);
                    }
                };
                return mv;
            }
        }, 0);
        byte[] arr = cw.toByteArray();
        if (trace) {
            cr = new ClassReader(arr);
            cr.accept(new TraceClassVisitor(new PrintWriter(System.out)), 0);
        }
        return arr;
    } catch (Throwable t) {
        t.printStackTrace();
        throw new RuntimeException(t);
    }
}

From source file:org.mbte.groovypp.compiler.asm.VisitIincInsn.java

License:Apache License

public void visit(MethodVisitor mv) {
    mv.visitIincInsn(var, increment);
}