Then, you can perhaps use around advice to cut short the recursion after
you've gone down the required number of times.

On Wed, Sep 2, 2009 at 9:11 AM, Dinkar Rao <[email protected]>wrote:

> 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

Reply via email to