diff options
author | aclement <aclement> | 2009-11-30 21:04:08 +0000 |
---|---|---|
committer | aclement <aclement> | 2009-11-30 21:04:08 +0000 |
commit | 11ff72524df72345f24cc341119cf278808cdc32 (patch) | |
tree | 36e586324a68879c8a86308b6bbcfc2e53da34dc /tests/bugs167/pr296484 | |
parent | 898d05cf68039b3a0d4449c0ed2cd6c9f74798ce (diff) | |
download | aspectj-11ff72524df72345f24cc341119cf278808cdc32.tar.gz aspectj-11ff72524df72345f24cc341119cf278808cdc32.zip |
296484:296501: annotationbinding
Diffstat (limited to 'tests/bugs167/pr296484')
-rw-r--r-- | tests/bugs167/pr296484/AnnoBinding.java | 81 | ||||
-rw-r--r-- | tests/bugs167/pr296484/Perf.java | 88 |
2 files changed, 169 insertions, 0 deletions
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 |