Example usage for org.objectweb.asm MethodVisitor visitJumpInsn

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

Introduction

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

Prototype

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

Source Link

Document

Visits a jump instruction.

Usage

From source file:org.codehaus.aspectwerkz.aspect.container.PerCflowXAspectFactoryCompiler.java

License:Open Source License

/**
 * Overrides the aspectOf() method to not do lazy aspect instantiation since controlled by bind()/unbind()
 *///w w  w .  j  a va2s . c o m
protected void createAspectOf() {
    m_cw.visitField(ACC_PRIVATE + ACC_STATIC, "ASPECTS", MAP_CLASS_SIGNATURE, null, null);

    m_clinit.visitTypeInsn(NEW, MAP_CLASS_NAME);
    m_clinit.visitInsn(DUP);
    m_clinit.visitMethodInsn(INVOKESPECIAL, "java/util/WeakHashMap", INIT_METHOD_NAME, "()V");
    m_clinit.visitFieldInsn(PUTSTATIC, m_aspectFactoryClassName, "ASPECTS", MAP_CLASS_SIGNATURE);

    MethodVisitor cv = m_cw.visitMethod(ACC_PUBLIC + ACC_STATIC + ACC_FINAL, "aspectOf",
            "(" + getXSignature() + ")" + m_aspectClassSignature, null, null);

    cv.visitFieldInsn(GETSTATIC, m_aspectFactoryClassName, "ASPECTS", MAP_CLASS_SIGNATURE);
    cv.visitVarInsn(ALOAD, 0);//Thread
    cv.visitMethodInsn(INVOKEINTERFACE, MAP_CLASS_NAME, "get", "(Ljava/lang/Object;)Ljava/lang/Object;");
    cv.visitVarInsn(ASTORE, 1);
    cv.visitVarInsn(ALOAD, 1);
    Label ifBound = new Label();
    cv.visitJumpInsn(IFNONNULL, ifBound);
    cv.visitTypeInsn(NEW, Type.getInternalName(NoAspectBoundException.class));
    cv.visitInsn(DUP);
    cv.visitLdcInsn("Not bound");
    cv.visitLdcInsn(m_aspectQualifiedName);
    cv.visitMethodInsn(INVOKESPECIAL, NO_ASPECT_BOUND_EXCEPTION_CLASS_NAME, INIT_METHOD_NAME,
            "(Ljava/lang/String;Ljava/lang/String;)V");
    cv.visitInsn(ATHROW);

    cv.visitLabel(ifBound);
    cv.visitVarInsn(ALOAD, 1);
    cv.visitTypeInsn(CHECKCAST, m_aspectClassName);
    cv.visitInsn(ARETURN);

    // create an implicit Thread.currentThread no arg aspectOf() method
    cv = m_cw.visitMethod(ACC_STATIC + ACC_PUBLIC + ACC_FINAL, "aspectOf", "()" + m_aspectClassSignature, null,
            null);
    cv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(Thread.class), "currentThread",
            "()Ljava/lang/Thread;");
    cv.visitMethodInsn(INVOKESTATIC, m_aspectFactoryClassName, "aspectOf",
            "(Ljava/lang/Thread;)" + getXSignature());
    cv.visitInsn(ARETURN);
    cv.visitMaxs(0, 0);
}

From source file:org.codehaus.aspectwerkz.aspect.container.PerJVMAspectFactoryCompiler.java

License:Open Source License

