diff options
author | aclement <aclement> | 2008-06-11 18:24:25 +0000 |
---|---|---|
committer | aclement <aclement> | 2008-06-11 18:24:25 +0000 |
commit | 3b13e9b46e82001b285bbc61634ec1c446e84343 (patch) | |
tree | b0ec2abf8a7786336304b7b446a77925208e286e /weaver | |
parent | 7ceeb0b26a83c56bee579aed4e42b458f1f3469c (diff) | |
download | aspectj-3b13e9b46e82001b285bbc61634ec1c446e84343.tar.gz aspectj-3b13e9b46e82001b285bbc61634ec1c446e84343.zip |
197719: test and fix: advising protected method calls from inner classes
Diffstat (limited to 'weaver')
-rw-r--r-- | weaver/src/org/aspectj/weaver/bcel/BcelShadow.java | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java b/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java index 99cb6f387..dbf68b730 100644 --- a/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java +++ b/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java @@ -3448,15 +3448,23 @@ public class BcelShadow extends Shadow { } ResolvedMember resolvedMember = getSignature().resolve(world); - // pr230075 + // pr230075, pr197719 if (resolvedMember != null && Modifier.isProtected(resolvedMember.getModifiers()) && !samePackage(resolvedMember.getDeclaringType().getPackageName(), getEnclosingType().getPackageName()) && !resolvedMember.getName().equals("clone")) { - if (!targetType.resolve(world).isAssignableFrom(getThisType().resolve(world))) { - throw new BCException("bad bytecode"); + if (!hasThis()) { // pr197719 - static accessor has been created to handle the call + if (Modifier.isStatic(enclosingMethod.getAccessFlags()) && enclosingMethod.getName().startsWith("access$")) { + targetType = BcelWorld.fromBcel(enclosingMethod.getArgumentTypes()[0]); + } else { + throw new BCException("unexpectedly found static context at shadow "+toString()+": accessor method involved?"); + } + } else { + if (!targetType.resolve(world).isAssignableFrom(getThisType().resolve(world))) { + throw new BCException("bad bytecode"); + } + targetType = getThisType(); } - targetType = getThisType(); } parameterTypes = addType(BcelWorld.makeBcelType(targetType), parameterTypes); } |