[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] Capturing multiple return values from recursive calls

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<andrew@xxxxxxxxxxxx> 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 <dinkar.d91411118@xxxxxxxxx>
> 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
>> aspectj-users@xxxxxxxxxxx
>> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
>
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
>