Index: src/org/aspectj/weaver/CrosscuttingMembers.java =================================================================== RCS file: /home/technology/org.aspectj/modules/weaver/src/org/aspectj/weaver/CrosscuttingMembers.java,v retrieving revision 1.23 diff -u -r1.23 CrosscuttingMembers.java --- src/org/aspectj/weaver/CrosscuttingMembers.java 7 Mar 2006 11:06:34 -0000 1.23 +++ src/org/aspectj/weaver/CrosscuttingMembers.java 7 Mar 2006 16:12:48 -0000 @@ -20,6 +20,7 @@ import java.util.List; import java.util.Set; +import org.aspectj.weaver.bcel.BcelTypeMunger; import org.aspectj.weaver.patterns.Declare; import org.aspectj.weaver.patterns.DeclareAnnotation; import org.aspectj.weaver.patterns.DeclareErrorOrWarning; @@ -240,12 +241,43 @@ shadowMungers = other.shadowMungers; } } - // bug 129163: use set equality rather than list equality + + // bug 129163: use set equality rather than list equality and + // if we dont care about shadow mungers then ignore those + // typeMungers which are created to help with the implementation + // of shadowMungers Set theseTypeMungers = new HashSet(); - theseTypeMungers.addAll(typeMungers); Set otherTypeMungers = new HashSet(); - otherTypeMungers.addAll(other.typeMungers); - if (!theseTypeMungers.equals(otherTypeMungers)) { + if (!careAboutShadowMungers) { + for (Iterator iter = typeMungers.iterator(); iter.hasNext();) { + Object o = iter.next(); + if (o instanceof BcelTypeMunger) { + BcelTypeMunger typeMunger = (BcelTypeMunger) o; + if (!typeMunger.existsToSupportShadowMunging()) { + theseTypeMungers.add(typeMunger); + } + } else { + theseTypeMungers.add(o); + } + } + + for (Iterator iter = other.typeMungers.iterator(); iter.hasNext();) { + Object o = iter.next(); + if (o instanceof BcelTypeMunger) { + BcelTypeMunger typeMunger = (BcelTypeMunger) o; + if (!typeMunger.existsToSupportShadowMunging()) { + otherTypeMungers.add(typeMunger); + } + } else { + otherTypeMungers.add(o); + } + } + } else { + theseTypeMungers.addAll(typeMungers); + otherTypeMungers.addAll(other.typeMungers); + } + + if (!theseTypeMungers.equals(otherTypeMungers)) { changed = true; typeMungers = other.typeMungers; } Index: src/org/aspectj/weaver/PrivilegedAccessMunger.java =================================================================== RCS file: /home/technology/org.aspectj/modules/weaver/src/org/aspectj/weaver/PrivilegedAccessMunger.java,v retrieving revision 1.6 diff -u -r1.6 PrivilegedAccessMunger.java --- src/org/aspectj/weaver/PrivilegedAccessMunger.java 7 Mar 2006 16:08:34 -0000 1.6 +++ src/org/aspectj/weaver/PrivilegedAccessMunger.java 7 Mar 2006 16:12:48 -0000 @@ -63,4 +63,7 @@ return result; } + public boolean existsToSupportShadowMunging() { + return true; + } } Index: src/org/aspectj/weaver/ResolvedTypeMunger.java =================================================================== RCS file: /home/technology/org.aspectj/modules/weaver/src/org/aspectj/weaver/ResolvedTypeMunger.java,v retrieving revision 1.35 diff -u -r1.35 ResolvedTypeMunger.java --- src/org/aspectj/weaver/ResolvedTypeMunger.java 6 Mar 2006 16:09:29 -0000 1.35 +++ src/org/aspectj/weaver/ResolvedTypeMunger.java 7 Mar 2006 16:12:48 -0000 @@ -407,5 +407,20 @@ return false; } + /** + * Some type mungers are created purely to help with the implementation of shadow mungers. + * For example to support the cflow() pointcut we create a new cflow field in the aspect, and + * that is added via a BcelCflowCounterFieldAdder. + * + * During compilation we need to compare sets of type mungers, and if some only come into + * existence after the 'shadowy' type things have been processed, we need to ignore + * them during the comparison. + * + * Returning true from this method indicates the type munger exists to support 'shadowy' stuff - + * and so can be ignored in some comparison. + */ + public boolean existsToSupportShadowMunging() { + return false; + } } Index: src/org/aspectj/weaver/bcel/BcelTypeMunger.java =================================================================== RCS file: /home/technology/org.aspectj/modules/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java,v retrieving revision 1.73 diff -u -r1.73 BcelTypeMunger.java --- src/org/aspectj/weaver/bcel/BcelTypeMunger.java 7 Mar 2006 16:08:35 -0000 1.73 +++ src/org/aspectj/weaver/bcel/BcelTypeMunger.java 7 Mar 2006 16:12:49 -0000 @@ -1677,7 +1677,10 @@ * and so can be ignored in some comparison. */ public boolean existsToSupportShadowMunging() { - return false; // Does this need to delegate to the ResolvedTypeMunger field held in the BcelTypeMunger? + if (munger != null) { + return munger.existsToSupportShadowMunging(); + } + return false; } } \ No newline at end of file