]> source.dussan.org Git - aspectj.git/commitdiff
250493: fix: bridge generic itd methods missing flag
authoraclement <aclement>
Tue, 14 Oct 2008 19:04:20 +0000 (19:04 +0000)
committeraclement <aclement>
Tue, 14 Oct 2008 19:04:20 +0000 (19:04 +0000)
weaver/src/org/aspectj/weaver/AjcMemberMaker.java
weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java

index 8c5959c6876c27f8bf028454485ddf47365b1da0..643871bc1400821c04c97f7ca2a8fd16728bca87 100644 (file)
@@ -25,6 +25,8 @@ public class AjcMemberMaker {
 
        private static final int PUBLIC_STATIC = Modifier.PUBLIC | Modifier.STATIC;
 
+       private static final int BRIDGE = 0x0040;
+
        private static final int VISIBILITY = Modifier.PUBLIC | Modifier.PRIVATE | Modifier.PROTECTED;
 
        public static final UnresolvedType CFLOW_STACK_TYPE = UnresolvedType.forName(NameMangler.CFLOW_STACK_TYPE);
@@ -475,6 +477,25 @@ public class AjcMemberMaker {
                return rmi;
        }
 
+       /**
+        * This method goes on the target type of the inter-type method. (and possibly the topmost-implementors, if the target type is
+        * an interface). The implementation will call the interMethodDispatch method on the aspect.
+        */
+       public static ResolvedMember interMethodBridger(ResolvedMember meth, UnresolvedType aspectType, boolean onInterface) {
+               // if (Modifier.isPublic(meth.getModifiers()) && !onInterface)
+               // return meth;
+
+               int modifiers = makePublicNonFinal(meth.getModifiers()) | BRIDGE;
+               if (onInterface)
+                       modifiers |= Modifier.ABSTRACT;
+
+               ResolvedMemberImpl rmi = new ResolvedMemberImpl(Member.METHOD, meth.getDeclaringType(), modifiers, meth.getReturnType(),
+                               NameMangler.interMethod(meth.getModifiers(), aspectType, meth.getDeclaringType(), meth.getName()), meth
+                                               .getParameterTypes(), meth.getExceptions());
+               rmi.setTypeVariables(meth.getTypeVariables());
+               return rmi;
+       }
+
        /**
         * Sometimes the intertyped method requires a bridge method alongside it. For example if the method 'N SomeI<N>.m()' is put onto
         * an interface 'interface I<N extends Number>' and then a concrete implementation is 'class C implements I<Float>' then the ITD
index f2c083f436b32c5d0054daabb456a198e6f532cc..54085bfbfc490c0bcdd84237943f11428b6bdda8 100644 (file)
@@ -986,7 +986,7 @@ public class BcelTypeMunger extends ConcreteTypeMunger {
                                        }
                                        if (needsbridging) {
                                                ResolvedMember bridgerMethod = AjcMemberMaker.bridgerToInterMethod(unMangledInterMethod, gen.getType());
-                                               ResolvedMember bridgingSetter = AjcMemberMaker.interMethod(toBridgeTo, aspectType, false);
+                                               ResolvedMember bridgingSetter = AjcMemberMaker.interMethodBridger(toBridgeTo, aspectType, false); // pr250493
 
                                                // FIXME asc ----------------8<---------------- extract
                                                // method