[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] If pointcut and side effects

"The order of evaluation for pointcut expression components at a join point is undefined."

How about each individual pointcut? Is this also undefined?

E.g.

before() : p1() {...}

after() : p2() {...}

Here, the after advice has precedence over the before advice, so according to the appendix B in the programming guide the after advice should run first (although its body will of course run last). However, does that imply any order in which p1 and p2 are evaluated? Are p2 evaluated first, last, or is it undefined?

Thanks,
Jon

On May 31, 2006, at 12:13 AM, Wes wrote:

Is p1 and p2 evaluated independently? Which is evaluated
first? Why doesn't the assignment in p1 affect p2?

From the programming guide, semantics appendix discussion of
the if pointcut:

  Note that the order of evaluation for pointcut expression
  components at a join point is undefined. Writing if pointcuts
  that have side-effects is considered bad style and may also
  lead to potentially confusing or even changing behavior with
  regard to when or if the test code will run.

It can be confusing because programmers come to rely on the
order of evaluation for boolean expressions in Java, but
these aren't that.

Wes

------------Original Message------------
From: "Jon S. Baekken" <jbaekken@xxxxxxxxxxxx>
To: aspectj-users@xxxxxxxxxxx
Date: Tue, May-30-2006 2:08 PM
Subject: [aspectj-users] If pointcut and side effects

Hi all,

I ran into an issues regarding combining several if pointcuts in one
and wondered if somebody could explain what seems to me like strange
behavior (the example is artificial but illustrates the point):

Say I have the following aspect:

aspect A {
    pointcut p1() : call(* m(..)) && if((x=2) == 2); // last one
always true of course
    before() : p1() && if(x==0) {...}
    static int x = 0;
}

And a class with two methods:

void main() {
    m();
}

void m() {
    ...
}

As expected, the advice is not executed at a call to m(), I guess
because x cannot be both 0 and 2 at the same time.

However, if I move the if(x==0) from the advice spec to a named
pointcut p2:

pointcut p2() : if(x==0);

and change the advice to:

before() : p1() && p2();

the advice executed!

I guess this is related to the side effect the if pointcut has in
changing the state value of x, but why different results in the two
cases? Is p1 and p2 evaluated independently? Which is evaluated
first? Why doesn't the assignment in p1 affect p2?

Thanks,
Jon


_______________________________________________ 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