Thanks Andrew. I was hoping to avoid using external data structures, because in my real-world application, the recursive call is a create() method, which creates a "department", which in turn creates each "employee" of the department, which in turn creates each "machine" of employee, etc, and I want to keep track of who created whom. So the object graph is quite large, and I don't need all of that information in memory at a time.
I'll tweak your pointcut code and its advice to pare down the reference stack/tree. Thanks, Dinkar On Wed, Sep 2, 2009 at 8:55 AM, Andrew Eisenberg<[email protected]> wrote: > The simplest way would be to attach state to your aspect so that it can keep > track of the last n values. You also may want to attach a percflow > instantiation clause to the aspect to make sure that each initial call to > fact() has its own aspect instance. > > So, something like this: > > aspect A percflow(topLevelFactCall()) { > > pointcut topLevelFactCall() : factCall() && !cflowbelow(factCall()); > > ... > > Stack<Integer> returnValues; > > ... > > } > > And just push a new value onto the stack until you get as many return values > as you require. > > > On Wed, Sep 2, 2009 at 1:20 AM, Dinkar Rao <[email protected]> > wrote: >> >> Hi Folks, >> >> Need some help with AspectJ. How can I capture return values from >> recursive >> calls ? I want not only the returned value from the top level method call >> in >> the stack, but also link the values from the intermediate method calls. >> For >> example, given this simple method: >> >> public int fact(int val) { >> if (val > 0) { >> return val * fact(val - 1); >> } >> else { >> return 1; >> } >> } >> >> I can write an aspect that gets me the returned values from each call. >> >> public pointcut FactCall() : >> call(public int fact(int)); >> >> after() returning(int f) : >> FactCall() { >> System.out.println("returned = " + f); >> } >> >> So for fact(4), I get the returned values from the top-level call as 1, >> 1, >> 2, 6, 24. >> >> But what I really want to do is to capture the return values from the top >> 2 >> (or top n) recursive method calls, i.e. something that links >> >> 1 => 1 >> 1 => 2 >> 2 => 6 >> 6 => 24 >> >> Any suggestions on how to do this ? >> >> Thanks, >> Dinkar >> >> -- >> View this message in context: >> http://www.nabble.com/Capturing-multiple-return-values-from-recursive-calls-tp25253444p25253444.html >> Sent from the AspectJ - users mailing list archive at Nabble.com. >> >> _______________________________________________ >> 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 > > _______________________________________________ aspectj-users mailing list [email protected] https://dev.eclipse.org/mailman/listinfo/aspectj-users