protected void createAspectOf() {
    m_cw.visitField(ACC_PRIVATE + ACC_STATIC, FACTORY_SINGLEASPECT_FIELD_NAME, m_aspectClassSignature, null,
            null);/*  w w  w. ja  va 2  s . c o  m*/

    MethodVisitor cv = m_cw.visitMethod(ACC_PUBLIC + ACC_STATIC + ACC_FINAL, FACTORY_ASPECTOF_METHOD_NAME,
            "()" + m_aspectClassSignature, null, null);

    cv.visitFieldInsn(GETSTATIC, m_aspectFactoryClassName, FACTORY_SINGLEASPECT_FIELD_NAME,
            m_aspectClassSignature);
    Label ifNonNull = new Label();
    cv.visitJumpInsn(IFNONNULL, ifNonNull);
    if (m_hasAspectContainer) {
        cv.visitFieldInsn(GETSTATIC, m_aspectFactoryClassName, FACTORY_CONTAINER_FIELD_NAME,
                ASPECT_CONTAINER_CLASS_SIGNATURE);
        cv.visitMethodInsn(INVOKEINTERFACE, ASPECT_CONTAINER_CLASS_NAME, ASPECT_CONTAINER_ASPECTOF_METHOD_NAME,
                ASPECT_CONTAINER_ASPECTOF_PERJVM_METHOD_SIGNATURE);
        cv.visitTypeInsn(CHECKCAST, m_aspectClassName);
    } else {
        cv.visitTypeInsn(NEW, m_aspectClassName);
        cv.visitInsn(DUP);
        cv.visitMethodInsn(INVOKESPECIAL, m_aspectClassName, INIT_METHOD_NAME, NO_PARAM_RETURN_VOID_SIGNATURE);
    }
    cv.visitFieldInsn(PUTSTATIC, m_aspectFactoryClassName, FACTORY_SINGLEASPECT_FIELD_NAME,
            m_aspectClassSignature);
    cv.visitLabel(ifNonNull);
    cv.visitFieldInsn(GETSTATIC, m_aspectFactoryClassName, FACTORY_SINGLEASPECT_FIELD_NAME,
            m_aspectClassSignature);
    cv.visitInsn(ARETURN);
    cv.visitMaxs(0, 0);
}

From source file:org.codehaus.aspectwerkz.aspect.container.PerJVMAspectFactoryCompiler.java

License:Open Source License

protected void createHasAspect() {
    MethodVisitor cv = m_cw.visitMethod(ACC_STATIC + ACC_PUBLIC + ACC_FINAL, FACTORY_HASASPECT_METHOD_NAME,
            NO_PARAM_RETURN_BOOLEAN_SIGNATURE, null, null);

    cv.visitFieldInsn(GETSTATIC, m_aspectFactoryClassName, FACTORY_SINGLEASPECT_FIELD_NAME,
            m_aspectClassSignature);/*from   ww  w.j  a v  a  2 s  .  c  o  m*/
    Label ifNonNull = new Label();
    cv.visitJumpInsn(IFNONNULL, ifNonNull);
    cv.visitInsn(ICONST_0);
    cv.visitInsn(IRETURN);
    cv.visitLabel(ifNonNull);
    cv.visitInsn(ICONST_1);
    cv.visitInsn(IRETURN);
    cv.visitMaxs(0, 0);
}

From source file:org.codehaus.aspectwerkz.aspect.container.PerObjectFactoryCompiler.java

License:Open Source License

protected void createAspectOf() {
    MethodVisitor cv = m_cw.visitMethod(ACC_PUBLIC + ACC_STATIC + ACC_FINAL, FACTORY_ASPECTOF_METHOD_NAME,
            "(Ljava/lang/Object;)" + m_aspectClassSignature, null, null);

    // instanceOf check
    cv.visitVarInsn(ALOAD, 0);// object
    cv.visitTypeInsn(INSTANCEOF, HAS_INSTANCE_LEVEL_ASPECT_INTERFACE_NAME);
    Label ifInstanceOf = new Label();
    cv.visitJumpInsn(IFNE, ifInstanceOf);
    cv.visitTypeInsn(NEW, Type.getInternalName(NoAspectBoundException.class));
    cv.visitInsn(DUP);//from   w  w w .  jav a2  s .c  om
    cv.visitLdcInsn("Unimplemented interface");
    cv.visitLdcInsn(m_aspectQualifiedName);
    cv.visitMethodInsn(INVOKESPECIAL, NO_ASPECT_BOUND_EXCEPTION_CLASS_NAME, INIT_METHOD_NAME,
            "(Ljava/lang/String;Ljava/lang/String;)V");
    cv.visitInsn(ATHROW);
    cv.visitLabel(ifInstanceOf);

    cv.visitVarInsn(ALOAD, 0);
    cv.visitTypeInsn(CHECKCAST, HAS_INSTANCE_LEVEL_ASPECT_INTERFACE_NAME);
    cv.visitFieldInsn(GETSTATIC, m_aspectFactoryClassName, FACTORY_CLASS_FIELD_NAME, CLASS_CLASS_SIGNATURE);
    cv.visitMethodInsn(INVOKEINTERFACE, HAS_INSTANCE_LEVEL_ASPECT_INTERFACE_NAME,
            INSTANCE_LEVEL_GETASPECT_METHOD_NAME, INSTANCE_LEVEL_GETASPECT_METHOD_SIGNATURE);
    cv.visitVarInsn(ASTORE, 1);
    cv.visitVarInsn(ALOAD, 1);
    Label ifBound = new Label();
    cv.visitJumpInsn(IFNONNULL, ifBound);
    cv.visitTypeInsn(NEW, NO_ASPECT_BOUND_EXCEPTION_CLASS_NAME);
    cv.visitInsn(DUP);
    cv.visitLdcInsn("Not bound");
    cv.visitLdcInsn(m_aspectQualifiedName);
    cv.visitMethodInsn(INVOKESPECIAL, NO_ASPECT_BOUND_EXCEPTION_CLASS_NAME, INIT_METHOD_NAME,
            "(Ljava/lang/String;Ljava/lang/String;)V");
    cv.visitInsn(ATHROW);

    cv.visitLabel(ifBound);
    cv.visitVarInsn(ALOAD, 1);
    cv.visitTypeInsn(CHECKCAST, m_aspectClassName);
    cv.visitInsn(ARETURN);
    cv.visitMaxs(0, 0);
}

