From 11ff72524df72345f24cc341119cf278808cdc32 Mon Sep 17 00:00:00 2001 From: aclement Date: Mon, 30 Nov 2009 21:04:08 +0000 Subject: [PATCH] 296484:296501: annotationbinding --- tests/bugs167/pr296484/AnnoBinding.java | 81 +++++++++++++++++ tests/bugs167/pr296484/Perf.java | 88 +++++++++++++++++++ tests/bugs167/pr296501/StringBinding.java | 19 ++++ .../optimizedAnnotationBinding/CaseFive.java | 6 +- .../ajc161/annotationFieldBinding.xml | 3 +- .../systemtest/ajc167/Ajc167Tests.java | 23 ++++- .../org/aspectj/systemtest/ajc167/ajc167.xml | 25 ++++++ 7 files changed, 237 insertions(+), 8 deletions(-) create mode 100644 tests/bugs167/pr296484/AnnoBinding.java create mode 100644 tests/bugs167/pr296484/Perf.java create mode 100644 tests/bugs167/pr296501/StringBinding.java diff --git a/tests/bugs167/pr296484/AnnoBinding.java b/tests/bugs167/pr296484/AnnoBinding.java new file mode 100644 index 000000000..08135e5d2 --- /dev/null +++ b/tests/bugs167/pr296484/AnnoBinding.java @@ -0,0 +1,81 @@ +import org.aspectj.lang.*; +import org.aspectj.lang.reflect.*; +import java.lang.annotation.*; + +@Retention(RetentionPolicy.RUNTIME) +@interface Marker { + String message(); +} + +public class AnnoBinding { + public static void main(String []argv) { + long stime = System.currentTimeMillis(); + for (int i=0;i<10000;i++) { + runOne(); + } + long etime = System.currentTimeMillis(); + long manual = (etime-stime); + stime = System.currentTimeMillis(); + for (int i=0;i<10000;i++) { + runTwo(); + } + etime = System.currentTimeMillis(); + long woven = (etime-stime); + System.out.println("woven="+woven+" manual="+manual); + if (woven>manual) { + throw new RuntimeException("woven="+woven+" manual="+manual); + } + if (X.a!=X.b) { + throw new RuntimeException("a="+X.a+" b="+X.b); + } + } + + @Marker(message="string") + public static void runOne() { + } + + @Marker(message="string") + public static void runTwo() { + } + + static Annotation ajc$anno$1; +} + +aspect X { + + pointcut pManual(): execution(@Marker * runOne(..)); + pointcut pWoven(Marker l): execution(@Marker * runTwo(..)) && @annotation(l); + + public static int a,b; + + before(): pManual() { + Marker marker = (Marker) ((MethodSignature) thisJoinPointStaticPart.getSignature()).getMethod().getAnnotation(Marker.class); + String s = marker.message(); + a+=s.length(); + } + + before(Marker l): pWoven(l) { + String s = l.message(); + b+=s.length(); + } +} + +// +//0: invokestatic #96; //Method X.aspectOf:()LX; +//3: getstatic #108; //Field ajc$anno$0:Ljava/lang/Annotation; +//6: dup +//7: ifnonnull 30 +//10: ldc #1; //class AnnoBinding +//12: ldc #109; //String runTwo +//14: iconst_0 +//15: anewarray #111; //class java/lang/Class +//18: invokevirtual #115; //Method java/lang/Class.getDeclaredMethod:(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Me +//d; +//21: ldc #104; //class Marker +//23: invokevirtual #121; //Method java/lang/reflect/Method.getAnnotation:(Ljava/lang/Class;)Ljava/lang/annotation/Annotation; +//26: dup +//27: putstatic #108; //Field ajc$anno$0:Ljava/lang/Annotation; +//30: nop +//31: checkcast #104; //class Marker +//34: invokevirtual #125; //Method X.ajc$before$X$2$ea6844ce:(LMarker;)V +//37: return \ No newline at end of file diff --git a/tests/bugs167/pr296484/Perf.java b/tests/bugs167/pr296484/Perf.java new file mode 100644 index 000000000..694c790c2 --- /dev/null +++ b/tests/bugs167/pr296484/Perf.java @@ -0,0 +1,88 @@ +import org.aspectj.lang.*; +import org.aspectj.lang.reflect.*; +import java.lang.annotation.*; + +@Retention(RetentionPolicy.RUNTIME) +@interface Marker { + String message(); +} + +public class Perf { + + public static void main(String []argv) { + run(true); + run(false); + } + + public static void run(boolean warmup) { + long stime = System.currentTimeMillis(); + for (int i=0;i<1000000;i++) { + runOne(); + } + long etime = System.currentTimeMillis(); + + long manual = (etime-stime); + stime = System.currentTimeMillis(); + for (int i=0;i<1000000;i++) { + runTwo(); + } + etime = System.currentTimeMillis(); + long woven = (etime-stime); + + stime = System.currentTimeMillis(); + for (int i=0;i<1000000;i++) { + runThree(); + } + etime = System.currentTimeMillis(); + long optimal = (etime-stime); + + if (!warmup) { + System.out.println("Manually fetching annotation with getAnnotation(): "+manual+"ms"); + System.out.println("Binding annotation with @annotation(Marker): "+woven+"ms"); + System.out.println("Binding annotation value with @annotation(Marker(message)): "+optimal+"ms"); + } + if (woven>manual) { + throw new RuntimeException("woven = "+woven+" manual = "+manual); + } + if (optimal>woven) { + throw new RuntimeException("optimal = "+optimal+" woven = "+woven); + } + } + + @Marker(message="string") + public static void runOne() { + } + + @Marker(message="string") + public static void runTwo() { + } + + @Marker(message="string") + public static void runThree() { + } +} + +aspect X { + public static int a,b,c; + + // CaseOne: annotation fetching is done in the advice: + pointcut adviceRetrievesAnnotation(): execution(@Marker * runOne(..)); + before(): adviceRetrievesAnnotation() { + Marker marker = (Marker) ((MethodSignature) thisJoinPointStaticPart.getSignature()).getMethod().getAnnotation(Marker.class); + String s = marker.message(); + a+=s.length(); + } + + // CaseTwo: annotation binding is done in the pointcut, advice retrieves message + pointcut pointcutBindsAnnotation(Marker l): execution(@Marker * runTwo(..)) && @annotation(l); + before(Marker l): pointcutBindsAnnotation(l) { + String s = l.message(); + b+=s.length(); + } + + // CaseThree: annotation binding directly targets the message value in the annotation + pointcut pointcutBindsAnnotationValue(String msg): execution(@Marker * runThree(..)) && @annotation(Marker(msg)); + before(String s): pointcutBindsAnnotationValue(s) { + c+=s.length(); + } +} \ No newline at end of file diff --git a/tests/bugs167/pr296501/StringBinding.java b/tests/bugs167/pr296501/StringBinding.java new file mode 100644 index 000000000..7345fd1a5 --- /dev/null +++ b/tests/bugs167/pr296501/StringBinding.java @@ -0,0 +1,19 @@ +import java.lang.annotation.*; + +@Retention(RetentionPolicy.RUNTIME) +@interface Wibble { + String message(); +} + +public class StringBinding { + + @Wibble(message="hello world") + public static void main(String []argv) { + } +} + +aspect X { + before(String msg): execution(* *(..)) && @annotation(Wibble(msg)) { + System.out.println(msg); + } +} diff --git a/tests/features161/optimizedAnnotationBinding/CaseFive.java b/tests/features161/optimizedAnnotationBinding/CaseFive.java index 59b7c7675..dc168f154 100644 --- a/tests/features161/optimizedAnnotationBinding/CaseFive.java +++ b/tests/features161/optimizedAnnotationBinding/CaseFive.java @@ -8,16 +8,16 @@ public class CaseFive { o.a(); } - @Anno("hello") public void a() {} + @Anno(4) public void a() {} } @Retention(RetentionPolicy.RUNTIME) -@interface Anno { String value(); } +@interface Anno { int value(); } aspect X { - before(String l): execution(@Anno * *(..)) && @annotation(Anno(l)) { + before(int l): execution(@Anno * *(..)) && @annotation(Anno(l)) { System.out.println(l); } } diff --git a/tests/src/org/aspectj/systemtest/ajc161/annotationFieldBinding.xml b/tests/src/org/aspectj/systemtest/ajc161/annotationFieldBinding.xml index f84e08f08..00ff8a5f0 100644 --- a/tests/src/org/aspectj/systemtest/ajc161/annotationFieldBinding.xml +++ b/tests/src/org/aspectj/systemtest/ajc161/annotationFieldBinding.xml @@ -39,7 +39,7 @@ - + @@ -118,7 +118,6 @@ - diff --git a/tests/src/org/aspectj/systemtest/ajc167/Ajc167Tests.java b/tests/src/org/aspectj/systemtest/ajc167/Ajc167Tests.java index 98a7a6f5f..8e59dd28f 100644 --- a/tests/src/org/aspectj/systemtest/ajc167/Ajc167Tests.java +++ b/tests/src/org/aspectj/systemtest/ajc167/Ajc167Tests.java @@ -18,18 +18,35 @@ import org.aspectj.testing.XMLBasedAjcTestCase; public class Ajc167Tests extends org.aspectj.testing.XMLBasedAjcTestCase { + public void testOptimizingAnnotationStringValueBinding() { + runTest("optimizing string anno value binding"); + } + + public void testOptimizingAnnotationBinding() { + runTest("optimizing annotation binding"); + } + + public void testOptimizingAnnotationBindingPerfTest() { + runTest("optimizing annotation binding - 2"); + } +/* + public void testPerThisLTW_295092() { + runTest("perthis ltw"); + } +*/ + public void testNpeOnBrokenCode_296054() { runTest("npe on broken code"); } - + public void testBrokenGeneratedCode_296040() { runTest("broken generated code"); } - + public void testHierarchyBuilderNPE_pr293457() { runTest("hierarchy builder npe"); } - + public void testTimers_1() { runTest("timers - 1"); } diff --git a/tests/src/org/aspectj/systemtest/ajc167/ajc167.xml b/tests/src/org/aspectj/systemtest/ajc167/ajc167.xml index 1ab32fc08..9fad6062d 100644 --- a/tests/src/org/aspectj/systemtest/ajc167/ajc167.xml +++ b/tests/src/org/aspectj/systemtest/ajc167/ajc167.xml @@ -3,6 +3,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + -- 2.39.5