Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
Bug 327867 - AspectJ should by default ignore methods with a "synthetic" modifier label or the method modifier pattern should support it.
Summary: AspectJ should by default ignore methods with a "synthetic" modifier label or...
Status: RESOLVED FIXED
Alias: None
Product: AspectJ
Classification: Tools
Component: LTWeaving (show other bugs)
Version: unspecified   Edit
Hardware: All All
: P3 normal (vote)
Target Milestone: 1.6.12   Edit
Assignee: aspectj inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2010-10-15 05:28 EDT by William Louth CLA
Modified: 2011-05-02 15:40 EDT (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description William Louth CLA 2010-10-15 05:28:49 EDT
It looks like ModifiersPattern class needs to be updated to support exclusion of synthetic methods in pointcuts though I would question why by default AspectJ allows such methods to be instrumented in the first place. It would probably be better to disable this and have an X flag to enable it in the exclusion set. If not can we have the code below updated to allow "synthetic" to be specified in particular "!synthetic" in a point cut. Today it does not work because of a parser exception caused by it not being in the map below.

static {
        modifierFlags = new HashMap<String, Integer>();
        int flag = 1;
        while (flag <= Modifier.STRICT) {
            String flagName = Modifier.toString(flag);
            modifierFlags.put(flagName, new Integer(flag));
            flag = flag << 1;
        }
    }


public static final int STRICT           = 0x00000800;

    // Bits not (yet) exposed in the public API either because they
    // have different meanings for fields and methods and there is no
    // way to distinguish between the two in this class, or because
    // they are not Java programming language keywords
    static final int BRIDGE    = 0x00000040;
    static final int VARARGS   = 0x00000080;
    static final int SYNTHETIC = 0x00001000;
    static final int ANNOTATION= 0x00002000;
    static final int ENUM      = 0x00004000;
    static boolean isSynthetic(int mod) {
      return (mod & SYNTHETIC) != 0;
    }
Comment 1 Andrew Clement CLA 2011-05-02 15:40:11 EDT
Fixed.  You can now exclude them with 'synthetic' as a modifier.

Whether to weave them at all is a bigger discussion.

This will also only work on Java 1.5 built code - because at the 1.4 level synthetic was not stored as a bit in the modifiers flag it was an attribute on the method.  I don't plan (until there is a need) to do the necessary mucking about to allow for the attribute form of synthetic.  Hope this change is good enough for you for now.