From source file:org.codehaus.aspectwerkz.aspect.container.PerObjectFactoryCompiler.java

License:Open Source License

protected void createHasAspect() {
    MethodVisitor cv = m_cw.visitMethod(ACC_PUBLIC + ACC_STATIC, FACTORY_HASASPECT_METHOD_NAME,
            "(Ljava/lang/Object;)Z", null, null);

    // instanceOf check
    cv.visitVarInsn(ALOAD, 0);// object
    cv.visitTypeInsn(INSTANCEOF, HAS_INSTANCE_LEVEL_ASPECT_INTERFACE_NAME);
    Label ifInstanceOf = new Label();
    cv.visitJumpInsn(IFNE, ifInstanceOf);
    cv.visitInsn(ICONST_0);/*from w ww .  j  a va2 s  .c  om*/
    cv.visitInsn(IRETURN);
    cv.visitLabel(ifInstanceOf);

    cv.visitVarInsn(ALOAD, 0);
    cv.visitTypeInsn(CHECKCAST, HAS_INSTANCE_LEVEL_ASPECT_INTERFACE_NAME);
    cv.visitFieldInsn(GETSTATIC, m_aspectFactoryClassName, FACTORY_CLASS_FIELD_NAME, CLASS_CLASS_SIGNATURE);
    cv.visitMethodInsn(INVOKEINTERFACE, HAS_INSTANCE_LEVEL_ASPECT_INTERFACE_NAME,
            INSTANCE_LEVEL_HASASPECT_METHOD_NAME, INSTANCE_LEVEL_HASASPECT_METHOD_SIGNATURE);
    cv.visitInsn(IRETURN);
    cv.visitMaxs(0, 0);
}

From source file:org.codehaus.aspectwerkz.aspect.container.PerObjectFactoryCompiler.java

License:Open Source License

