summaryrefslogtreecommitdiffstats
path: root/weaver
diff options
context:
space:
mode:
authoracolyer <acolyer>2005-09-01 08:30:41 +0000
committeracolyer <acolyer>2005-09-01 08:30:41 +0000
commita66e0a2aa8a6cb057f4b0d740ad961fb1ede5e85 (patch)
tree597d2b53bf5c38031c2e9e722ff3fe968bd24911 /weaver
parent0c0f2d509a0329fbcf2fd1f1ff65b93b31880cf3 (diff)
downloadaspectj-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.java40
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;