Hi, thanks for your swift reply. That's roughly how I "solved" it but I was hoping I could elegantly represent it as a simple PCD instead of handling the control flow manually. It's a bit odd why the original PCD doesn't match the cyclic function calls. Apparently what's happining is that it was only matching a single level of cflowbelow, not taking into consideration the if(), it somehow wasn't able to backtrack and find a true match to the original PCD.
On Thu, Aug 6, 2009 at 9:09 PM, Andy Clement <[email protected]>wrote: > I modified the aspect and it does what I think you want, but requires that > you handle the control flow yourself. I think that is necessary because the > method you are advising is 'equals()' which is likely to be used internally > to the cflow implementation (although I haven't checked). > aspect A { > pointcut inTest1(Test1 i): within(Test1) && execution(boolean > Test1.equals(Object)) && target(i); > > Stack<Test1> t1Stack = new Stack<Test1>(); > > boolean around(Test1 t): inTest1(t) { > for (int i=0;i<t1Stack.size();i++) { > if (t1Stack.get(i)==t) { > return true; > } > } > t1Stack.push(t); > boolean b = proceed(t); > t1Stack.pop(); > return b; > } > > pointcut inTest2(Test2 i): within(Test2) && execution(boolean > Test2.equals(Object)) && target(i); > > Stack<Test2> t2Stack = new Stack<Test2>(); > > boolean around(Test2 t): inTest2(t) { > for (int i=0;i<t2Stack.size();i++) { > if (t2Stack.get(i)==t) { > return true; > } > } > t2Stack.push(t); > boolean b = proceed(t); > t2Stack.pop(); > return b; > } > } > > run: > 3 > 4 > 1 > 2 > 4 > 1 > 2 > 3 > haha, no more cycles! > > > > 2009/8/6 Neville Grech <[email protected]> > >> Hi, I'm trying out the following simple example whereby I have two >> classes, which contain an object of the other class's type in each. I then >> proceed to construct four objects in such a way that a cycle is created. >> When I call the equals method, I should get an infinite cycle. I tried to >> create a pointcut descriptor that detects this. Unfortunately, this only >> works when the nesting level in the call stack is less than 4. I need to >> create a PCD which detects cycles when the same equals method in the same >> object is called in the same call stack. Here is the code (which doesn't >> work as it should): >> >> import java.util.*; >> >> class Launcher { >> public static void main(String[] args) { >> Test1 t1=new Test1(1); >> Test2 t2=new Test2(2); >> Test1 t3=new Test1(3); >> Test2 t4=new Test2(4); >> t1.myObject=t2; >> t2.myObject=t3; >> t3.myObject=t4; >> t4.myObject=t1; >> assert t3.equals(t1); >> System.out.println("haha, no more cycles!"); >> } >> } >> class Test1 { >> public Test1(int c) { i=c; } >> int i; >> Test2 myObject; >> public boolean equals(Object o) { >> System.out.println(i); >> return myObject.equals(((Test1)o).myObject); >> } >> } >> >> class Test2 { >> public Test2(int c) { i=c; } >> int i; >> Test1 myObject; >> >> public boolean equals(Object o) { >> System.out.println(i); >> return myObject.equals(((Test2)o).myObject); >> } >> } >> >> aspect A { >> pointcut inTest1(Test1 i): call(boolean Test1.equals(Object)) && >> target(i); >> pointcut inTest2(Test2 i): call(boolean Test2.equals(Object)) && >> target(i); >> >> boolean around(Test1 up, Test1 now): >> inTest1(now) && cflowbelow(inTest1(up)) && if(up==now){ >> return true; >> } >> boolean around(Test2 up, Test2 now): >> if(up==now) && cflowbelow(inTest2(up)) && inTest2(now) { >> return true; >> } >> >> } >> >> >> -- >> Regards, >> Neville Grech >> >> _______________________________________________ >> aspectj-users mailing list >> [email protected] >> https://dev.eclipse.org/mailman/listinfo/aspectj-users >> >> > > _______________________________________________ > aspectj-users mailing list > [email protected] > https://dev.eclipse.org/mailman/listinfo/aspectj-users > > -- Regards, Neville Grech
_______________________________________________ aspectj-users mailing list [email protected] https://dev.eclipse.org/mailman/listinfo/aspectj-users