private void createBindMethod() {
    MethodVisitor cv = m_cw.visitMethod(ACC_PUBLIC + ACC_STATIC + ACC_FINAL, "bind",
            "(Ljava/lang/Object;)Ljava/lang/Object;", null, null);

    // instanceOf check
    cv.visitVarInsn(ALOAD, 0);// object
    cv.visitTypeInsn(INSTANCEOF, HAS_INSTANCE_LEVEL_ASPECT_INTERFACE_NAME);
    Label ifInstanceOf = new Label();
    cv.visitJumpInsn(IFNE, ifInstanceOf);
    cv.visitTypeInsn(NEW, NO_ASPECT_BOUND_EXCEPTION_CLASS_NAME);
    cv.visitInsn(DUP);/*from  w ww .  ja  va 2s .  co m*/
    cv.visitLdcInsn("Unimplemented interface");
    cv.visitLdcInsn(m_aspectQualifiedName);
    cv.visitMethodInsn(INVOKESPECIAL, NO_ASPECT_BOUND_EXCEPTION_CLASS_NAME, INIT_METHOD_NAME,
            "(Ljava/lang/String;Ljava/lang/String;)V");
    cv.visitInsn(ATHROW);
    cv.visitLabel(ifInstanceOf);

    cv.visitVarInsn(ALOAD, 0);//object
    cv.visitTypeInsn(CHECKCAST, HAS_INSTANCE_LEVEL_ASPECT_INTERFACE_NAME);
    cv.visitFieldInsn(GETSTATIC, m_aspectFactoryClassName, FACTORY_CLASS_FIELD_NAME, CLASS_CLASS_SIGNATURE);
    cv.visitMethodInsn(INVOKEINTERFACE, HAS_INSTANCE_LEVEL_ASPECT_INTERFACE_NAME,
            INSTANCE_LEVEL_GETASPECT_METHOD_NAME, INSTANCE_LEVEL_GETASPECT_METHOD_SIGNATURE);
    cv.visitVarInsn(ASTORE, 1);
    cv.visitVarInsn(ALOAD, 1);
    Label ifAlreadyBound = new Label();
    cv.visitJumpInsn(IFNONNULL, ifAlreadyBound);

    // target instance and arg0 for bind call
    cv.visitVarInsn(ALOAD, 0);//object
    cv.visitTypeInsn(CHECKCAST, HAS_INSTANCE_LEVEL_ASPECT_INTERFACE_NAME);
    cv.visitFieldInsn(GETSTATIC, m_aspectFactoryClassName, FACTORY_CLASS_FIELD_NAME, CLASS_CLASS_SIGNATURE);

    if (m_hasAspectContainer) {
        cv.visitFieldInsn(GETSTATIC, m_aspectFactoryClassName, FACTORY_CONTAINER_FIELD_NAME,
                ASPECT_CONTAINER_CLASS_SIGNATURE);
        cv.visitVarInsn(ALOAD, 0);//associated object
        cv.visitMethodInsn(INVOKEINTERFACE, ASPECT_CONTAINER_CLASS_NAME, ASPECT_CONTAINER_ASPECTOF_METHOD_NAME,
                "(Ljava/lang/Object;)Ljava/lang/Object;");
        cv.visitTypeInsn(CHECKCAST, m_aspectClassName);
    } else {
        cv.visitTypeInsn(NEW, m_aspectClassName);
        cv.visitInsn(DUP);
        cv.visitMethodInsn(INVOKESPECIAL, m_aspectClassName, INIT_METHOD_NAME, NO_PARAM_RETURN_VOID_SIGNATURE);
    }
    cv.visitMethodInsn(INVOKEINTERFACE, HAS_INSTANCE_LEVEL_ASPECT_INTERFACE_NAME,
            INSTANCE_LEVEL_BINDASPECT_METHOD_NAME, INSTANCE_LEVEL_BINDASPECT_METHOD_SIGNATURE);
    cv.visitInsn(ARETURN);

    cv.visitLabel(ifAlreadyBound);
    cv.visitVarInsn(ALOAD, 1);
    cv.visitInsn(ARETURN);

    cv.visitMaxs(0, 0);
}

From source file:org.codehaus.aspectwerkz.cflow.CflowCompiler.java

License:Open Source License

/**
 * compile the jit cflow aspect/*from   ww w . j  ava2  s  . c  om*/
 * @return bytecode for the concrete jit cflow aspect
 */
