diff options
author | aclement <aclement> | 2004-08-19 16:38:16 +0000 |
---|---|---|
committer | aclement <aclement> | 2004-08-19 16:38:16 +0000 |
commit | dbe1024f852c600d2752e5f39eb31ca4f5d72de9 (patch) | |
tree | 0742f9f6c0d18241cc1406af4e05f858e3897def /weaver | |
parent | b7db7da4c67aa4e93eba8b36daa3ff3d50b12194 (diff) | |
download | aspectj-dbe1024f852c600d2752e5f39eb31ca4f5d72de9.tar.gz aspectj-dbe1024f852c600d2752e5f39eb31ca4f5d72de9.zip |
Fix and testcase for Bugzilla Bug 49657
Weaver results in rt error if affected base class not exposed
Diffstat (limited to 'weaver')
4 files changed, 63 insertions, 20 deletions
diff --git a/weaver/src/org/aspectj/weaver/ResolvedTypeX.java b/weaver/src/org/aspectj/weaver/ResolvedTypeX.java index 3fbf7d588..c9e95c5f3 100644 --- a/weaver/src/org/aspectj/weaver/ResolvedTypeX.java +++ b/weaver/src/org/aspectj/weaver/ResolvedTypeX.java @@ -1307,6 +1307,25 @@ public abstract class ResolvedTypeX extends TypeX { return true; } + public ResolvedTypeX getTopmostImplementor(ResolvedTypeX interfaceType) { + if (isInterface()) return null; + if (!interfaceType.isAssignableFrom(this)) return null; + // Check if my super class is an implementor? + ResolvedTypeX higherType = this.getSuperclass().getTopmostImplementor(interfaceType); + if (higherType!=null) return higherType; + return this; + } + + private ResolvedTypeX findHigher(ResolvedTypeX other) { + if (this == other) return this; + for(Iterator i = other.getDirectSupertypes(); i.hasNext(); ) { + ResolvedTypeX rtx = (ResolvedTypeX)i.next(); + boolean b = this.isAssignableFrom(rtx); + if (b) return rtx; + } + return null; + } + public List getExposedPointcuts() { List ret = new ArrayList(); if (getSuperclass() != null) ret.addAll(getSuperclass().getExposedPointcuts()); diff --git a/weaver/src/org/aspectj/weaver/WeaverMessages.java b/weaver/src/org/aspectj/weaver/WeaverMessages.java index ae03329d3..8fe792f9b 100644 --- a/weaver/src/org/aspectj/weaver/WeaverMessages.java +++ b/weaver/src/org/aspectj/weaver/WeaverMessages.java @@ -52,6 +52,7 @@ public class WeaverMessages { public static final String ITD_OVERIDDING_STATIC = "overridingStatic"; public static final String ITD_CONFLICT = "itdConflict"; public static final String ITD_MEMBER_CONFLICT = "itdMemberConflict"; + public static final String ITD_NON_EXPOSED_IMPLEMENTOR = "itdNonExposedImplementor"; public static final String NON_VOID_RETURN = "nonVoidReturn"; diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java b/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java index b490e3d21..83b179643 100644 --- a/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java +++ b/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java @@ -24,6 +24,8 @@ import org.aspectj.apache.bcel.generic.InstructionFactory; import org.aspectj.apache.bcel.generic.InstructionList; import org.aspectj.apache.bcel.generic.Type; import org.aspectj.bridge.IMessage; +import org.aspectj.bridge.ISourceLocation; +import org.aspectj.bridge.MessageUtil; import org.aspectj.bridge.WeaveMessage; import org.aspectj.weaver.AjcMemberMaker; import org.aspectj.weaver.AsmRelationshipProvider; @@ -40,6 +42,7 @@ import org.aspectj.weaver.ResolvedMember; import org.aspectj.weaver.ResolvedTypeMunger; import org.aspectj.weaver.ResolvedTypeX; import org.aspectj.weaver.TypeX; +import org.aspectj.weaver.WeaverMessages; import org.aspectj.weaver.WeaverStateInfo; import org.aspectj.weaver.patterns.Pointcut; @@ -414,39 +417,58 @@ public class BcelTypeMunger extends ConcreteTypeMunger { addNeededSuperCallMethods(weaver, onType, munger.getSuperMethodsCalled()); return true; - } else if (onInterface && gen.getType().isTopmostImplementor(onType) && - !Modifier.isAbstract(signature.getModifiers())) - { - ResolvedMember introMethod = + + } else if (onInterface && !Modifier.isAbstract(signature.getModifiers())) { + + // This means the 'gen' should be the top most implementor + // - if it is *not* then something went wrong after we worked + // out that it was the top most implementor (see pr49657) + if (!gen.getType().isTopmostImplementor(onType)) { + ResolvedTypeX rtx = gen.getType().getTopmostImplementor(onType); + if (!rtx.isExposedToWeaver()) { + ISourceLocation sLoc = munger.getSourceLocation(); + weaver.getWorld().getMessageHandler().handleMessage(MessageUtil.error( + WeaverMessages.format(WeaverMessages.ITD_NON_EXPOSED_IMPLEMENTOR,rtx,getAspectType().getName()), + (sLoc==null?getAspectType().getSourceLocation():sLoc))); + } else { + // XXX what does this state mean? + // We have incorrectly identified what is the top most implementor and its not because + // a type wasn't exposed to the weaver + } + return false; + } else { + + ResolvedMember introMethod = AjcMemberMaker.interMethod(signature, aspectType, false); - LazyMethodGen mg = makeMethodGen(gen, introMethod); + LazyMethodGen mg = makeMethodGen(gen, introMethod); - Type[] paramTypes = BcelWorld.makeBcelTypes(introMethod.getParameterTypes()); - Type returnType = BcelWorld.makeBcelType(introMethod.getReturnType()); + Type[] paramTypes = BcelWorld.makeBcelTypes(introMethod.getParameterTypes()); + Type returnType = BcelWorld.makeBcelType(introMethod.getReturnType()); - InstructionList body = mg.getBody(); - InstructionFactory fact = gen.getFactory(); - int pos = 0; + InstructionList body = mg.getBody(); + InstructionFactory fact = gen.getFactory(); + int pos = 0; - if (!introMethod.isStatic()) { + if (!introMethod.isStatic()) { body.append(InstructionFactory.createThis()); pos++; - } - for (int i = 0, len = paramTypes.length; i < len; i++) { + } + for (int i = 0, len = paramTypes.length; i < len; i++) { Type paramType = paramTypes[i]; body.append(InstructionFactory.createLoad(paramType, pos)); pos+=paramType.getSize(); - } - body.append(Utility.createInvoke(fact, weaver.getWorld(), dispatchMethod)); - body.append(InstructionFactory.createReturn(returnType)); - mg.definingType = onType; + } + body.append(Utility.createInvoke(fact, weaver.getWorld(), dispatchMethod)); + body.append(InstructionFactory.createReturn(returnType)); + mg.definingType = onType; - weaver.addOrReplaceLazyMethodGen(mg); + weaver.addOrReplaceLazyMethodGen(mg); - addNeededSuperCallMethods(weaver, onType, munger.getSuperMethodsCalled()); + addNeededSuperCallMethods(weaver, onType, munger.getSuperMethodsCalled()); - return true; + return true; + } } else { return false; } diff --git a/weaver/src/org/aspectj/weaver/weaver-messages.properties b/weaver/src/org/aspectj/weaver/weaver-messages.properties index 5052d27ce..c731fb965 100644 --- a/weaver/src/org/aspectj/weaver/weaver-messages.properties +++ b/weaver/src/org/aspectj/weaver/weaver-messages.properties @@ -51,6 +51,7 @@ overriddenStatic={0} cannot override {1}; overridden method is static overridingStatic={0} cannot override {1}; overriding method is static itdConflict=intertype declaration from {0} conflicts with intertype declaration: {1} from {2} itdMemberConflict=inter-type declaration from {0} conflicts with existing member: {1} +itdNonExposedImplementor=type {0} must be accessible for weaving interface inter type declaration from aspect {1} # advice messages... nonVoidReturn=applying to join point that doesn't return void: {0} |