summaryrefslogtreecommitdiffstats
path: root/weaver
diff options
context:
space:
mode:
authoraclement <aclement>2004-08-19 16:38:16 +0000
committeraclement <aclement>2004-08-19 16:38:16 +0000
commitdbe1024f852c600d2752e5f39eb31ca4f5d72de9 (patch)
tree0742f9f6c0d18241cc1406af4e05f858e3897def /weaver
parentb7db7da4c67aa4e93eba8b36daa3ff3d50b12194 (diff)
downloadaspectj-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')
-rw-r--r--weaver/src/org/aspectj/weaver/ResolvedTypeX.java19
-rw-r--r--weaver/src/org/aspectj/weaver/WeaverMessages.java1
-rw-r--r--weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java62
-rw-r--r--weaver/src/org/aspectj/weaver/weaver-messages.properties1
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}