private byte[] compile() {
    m_cw = AsmHelper.newClassWriter(true);

    // class extends AbstractCflowsystemAspect
    m_cw.visit(AsmHelper.JAVA_VERSION, ACC_PUBLIC + ACC_SUPER + ACC_SYNTHETIC, m_className, null,
            ABSTRACT_CFLOW_CLASS, EMPTY_STRING_ARRAY);

    // static INSTANCE field
    m_cw.visitField(ACC_PRIVATE + ACC_STATIC, INSTANCE_CFLOW_FIELD_NAME, m_classSignature, null, null);

    // private ctor
    MethodVisitor ctor = m_cw.visitMethod(ACC_PRIVATE, INIT_METHOD_NAME, NO_PARAM_RETURN_VOID_SIGNATURE, null,
            EMPTY_STRING_ARRAY);
    // invoke the constructor of abstract
    ctor.visitVarInsn(ALOAD, 0);
    ctor.visitMethodInsn(INVOKESPECIAL, ABSTRACT_CFLOW_CLASS, INIT_METHOD_NAME, NO_PARAM_RETURN_VOID_SIGNATURE);
    ctor.visitInsn(RETURN);
    ctor.visitMaxs(0, 0);

    // static isInCflow() delegators
    MethodVisitor isInCflow = m_cw.visitMethod(ACC_PUBLIC + ACC_STATIC, IS_IN_CFLOW_METOD_NAME,
            IS_IN_CFLOW_METOD_SIGNATURE, null, EMPTY_STRING_ARRAY);
    isInCflow.visitFieldInsn(GETSTATIC, m_className, INSTANCE_CFLOW_FIELD_NAME, m_classSignature);
    Label isNull = new Label();
    isInCflow.visitJumpInsn(IFNULL, isNull);
    isInCflow.visitFieldInsn(GETSTATIC, m_className, INSTANCE_CFLOW_FIELD_NAME, m_classSignature);
    isInCflow.visitMethodInsn(INVOKEVIRTUAL, ABSTRACT_CFLOW_CLASS, IN_CFLOW_METOD_NAME,
            IN_CFLOW_METOD_SIGNATURE);
    isInCflow.visitInsn(IRETURN);
    isInCflow.visitLabel(isNull);
    isInCflow.visitInsn(ICONST_0);
    isInCflow.visitInsn(IRETURN);
    isInCflow.visitMaxs(0, 0);

    // static aspectOf()
    MethodVisitor aspectOf = m_cw.visitMethod(ACC_PUBLIC + ACC_STATIC, CFLOW_ASPECTOF_METHOD_NAME,
            "()" + m_classSignature, null, EMPTY_STRING_ARRAY);
    aspectOf.visitFieldInsn(GETSTATIC, m_className, INSTANCE_CFLOW_FIELD_NAME, m_classSignature);
    Label isNotNull = new Label();
    aspectOf.visitJumpInsn(IFNONNULL, isNotNull);
    aspectOf.visitTypeInsn(NEW, m_className);
    aspectOf.visitInsn(DUP);
    aspectOf.visitMethodInsn(INVOKESPECIAL, m_className, INIT_METHOD_NAME, NO_PARAM_RETURN_VOID_SIGNATURE);
    aspectOf.visitFieldInsn(PUTSTATIC, m_className, INSTANCE_CFLOW_FIELD_NAME, m_classSignature);
    aspectOf.visitLabel(isNotNull);
    aspectOf.visitFieldInsn(GETSTATIC, m_className, INSTANCE_CFLOW_FIELD_NAME, m_classSignature);
    aspectOf.visitInsn(ARETURN);
    aspectOf.visitMaxs(0, 0);

    m_cw.visitEnd();

    return m_cw.toByteArray();
}

From source file:org.codehaus.aspectwerkz.transform.inlining.AsmHelper.java

License:Open Source License

/**
 * Handles the unwrapping of a type, unboxing of primitives and casting to the correct object type.
 * Takes care of null value replaced by default primitive value.
 * <pre>(obj==null)?0L:((Long)obj).longValue();</pre>
 *
 * @param cv//from w w  w  . j  a va  2s. c  o m
 * @param type
 */
