Skip to main content

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

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 <dinkar.d91411118@xxxxxxxxx> 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<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
>
>


Back to the top