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 | |
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
-rw-r--r-- | tests/bugs150/pr59196.aj | 18 | ||||
-rw-r--r-- | tests/src/org/aspectj/systemtest/ajc150/Ajc150Tests.java | 4 | ||||
-rw-r--r-- | tests/src/org/aspectj/systemtest/ajc150/ajc150.xml | 4 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/patterns/ArgsPointcut.java | 40 |
4 files changed, 62 insertions, 4 deletions
diff --git a/tests/bugs150/pr59196.aj b/tests/bugs150/pr59196.aj new file mode 100644 index 000000000..f54d98097 --- /dev/null +++ b/tests/bugs150/pr59196.aj @@ -0,0 +1,18 @@ +aspect some_aspect { + pointcut call_m(int a, int b) : call(int *.m(..)) && args(a, b); + + int m(int p, int q) { return 2; } + + void foo() { + m(1,4); + } + + int around(int x, int y) : call_m(x, y) { return 5; } +} + +aspect other_aspect { + before(int x, int y) : + adviceexecution() && within(some_aspect) && args(x, y) { + + } +}
\ No newline at end of file diff --git a/tests/src/org/aspectj/systemtest/ajc150/Ajc150Tests.java b/tests/src/org/aspectj/systemtest/ajc150/Ajc150Tests.java index de828818f..9d7053306 100644 --- a/tests/src/org/aspectj/systemtest/ajc150/Ajc150Tests.java +++ b/tests/src/org/aspectj/systemtest/ajc150/Ajc150Tests.java @@ -346,6 +346,10 @@ public class Ajc150Tests extends org.aspectj.testing.XMLBasedAjcTestCase { runTest("visibility in signature matching with overrides - 3"); } + public void testArgsGeneratedCorrectlyForAdviceExecution() { + runTest("args generated correctly for advice execution join point"); + } + // helper methods..... public SyntheticRepository createRepos(File cpentry) { diff --git a/tests/src/org/aspectj/systemtest/ajc150/ajc150.xml b/tests/src/org/aspectj/systemtest/ajc150/ajc150.xml index b1f4a2354..eaa4acef4 100644 --- a/tests/src/org/aspectj/systemtest/ajc150/ajc150.xml +++ b/tests/src/org/aspectj/systemtest/ajc150/ajc150.xml @@ -414,6 +414,10 @@ <message kind="warning" line="10" text="should match"/> </compile> </ajc-test> + + <ajc-test dir="bugs150" pr="59196" title="args generated correctly for advice execution join point"> + <compile files="pr59196.aj" options="-XnoInline -1.5"/> + </ajc-test> <!-- ============================================================================ --> <!-- ============================================================================ --> 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; |