public static void unwrapType(final MethodVisitor cv, final Type type) {
    // void, object and array type handling
    switch (type.getSort()) {
    case Type.OBJECT:
        String objectTypeName = type.getClassName().replace('.', '/');
        cv.visitTypeInsn(CHECKCAST, objectTypeName);
        return;
    case Type.ARRAY:
        cv.visitTypeInsn(CHECKCAST, type.getDescriptor());
        return;
    case Type.VOID:
        return;
    }
    // primitive type handling
    Label l0If = new Label();
    Label l1End = new Label();
    // if != null
    cv.visitInsn(DUP);
    cv.visitJumpInsn(IFNONNULL, l0If);
    // else, default value
    cv.visitInsn(POP);
    addDefaultValue(cv, type);
    // end
    cv.visitJumpInsn(GOTO, l1End);
    // if body
    cv.visitLabel(l0If);
    switch (type.getSort()) {
    case Type.SHORT:
        cv.visitTypeInsn(CHECKCAST, SHORT_CLASS_NAME);
        cv.visitMethodInsn(INVOKEVIRTUAL, SHORT_CLASS_NAME, SHORT_VALUE_METHOD_NAME,
                SHORT_VALUE_METHOD_SIGNATURE);
        break;
    case Type.INT:
        cv.visitTypeInsn(CHECKCAST, INTEGER_CLASS_NAME);
        cv.visitMethodInsn(INVOKEVIRTUAL, INTEGER_CLASS_NAME, INT_VALUE_METHOD_NAME,
                INT_VALUE_METHOD_SIGNATURE);
        break;
    case Type.LONG:
        cv.visitTypeInsn(CHECKCAST, LONG_CLASS_NAME);
        cv.visitMethodInsn(INVOKEVIRTUAL, LONG_CLASS_NAME, LONG_VALUE_METHOD_NAME, LONG_VALUE_METHOD_SIGNATURE);
        break;
    case Type.FLOAT:
        cv.visitTypeInsn(CHECKCAST, FLOAT_CLASS_NAME);
        cv.visitMethodInsn(INVOKEVIRTUAL, FLOAT_CLASS_NAME, FLOAT_VALUE_METHOD_NAME,
                FLOAT_VALUE_METHOD_SIGNATURE);
        break;
    case Type.DOUBLE:
        cv.visitTypeInsn(CHECKCAST, DOUBLE_CLASS_NAME);
        cv.visitMethodInsn(INVOKEVIRTUAL, DOUBLE_CLASS_NAME, DOUBLE_VALUE_METHOD_NAME,
                DOUBLE_VALUE_METHOD_SIGNATURE);
        break;
    case Type.BYTE:
        cv.visitTypeInsn(CHECKCAST, BYTE_CLASS_NAME);
        cv.visitMethodInsn(INVOKEVIRTUAL, BYTE_CLASS_NAME, BYTE_VALUE_METHOD_NAME, BYTE_VALUE_METHOD_SIGNATURE);
        break;
    case Type.BOOLEAN:
        cv.visitTypeInsn(CHECKCAST, BOOLEAN_CLASS_NAME);
        cv.visitMethodInsn(INVOKEVIRTUAL, BOOLEAN_CLASS_NAME, BOOLEAN_VALUE_METHOD_NAME,
                BOOLEAN_VALUE_METHOD_SIGNATURE);
        break;
    case Type.CHAR:
        cv.visitTypeInsn(CHECKCAST, CHARACTER_CLASS_NAME);
        cv.visitMethodInsn(INVOKEVIRTUAL, CHARACTER_CLASS_NAME, CHAR_VALUE_METHOD_NAME,
                CHAR_VALUE_METHOD_SIGNATURE);
        break;
    }
    cv.visitLabel(l1End);
}

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

License:Open Source License

/**
 * Creates the static initialization method (not clinit) for the join point.
 *///w  ww . j  a  va 2s.com
