[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[aspectj-dev] generics problem: generated method not adviced (bug?)

Dear all,
I have a problem with the following aspect which can advice methods, depending on how it's compiled...


public class A implements java.util.Comparator <String> {
 public int compare(String a, String b) {
   return 0;
 }
}

javac generated a compare(Object, Object) method corresponding to

public int compare(Object a, Object b) {
  return compare((String)a, (String)b);
}

When weaving A.java with the following aspect, only the compare(String, String) method is adviced...

public aspect Foo {
 before() : execution(* *(..)) && !within(Foo) {}
}

javac A.java
jar cvf a.jar A.class
ajc -showWeaveInfo -inpath a.jar -outjar woven.jar Foo.aj
Join point 'method-execution(int A.compare(java.lang.String, java.lang.String))' in Type 'A' (A.java:3) advised by before advice from 'Foo' (Foo.aj:2)

Now, if I add the compare(Object, Object) manually, the Foo aspect advice both compare(String, String) and compare(Object, Object) methods!!!!


public class A implements java.util.Comparator /*<String> */ {
 public int compare(String a, String b) {
   return 0;
 }
 public int compare(Object a, Object b) {
   return compare((String)a, (String)b);
 }
}

javac A.java
jar cvf a.jar A.class
ajc -showWeaveInfo -inpath a.jar -outjar woven.jar Foo.aj
Join point 'method-execution(int A.compare(java.lang.String, java.lang.String))' in Type 'A' (A.java:3) advised by before advice from 'Foo' (Foo.aj:2)

Join point 'method-execution(int A.compare(java.lang.Object, java.lang.Object))' in Type 'A' (A.java:6) advised by before advice from 'Foo' (Foo.aj:2)

Curiously, the bytecode for compare(Object, Object) is strictly the same.. in both cases..


public int compare(java.lang.Object, java.lang.Object);
Signature: (Ljava/lang/Object;Ljava/lang/Object;)I
Code:
Stack=3, Locals=3, Args_size=3
0: aload_0
1: aload_1
2: checkcast #2; //class java/lang/String
5: aload_2
6: checkcast #2; //class java/lang/String
9: invokevirtual #3; //Method compare:(Ljava/lang/String;Ljava/ lang/String;)I
12: ireturn
LineNumberTable:
line 1: 0


Is this a bug of ajc? I tested it with 1.6.1 and 1.6.2 (development version)

Thanks a lot,

Alex