Buggy code:
public class MirrorAdvice extends Advice { private static final Member cflowCounterIncMethod = MemberImpl . method ( CFLOW_COUNTER_UNRESOLVEDTYPE , 0 , VOID , "inc" , NONE ) ; private static final Member cflowCounterDecMethod = MemberImpl . method ( CFLOW_COUNTER_UNRESOLVEDTYPE , 0 , VOID , "dec" , NONE ) ; private final MirrorWorld world ; public MirrorAdvice ( MirrorWorld world , AjAttribute . AdviceAttribute attribute , ResolvedType concreteAspect , Member signature , Pointcut pointcut ) { } public MirrorAdvice ( MirrorWorld world , ResolvedType concreteAspect , AdviceKind kind , Member signature , int extraArgumentFlags , Pointcut pointcut ) { } public Object testAndExecute ( MirrorEventShadow shadow , MirrorInvocationHandler proceed , List < Object > arguments ) throws MirrorInvocationTargetException { } public Object execute ( MirrorEventShadow shadow , ExposedState state , MirrorInvocationHandler proceed , List < Object > arguments ) throws MirrorInvocationTargetException { world . showMessage ( DEBUG , shadow . toString ( ) , null , null ) ; world . showMessage ( DEBUG , signature . toString ( ) , null , null ) ; MirrorEvaluator evaluator = shadow . getEvaluator ( arguments ) ; if ( kind . isCflow ( ) ) { if ( ( state . size ( ) ) == 0 ) { Expr fieldGet = new org . aspectj . weaver . ast . FieldGet ( getSignature ( ) , concreteAspect ) ; InstanceMirror counter = ( ( InstanceMirror ) ( evaluator . evaluateExpr ( fieldGet ) ) ) ; evaluator . evaluateCall ( counter , MirrorAdvice . cflowCounterIncMethod , Expr . NONE ) ; Object result = proceed . invoke ( shadow . getThread ( ) , arguments ) ; evaluator . evaluateCall ( counter , MirrorAdvice . cflowCounterDecMethod , Expr . NONE ) ; return result ; } else { throw new IllegalStateException ( ) ; } } InstanceMirror aspectInstance = ( ( InstanceMirror ) ( evaluator . evaluateExpr ( state . getAspectInstance ( ) ) ) ) ; Object [ ] args = new Object [ state . size ( ) ] ; int baseArgCount = getBaseParameterCount ( ) ; if ( ( this . kind ) == ( AdviceKind . Around ) ) { <START_BUG> args [ ( baseArgCount - 1 ) ] = world . makeInvocationHandlerAroundClosure ( proceed ) ; <END_BUG> baseArgCount -- ; } for ( int i = 0 ; i < baseArgCount ; i ++ ) { args [ i ] = evaluator . evaluateExpr ( state . get ( i ) ) ; } if ( ( ( getExtraParameterFlags ( ) ) & ( Advice . ThisJoinPointStaticPart ) ) != 0 ) { args [ ( ( args . length ) - 1 ) ] = evaluator . evaluateExpr ( shadow . getThisJoinPointStaticPartVar ( ) ) ; } try { MethodMirrorMember member = ( ( MethodMirrorMember ) ( signature ) ) ; Object result = member . method . invoke ( shadow . getThread ( ) , aspectInstance , args ) ; if ( ( world . resolve ( shadow . getReturnType ( ) ) . isPrimitiveType ( ) ) && ( result instanceof InstanceMirror ) ) { return Reflection . unbox ( ( ( InstanceMirror ) ( result ) ) ) ; } else { return result ; } } catch ( IllegalAccessException e ) { throw new RuntimeException ( e ) ; } } @ Override public int compareTo ( Object other ) { } @ Override public boolean hasDynamicTests ( ) { } @ Override public void specializeOn ( Shadow shadow ) { } @ Override public boolean implementOn ( Shadow shadow ) { } @ Override public ShadowMunger parameterizeWith ( ResolvedType declaringType , Map < String , UnresolvedType > typeVariableMap ) { } @ Override public Collection < ResolvedType > getThrownExceptions ( ) { } @ Override public boolean mustCheckExceptions ( ) { } No newline ; at end ; of file ; }

Fix:
args [ ( baseArgCount - 1 ) ] = world . makeInvocationHandlerAroundClosure ( shadow . getThread ( ) , proceed ) ;