private void createStaticInitializer() {
    MethodVisitor cv = m_cw.visitMethod(ACC_STATIC | ACC_PUBLIC, STATIC_INITIALIZATION_METHOD_NAME,
            NO_PARAM_RETURN_VOID_SIGNATURE, null, null);

    Label tryLabel = new Label();
    cv.visitLabel(tryLabel);
    cv.visitLdcInsn(m_calleeClassName.replace('/', '.'));
    cv.visitMethodInsn(INVOKESTATIC, CLASS_CLASS, FOR_NAME_METHOD_NAME, FOR_NAME_METHOD_SIGNATURE);
    cv.visitFieldInsn(PUTSTATIC, m_joinPointClassName, TARGET_CLASS_FIELD_NAME_IN_JP, CLASS_CLASS_SIGNATURE);

    cv.visitLdcInsn(m_callerClassName.replace('/', '.'));
    cv.visitMethodInsn(INVOKESTATIC, CLASS_CLASS, FOR_NAME_METHOD_NAME, FOR_NAME_METHOD_SIGNATURE);
    cv.visitFieldInsn(PUTSTATIC, m_joinPointClassName, THIS_CLASS_FIELD_NAME_IN_JP, CLASS_CLASS_SIGNATURE);

    Label finallyLabel = new Label();
    cv.visitLabel(finallyLabel);

    Label gotoFinallyLabel = new Label();
    cv.visitJumpInsn(GOTO, gotoFinallyLabel);

    Label catchLabel = new Label();
    cv.visitLabel(catchLabel);
    cv.visitVarInsn(ASTORE, 0);

    cv.visitVarInsn(ALOAD, 0);
    cv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Throwable", "printStackTrace", "()V");

    cv.visitTypeInsn(NEW, RUNTIME_EXCEPTION_CLASS_NAME);
    cv.visitInsn(DUP);
    cv.visitLdcInsn("could not load target class using Class.forName() in generated join point base class "
            + m_joinPointClassName);

    cv.visitMethodInsn(INVOKESPECIAL, RUNTIME_EXCEPTION_CLASS_NAME, INIT_METHOD_NAME,
            RUNTIME_EXCEPTION_INIT_METHOD_SIGNATURE);

    cv.visitInsn(ATHROW);
    cv.visitLabel(gotoFinallyLabel);

    // create the enclosing static joinpoint
    createEnclosingStaticJoinPoint(cv);

    // create the metadata map
    cv.visitTypeInsn(NEW, HASH_MAP_CLASS_NAME);
    cv.visitInsn(DUP);
    cv.visitMethodInsn(INVOKESPECIAL, HASH_MAP_CLASS_NAME, INIT_METHOD_NAME, NO_PARAM_RETURN_VOID_SIGNATURE);
    cv.visitFieldInsn(PUTSTATIC, m_joinPointClassName, META_DATA_FIELD_NAME, MAP_CLASS_SIGNATURE);

    // create the Signature instance
    createSignature(cv);

    // create the static JoinPoint instance
    cv.visitTypeInsn(NEW, m_joinPointClassName);
    cv.visitInsn(DUP);
    cv.visitMethodInsn(INVOKESPECIAL, m_joinPointClassName, INIT_METHOD_NAME, NO_PARAM_RETURN_VOID_SIGNATURE);
    cv.visitFieldInsn(PUTSTATIC, m_joinPointClassName, OPTIMIZED_JOIN_POINT_INSTANCE_FIELD_NAME,
            L + m_joinPointClassName + SEMICOLON);

    // ensure aspect factories are all loaded
    for (int i = 0; i < m_aspectInfos.length; i++) {
        AspectInfo m_aspectInfo = m_aspectInfos[i];

        cv.visitLdcInsn(m_aspectInfo.getAspectFactoryClassName());
        cv.visitLdcInsn(m_aspectInfo.getAspectDefinition().getSystemDefinition().getUuid());
        cv.visitLdcInsn(m_aspectInfo.getAspectClassName());
        cv.visitLdcInsn(m_aspectInfo.getAspectQualifiedName());
        AsmHelper.loadStringConstant(cv, m_aspectInfo.getAspectDefinition().getContainerClassName());
        //TODO AVF do it once per aspect def
        StringBuffer sb = new StringBuffer();
        boolean hasOne = false;
        boolean isFirst = true;
        for (Iterator iterator = m_aspectInfo.getAspectDefinition().getParameters().entrySet()
                .iterator(); iterator.hasNext();) {
            Map.Entry entry = (Map.Entry) iterator.next();
            if (!isFirst) {
                sb.append(DELIMITER);
            }
            isFirst = false;
            hasOne = true;
            sb.append(entry.getKey()).append(DELIMITER).append(entry.getValue());
        }
        if (hasOne) {
            cv.visitLdcInsn(sb.toString());
        } else {
            cv.visitInsn(ACONST_NULL);
        }
        cv.visitFieldInsn(GETSTATIC, m_joinPointClassName, THIS_CLASS_FIELD_NAME_IN_JP, CLASS_CLASS_SIGNATURE);
        cv.visitMethodInsn(INVOKEVIRTUAL, CLASS_CLASS, GETCLASSLOADER_METHOD_NAME,
                CLASS_CLASS_GETCLASSLOADER_METHOD_SIGNATURE);
        cv.visitLdcInsn(m_aspectInfo.getDeploymentModel().toString());
        cv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(AspectFactoryManager.class), "loadAspectFactory",
                "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/lang/String;)V");
    }

    // create and initialize the aspect fields
    for (int i = 0; i < m_aspectInfos.length; i++) {
        m_aspectInfos[i].getAspectModel().createAndStoreStaticAspectInstantiation(m_cw, cv, m_aspectInfos[i],
                m_joinPointClassName);
    }

    cv.visitInsn(RETURN);
    cv.visitTryCatchBlock(tryLabel, finallyLabel, catchLabel, CLASS_NOT_FOUND_EXCEPTION_CLASS_NAME);
    cv.visitMaxs(0, 0);
}

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

License:Open Source License

/**
 * @param cv//  w  w w. j a va2s . c  o m
 * @param input
 */
