From: aclement Date: Tue, 14 Oct 2008 19:04:20 +0000 (+0000) Subject: 250493: fix: bridge generic itd methods missing flag X-Git-Tag: PRE_251277~13 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=dac17a6da63eb05904137c84c18d79670f4eb6df;p=aspectj.git 250493: fix: bridge generic itd methods missing flag --- diff --git a/weaver/src/org/aspectj/weaver/AjcMemberMaker.java b/weaver/src/org/aspectj/weaver/AjcMemberMaker.java index 8c5959c68..643871bc1 100644 --- a/weaver/src/org/aspectj/weaver/AjcMemberMaker.java +++ b/weaver/src/org/aspectj/weaver/AjcMemberMaker.java @@ -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.m()' is put onto * an interface 'interface I' and then a concrete implementation is 'class C implements I' then the ITD diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java b/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java index f2c083f43..54085bfbf 100644 --- a/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java +++ b/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java @@ -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