[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [aspectj-dev] Missing LocalVariableTable info for around advice ?
|
Hi Per,
Your diagnosis sounds right. If you want to investigate further, you
should check out the AspectJ source tree and take a look around the weaver
module in BcelShadow.weaveAroundClosure() (and maybe
BcelShadow.weaveAroundInline() also has a similar problem). You will see
the helper method extractMethod() is called to move instructions around - I
can't see any support for ensuring the local variable table makes it across
in the copy. You should raise a bug against AJ and use it to track your
findings and maybe your fix :)
Andy.
---
Andy Clement
AspectJ Dev
clemas@xxxxxxxxxx
<per.hustad@telen
or.com>
Sent by: To
aspectj-dev-bounc <aspectj-dev@xxxxxxxxxxx>
es@xxxxxxxxxxx cc
Subject
13/06/2005 16:44 [aspectj-dev] Missing
LocalVariableTable info for around
advice ?
Please respond to
AspectJ developer
discussions
<aspectj-dev@ecli
pse.org>
Hi!
When debugging java code woven with an "around" advice, it looks like the
LocalVariableTable information gets lost during the weaving. E.g.
considering the following code:
// Foo.java
public class Foo {
private String myString = "A String";
public static void main(String[] args) {
new Foo().foo();
}
private void foo() {
String myLocal = myString;
System.out.println(myLocal); // breakpoint here
}
}
// Test.aj
aspect Test {
void around() : ( execution(* Foo.foo(..) ) ) {
System.out.println("before");
proceed();
System.out.println("after");
}
}
We compiled with ajc 1.2.1:
ajc -g -preserveAllLocals -sourceroots .
When running Foo in the Eclipse 3.1.0 debugger and setting a breakpoint at
the "System.out.println(myLocal);" line, the debugger "Variables" window is
empty. Also, disassembling with javap shows that the LocalVariableTable is
empty in the generated foo_aroundBody1$advice :
private static final void
foo_aroundBody1$advice(Foo,Test,org.aspectj.runtime.internal.AroundClosure);
Signature: (LFoo;LTest;Lorg/aspectj/runtime/internal/AroundClosure;)V
Code:
0: getstatic #34; //Field
java/lang/System.out:Ljava/io/PrintStream;
3: ldc #47; //String before
5: invokevirtual #40; //Method
java/io/PrintStream.println:(Ljava/lang/String;)V
8: aload_2
9: astore_3
10: aload_0
11: invokestatic #65; //Method foo_aroundBody0:(LFoo;)V
14: getstatic #34; //Field
java/lang/System.out:Ljava/io/PrintStream;
17: ldc #55; //String after
19: invokevirtual #40; //Method
java/io/PrintStream.println:(Ljava/lang/String;)V
22: return
LineNumberTable:
line 103: 0
line 104: 8
line 105: 14
line 106: 22
LocalVariableTable:
Start Length Slot Name Signature
0 23 0 this LTest;
0 23 1 ajc_aroundClosure
Lorg/aspectj/runtime/internal/AroundClosure;
I guess the answer is that the original class LocalVariableTable
information is not copied over to the foo_aroundBody1$advice, and to do
that would involves changes to the org.eclipse.jdt module. I would be happy
to look into this if someone could guide me where to start.
- Per
_______________________________________________
aspectj-dev mailing list
aspectj-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-dev