List of usage examples for org.objectweb.asm MethodVisitor visitJumpInsn
public void visitJumpInsn(final int opcode, final Label label)
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); }