You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Bug.java 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import org.aspectj.lang.annotation.*;
  2. import org.aspectj.lang.*;
  3. @Aspect
  4. class X {
  5. @Pointcut("target(p) && args(c) && execution(* foo(..))")
  6. public void add(Bug p, C c) {}
  7. @Around("add(parent, child)")
  8. public Object addAdvice(ProceedingJoinPoint pjp, Object parent, Object child) throws Throwable {
  9. // System.out.println(".java - inside:::" + pjp.toLongString());
  10. //some work
  11. return pjp.proceed(new Object[] { parent, child });
  12. }
  13. }
  14. class C {
  15. }
  16. public class Bug {
  17. public static void main(String []argv) {
  18. new Bug().foo(new C());
  19. }
  20. public void foo(C c) {
  21. }
  22. }
  23. // private static final java.lang.Object foo_aroundBody1$advice(Bug, C, JoinPoint, X, ProceedingJoinPoint, java.lang.Object, java.lang.Object);
  24. /*
  25. Code getting ready to call that:
  26. public void foo(C);
  27. Code:
  28. Stack=7, Locals=4, Args_size=2
  29. 0: aload_1
  30. 1: astore_2
  31. 2: getstatic #35; //Field ajc$tjp_0:Lorg/aspectj/lang/JoinPoint$StaticPart;
  32. 5: aload_0
  33. 6: aload_0
  34. 7: aload_2
  35. 8: invokestatic #41; //Method org/aspectj/runtime/reflect/Factory.makeJP:(Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;
  36. Ljava/lang/Object;Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint;
  37. 11: astore_3
  38. 12: aload_0 // THIS
  39. 13: aload_2 // C
  40. 14: aload_3 // ProceedingJoinPoint
  41. 15: invokestatic #84; //Method X.aspectOf:()LX; // aspectOf (instance of X)
  42. 18: aload_3 // ProceedingJoinPoint
  43. 19: aload_0 // THIS
  44. 20: aload_2 // C
  45. 21: invokestatic #88; //Method foo_aroundBody1$advice:(LBug;LC;Lorg/aspectj/lang/JoinPoint;LX;Lorg/aspectj/lang/ProceedingJoinPoint;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
  46. 24: pop
  47. 25: return LineNumberTable:
  48. line 1: 0
  49. Here is foo_aroundBody1$advice:
  50. 0: aload 4 // PJP
  51. 2: iconst_2 // PJP, 2
  52. 3: anewarray #3; //class java/lang/Object // Object[2]
  53. 6: dup // Object[2] Object[2]
  54. 7: iconst_0 // O[2] O[2] 0
  55. 8: aload 5 // O[2] O[2] 0 Bug
  56. 10: aastore // O[2] with Bug in first position
  57. 11: dup // O[2] O[2]
  58. 12: iconst_1 // O[2] O[2] 1
  59. 13: aload 6 // O[2] O[2] 1 C
  60. 15: aastore // O[2] with Bug in first position and C in second position
  61. 16: astore 7 // store o[2] in 7
  62. 18: astore 8 // store pjp in 8
  63. 20: aload_0 // Bug
  64. 21: aload 7 // Bug O[2]
  65. 23: iconst_0 // Bug O[2] 0
  66. 24: aaload // Bug Bug
  67. 25: checkcast #1; //class Bug
  68. 28: aload 8 // Bug Bug PJP == loaded incorrect argument out of the array (and cast it to the wrong type)
  69. 30: invokestatic #61; //Method foo_aroundBody0:(LBug;LC;Lorg/aspectj/lang/JoinPoint;)V
  70. 33: aconst_null
  71. 34: areturn
  72. LocalVariableTable:
  73. Start Length Slot Name Signature
  74. 0 35 0 this LX;
  75. 0 35 1 pjp Lorg/aspectj/lang/ProceedingJoinPoint;
  76. 0 35 2 parent Ljava/lang/Object;
  77. 0 35 3 child Ljava/lang/Object;
  78. */