diff options
author | acolyer <acolyer> | 2005-09-01 08:30:41 +0000 |
---|---|---|
committer | acolyer <acolyer> | 2005-09-01 08:30:41 +0000 |
commit | a66e0a2aa8a6cb057f4b0d740ad961fb1ede5e85 (patch) | |
tree | 597d2b53bf5c38031c2e9e722ff3fe968bd24911 /weaver | |
parent | 0c0f2d509a0329fbcf2fd1f1ff65b93b31880cf3 (diff) | |
download | aspectj-a66e0a2aa8a6cb057f4b0d740ad961fb1ede5e85.tar.gz aspectj-a66e0a2aa8a6cb057f4b0d740ad961fb1ede5e85.zip |
tests and fix for pr59196, args pcd not ignoring synthetic arguments at adviceexecution join points
Diffstat (limited to 'weaver')
-rw-r--r-- | weaver/src/org/aspectj/weaver/patterns/ArgsPointcut.java | 40 |
1 files changed, 36 insertions, 4 deletions
diff --git a/weaver/src/org/aspectj/weaver/patterns/ArgsPointcut.java b/weaver/src/org/aspectj/weaver/patterns/ArgsPointcut.java index e3ea9f735..2fd1eb7b6 100644 --- a/weaver/src/org/aspectj/weaver/patterns/ArgsPointcut.java +++ b/weaver/src/org/aspectj/weaver/patterns/ArgsPointcut.java @@ -51,7 +51,10 @@ import org.aspectj.weaver.internal.tools.PointcutExpressionImpl; * @author Erik Hilsdale * @author Jim Hugunin */ -public class ArgsPointcut extends NameBindingPointcut { +public class ArgsPointcut extends NameBindingPointcut { + private static final String ASPECTJ_JP_SIGNATURE_PREFIX = "Lorg/aspectj/lang/JoinPoint"; + private static final String ASPECTJ_SYNTHETIC_SIGNATURE_PREFIX = "Lorg/aspectj/runtime/internal/"; + private TypePatternList arguments; public ArgsPointcut(TypePatternList arguments) { @@ -76,11 +79,39 @@ public class ArgsPointcut extends NameBindingPointcut { } protected FuzzyBoolean matchInternal(Shadow shadow) { + ResolvedType[] argumentsToMatchAgainst = getArgumentsToMatchAgainst(shadow); FuzzyBoolean ret = - arguments.matches(shadow.getIWorld().resolve(shadow.getGenericArgTypes()), TypePattern.DYNAMIC); + arguments.matches(argumentsToMatchAgainst, TypePattern.DYNAMIC); return ret; } + private ResolvedType[] getArgumentsToMatchAgainst(Shadow shadow) { + ResolvedType[] argumentsToMatchAgainst = shadow.getIWorld().resolve(shadow.getGenericArgTypes()); + + // special treatment for adviceexecution which may have synthetic arguments we + // want to ignore. + if (shadow.getKind() == Shadow.AdviceExecution) { + int numExtraArgs = 0; + for (int i = 0; i < argumentsToMatchAgainst.length; i++) { + String argumentSignature = argumentsToMatchAgainst[i].getSignature(); + if (argumentSignature.startsWith(ASPECTJ_JP_SIGNATURE_PREFIX) || argumentSignature.startsWith(ASPECTJ_SYNTHETIC_SIGNATURE_PREFIX)) { + numExtraArgs++; + } else { + // normal arg after AJ type means earlier arg was NOT synthetic + numExtraArgs = 0; + } + } + if (numExtraArgs > 0) { + int newArgLength = argumentsToMatchAgainst.length - numExtraArgs; + ResolvedType[] argsSubset = new ResolvedType[newArgLength]; + System.arraycopy(argumentsToMatchAgainst, 0, argsSubset, 0, newArgLength); + argumentsToMatchAgainst = argsSubset; + } + } + + return argumentsToMatchAgainst; + } + public FuzzyBoolean match(JoinPoint jp, JoinPoint.StaticPart jpsp) { FuzzyBoolean ret = arguments.matches(jp.getArgs(),TypePattern.DYNAMIC); // this may have given a false match (e.g. args(int) may have matched a call to doIt(Integer x)) due to boxing @@ -234,7 +265,8 @@ public class ArgsPointcut extends NameBindingPointcut { } private Test findResidueNoEllipsis(Shadow shadow, ExposedState state, TypePattern[] patterns) { - int len = shadow.getArgCount(); + ResolvedType[] argumentsToMatchAgainst = getArgumentsToMatchAgainst(shadow); + int len = argumentsToMatchAgainst.length; //System.err.println("boudn to : " + len + ", " + patterns.length); if (patterns.length != len) { return Literal.FALSE; @@ -310,7 +342,7 @@ public class ArgsPointcut extends NameBindingPointcut { } protected Test findResidueInternal(Shadow shadow, ExposedState state) { - if (arguments.matches(shadow.getIWorld().resolve(shadow.getGenericArgTypes()), TypePattern.DYNAMIC).alwaysFalse()) { + if (arguments.matches(getArgumentsToMatchAgainst(shadow), TypePattern.DYNAMIC).alwaysFalse()) { return Literal.FALSE; } int ellipsisCount = arguments.ellipsisCount; |