private void createPartOfInvokeMethodWithAllAdviceTypes(final MethodVisitor cv, final CompilerInput input) {
    final int returnValueIndex = (input.joinPointInstanceIndex != INDEX_NOTAVAILABLE)
            ? (input.joinPointInstanceIndex + 1)
            : input.callerIndex + 1;
    final int exceptionIndex1 = returnValueIndex + 1;
    final int exceptionIndex2 = returnValueIndex + 2;

    cv.visitInsn(ACONST_NULL);
    cv.visitVarInsn(ASTORE, returnValueIndex);

    Label tryLabel = new Label();
    cv.visitLabel(tryLabel);
    if (!m_requiresProceedMethod) {
        // if no around advice then optimize by invoking the target JP directly and no call to proceed()
        createInlinedJoinPointInvocation(cv, input);
        int stackIndex = returnValueIndex;//use another int since storeType will update it
        AsmHelper.storeType(cv, stackIndex, m_returnType);
        addReturnedValueToJoinPoint(cv, input, returnValueIndex, false);
    } else {
        createInvocationToProceedMethod(cv, input.joinPointInstanceIndex, returnValueIndex);
    }

    createAfterReturningAdviceInvocations(cv, input);

    Label finallyLabel1 = new Label();
    cv.visitLabel(finallyLabel1);

    if (m_isThisAdvisable) {
        final int registerDepth = input.callerIndex + 2; // caller is using last register + possible return value
        createAfterInterceptorInvocations(cv, input.joinPointInstanceIndex, registerDepth);
    }
    createAfterFinallyAdviceInvocations(cv, input);

    Label gotoFinallyLabel = new Label();
    cv.visitJumpInsn(GOTO, gotoFinallyLabel);

    Label catchLabel = new Label();
    cv.visitLabel(catchLabel);

    // store the exception
    cv.visitVarInsn(ASTORE, exceptionIndex1);

    if (m_isThisAdvisable) {
        createAfterThrowingInterceptorInvocations(cv, input.joinPointInstanceIndex, exceptionIndex1);
    }

    // loop over the after throwing advices
    for (int i = m_afterThrowingAdviceMethodInfos.length - 1; i >= 0; i--) {
        AdviceMethodInfo advice = m_afterThrowingAdviceMethodInfos[i];

        // set the exception argument index
        advice.setSpecialArgumentIndex(exceptionIndex1);

        // if (e instanceof TYPE) {...}
        cv.visitVarInsn(ALOAD, exceptionIndex1);

        final String specialArgTypeName = advice.getSpecialArgumentTypeName();
        if (specialArgTypeName != null) {
            // after throwing <TYPE>
            cv.visitTypeInsn(INSTANCEOF, specialArgTypeName);

            Label ifInstanceOfLabel = new Label();
            cv.visitJumpInsn(IFEQ, ifInstanceOfLabel);

            // after throwing advice invocation
            createAfterAdviceInvocation(cv, input, advice, exceptionIndex1);

            cv.visitLabel(ifInstanceOfLabel);
        } else {
            // after throwing
            createAfterAdviceInvocation(cv, input, advice, INDEX_NOTAVAILABLE);
        }
    }

    // rethrow exception
    cv.visitVarInsn(ALOAD, exceptionIndex1);
    cv.visitInsn(ATHROW);

    // store exception
    Label exceptionLabel = new Label();
    cv.visitLabel(exceptionLabel);
    cv.visitVarInsn(ASTORE, exceptionIndex2);

    // after finally advice invocation
    Label finallyLabel2 = new Label();
    cv.visitLabel(finallyLabel2);

    if (m_isThisAdvisable) {
        final int registerDepth = input.callerIndex + 2; // caller is using last register + possible return value
        createAfterInterceptorInvocations(cv, input.joinPointInstanceIndex, registerDepth);
    }
    createAfterFinallyAdviceInvocations(cv, input);

    // rethrow exception
    cv.visitVarInsn(ALOAD, exceptionIndex2);
    cv.visitInsn(ATHROW);
    cv.visitLabel(gotoFinallyLabel);

    // unwrap if around advice and return in all cases
    if (m_returnType.getSort() != Type.VOID) {
        if (m_requiresProceedMethod) {
            cv.visitVarInsn(ALOAD, returnValueIndex);
            AsmHelper.unwrapType(cv, m_returnType);
        } else {
            AsmHelper.loadType(cv, returnValueIndex, m_returnType);
        }
    }

    AsmHelper.addReturnStatement(cv, m_returnType);

    // build up the exception table
    cv.visitTryCatchBlock(tryLabel, finallyLabel1, catchLabel, THROWABLE_CLASS_NAME);
    cv.visitTryCatchBlock(tryLabel, finallyLabel1, exceptionLabel, null);
    cv.visitTryCatchBlock(catchLabel, finallyLabel2, exceptionLabel, null);
}