diff options
author | aclement <aclement> | 2006-05-12 12:32:42 +0000 |
---|---|---|
committer | aclement <aclement> | 2006-05-12 12:32:42 +0000 |
commit | 64d321521a3e66e39510c2c150ba6b06ca40cc68 (patch) | |
tree | 4f69c6ffeb3269adc86adcbe7cf60c0cda600eca | |
parent | 7a955f0f8f2fcd843e8c796e3f1ac9136fd77d82 (diff) | |
download | aspectj-64d321521a3e66e39510c2c150ba6b06ca40cc68.tar.gz aspectj-64d321521a3e66e39510c2c150ba6b06ca40cc68.zip |
tests and fix for 136026: cflow verifyerror in non trivial combination of cflow pointcuts.
-rw-r--r-- | tests/bugs152/pr136026/CflowOrder.java | 42 | ||||
-rw-r--r-- | tests/bugs152/pr136026/CflowOrderOriginal.java | 98 | ||||
-rw-r--r-- | tests/src/org/aspectj/systemtest/ajc152/Ajc152Tests.java | 2 | ||||
-rw-r--r-- | tests/src/org/aspectj/systemtest/ajc152/ajc152.xml | 26 |
4 files changed, 168 insertions, 0 deletions
diff --git a/tests/bugs152/pr136026/CflowOrder.java b/tests/bugs152/pr136026/CflowOrder.java new file mode 100644 index 000000000..a06fe518c --- /dev/null +++ b/tests/bugs152/pr136026/CflowOrder.java @@ -0,0 +1,42 @@ +import java.io.PrintStream; +import java.lang.annotation.*; + +@Retention(RetentionPolicy.RUNTIME) @interface Marker {} + +class A { + @Marker void foo() { } + public static void main(String[] args) { + new A().foo(); + } +} + +public class CflowOrder { + + public static void main(String[] args) { + A.main(null); + } + + + + + static aspect MyAspect { + + pointcut annotated(Marker a) : execution(@Marker * *(..)) && @annotation(a); + + pointcut belowAnnotated() : cflowbelow(annotated(Marker)); + +// pointcut belowAnnotated() : cflowbelow(execution(@Marker * *(..)) && @annotation(Marker)); + + pointcut topAnnotated(Marker a) : annotated(a) && !belowAnnotated(); + + pointcut notTopAnnotated(/*Marker a,*/ Marker aTop) : + /* annotated(a) &&*/ cflowbelow(annotated(aTop)); + + // if this first, then no nonTopAnnotated advice + before(Marker a) : topAnnotated(a) { } + + // if topAnnotated is first, this does not run + before(Marker aTop) : notTopAnnotated( aTop) { } + } +} + diff --git a/tests/bugs152/pr136026/CflowOrderOriginal.java b/tests/bugs152/pr136026/CflowOrderOriginal.java new file mode 100644 index 000000000..bd3dea68f --- /dev/null +++ b/tests/bugs152/pr136026/CflowOrderOriginal.java @@ -0,0 +1,98 @@ +package bugs; + +import java.io.PrintStream; +import java.lang.annotation.*; + +import org.aspectj.lang.JoinPoint; + +public class CflowOrderOriginal { + + public static void main(String[] args) { + Log.print("Starting CflowOrder.main(..)"); + A.main(null); + Log.print("Ending CflowOrder.main(..)"); + } + + @Retention(value = RetentionPolicy.RUNTIME) + @interface Annotation { + String value(); + } + + static class A { + @Annotation("A.foo") + void foo() { + new B().foo(); + Log.print("A.foo()"); + } + + public static void main(String[] args) { + new A().foo(); + Log.print("A.main(..)"); + } + } + + static class B { + @Annotation("B.foo") + void foo() { + Log.print("B.foo()"); + } + } + + static class Log implements IAspect { + static final PrintStream out = System.err; + + static void print(String label) { + out.println(label); + } + + static void print(String label, JoinPoint tjp, JoinPoint.StaticPart sp, + Object a) { + out.println(label); +// out.println(" Join point: " + tjp); +// out.println(" Enclosing join point: " + sp); +// out.println(" Annotation: " + a); + } + } + static aspect Logger implements IAspect { + + //declare error: execution(* *(..)) && !within(Log) : "er"; + +// before() : cflow(execution(void CflowOrder.main(String[]))) +// && !call(* IAspect+.*(..)) && ! within(IAspect+) { +// Log.print("cflow(..main(..))", thisJoinPoint, +// thisEnclosingJoinPointStaticPart, null); +// } + } + + interface IAspect {} + static aspect MyAspect implements IAspect { + + pointcut annotated(Annotation a) : + call(@Annotation * *(..)) && @annotation(a); + + pointcut belowAnnotated() : + cflowbelow(annotated(Annotation)); + pointcut topAnnotated(Annotation a) : annotated(a) + && !belowAnnotated(); + + pointcut notTopAnnotated(Annotation a, Annotation aTop) : annotated(a) + && cflowbelow(annotated(aTop)); +// pointcut topAnnotated(Annotation a) : annotated(a) +// && !cflowbelow(annotated(Annotation)); +// +// pointcut notTopAnnotated(Annotation a, Annotation aTop) : annotated(a) +// && cflowbelow(topAnnotated(aTop)); + + // if this first, then no nonTopAnnotated advice + before(Annotation a) : topAnnotated(a) { + Log.print("topAnnotated", thisJoinPoint, + thisEnclosingJoinPointStaticPart, a); + } + // if topAnnotated is first, this does not run + before(Annotation a, Annotation aTop) : notTopAnnotated(a, aTop) { + Log.print("nonTopAnnotated", thisJoinPoint, + thisEnclosingJoinPointStaticPart, a); + } + } +} + diff --git a/tests/src/org/aspectj/systemtest/ajc152/Ajc152Tests.java b/tests/src/org/aspectj/systemtest/ajc152/Ajc152Tests.java index bc369eca7..8344f1070 100644 --- a/tests/src/org/aspectj/systemtest/ajc152/Ajc152Tests.java +++ b/tests/src/org/aspectj/systemtest/ajc152/Ajc152Tests.java @@ -17,6 +17,8 @@ import org.aspectj.testing.XMLBasedAjcTestCase; public class Ajc152Tests extends org.aspectj.testing.XMLBasedAjcTestCase { + public void testVerifyErrorForComplexCflow_pr136026() { runTest("verifyerror");} + public void testVerifyErrorForComplexCflow_pr136026_2() { runTest("verifyerror - 2");} public void testAnnotationsAndGenericsBCException_pr129704() { runTest("annotations and generics leading to BCException");} public void testMethodTooBigAfterWeaving_pr138384() { runTest("method too big"); } public void testNotAtWithincode_pr138158_1() { runTest("not at withincode - 1");} diff --git a/tests/src/org/aspectj/systemtest/ajc152/ajc152.xml b/tests/src/org/aspectj/systemtest/ajc152/ajc152.xml index ce82b82eb..08b008bdf 100644 --- a/tests/src/org/aspectj/systemtest/ajc152/ajc152.xml +++ b/tests/src/org/aspectj/systemtest/ajc152/ajc152.xml @@ -24,6 +24,32 @@ </run> </ajc-test> + <ajc-test dir="bugs152/pr136026" title="verifyerror"> + <compile files="CflowOrder.java" options="-1.5"/> + <run class="CflowOrder"/> + </ajc-test> + + <ajc-test dir="bugs152/pr136026" title="verifyerror - 2"> + <compile files="CflowOrderOriginal.java" options="-1.5"/> + <run class="bugs.CflowOrderOriginal"> + <stderr> + <line text="Starting CflowOrder.main(..)"/> + <line text="topAnnotated"/> + <!--line text=" Join point: call(void bugs.CflowOrderOriginal.A.foo())"/> + <line text=" Enclosing join point: execution(void bugs.CflowOrderOriginal.A.main(String[]))"/> + <line text=" Annotation: @bugs.CflowOrderOriginal$Annotation(value=A.foo)"/--> + <line text="nonTopAnnotated"/> + <!--line text=" Join point: call(void bugs.CflowOrderOriginal.B.foo())"/> + <line text=" Enclosing join point: execution(void bugs.CflowOrderOriginal.A.foo())"/> + <line text=" Annotation: @bugs.CflowOrderOriginal$Annotation(value=B.foo)"/--> + <line text="B.foo()"/> + <line text="A.foo()"/> + <line text="A.main(..)"/> + <line text="Ending CflowOrder.main(..)"/> + </stderr> + </run> + </ajc-test> + <ajc-test dir="bugs152/pr136258" title="stack overflow"> <compile files="StatisticsTypeImpl.java" options="-1.5"/> <run class="StatisticsTypeImpl"/> |