[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] Infinite advice call problem

Hi Erik!

On Tuesday 07 January 2003 18:09, hilsdale@xxxxxxxx wrote:
> but this won't work either.  You're working with constructor
> _executions_, which occur within the constructor (think of
> them being "callee-side").

Thanks, I guess I have been looking at my code too long to see this.

> 1. Change to constructor call join points, and filter out
>    the offending calling points with within. 

This is what I wanted. 

> 2. Use cflow to stomp on even indirect recursion
>
>     after(MemoryFault mf):
>             target(mf) &&
>             execution(MemoryFault.new(..)) &&
>             ! cflowbelow(call(Object MemoryFault.clone())
>                          && within(Constructor)) {
>        MemoryFault other = (MemoryFault) mf.clone();
>     }

How does this  ! cflowbelow work, why do you group the "call" and 
"within" under cflowbelow? Is that a control flow where a call to clone 
was made within the Constructor aspect?
Does this depend on whether I write call first or within first, i.e. is 
the above equal to
	! cflowbelow(within(Constructor) && call(Object MemoryFault.clone()))
Can this also be written as 
	!cflowbelow(call(Object MemoryFault.clone())) &&
	!cflowbelow(within(Constructor))
(I remember some warning that the !, && and || are not really boolean 
operators / logic)?

>     Note that I've stomped on the indirect recursion rather
>     specifically, picking out exactly one call in the world.
>     In the future, if you use AspectJ 1.1, you might use the
>     new adviceexecution pointcut to pick out all advice
>     executions from the Constructor aspect (This doesn't
>     work in 1.1b2 because of a bug that's being fixed):

Ah, nice idea.

> Let me know if this doens't answer your question,

Yes, it does; thanks a lot.

Robert