[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[aspectj-users] java.lang.VerifyError with weaved call to protected super-aspect method
|
I get a java.lang.VerifyError at runtime complaining about 'Bad access to
protected data' when advice on a sub-aspect that calls a protected method on
the super-aspect is woven into a class.
However another call to the same method woven into the same class but due to
advice declared in the super-aspect works fine.
It seems to me that both should work.
I've had a quick look in the bug tracker but can't find anything.
I am using version 1.1.1 of the compiler.
The aspects were woven into precompiled (by javac) classes.
The verify error occurs under both sun's 1.4 and blackdowns 1.3 VMs.
Following is a stack trace and some test files are attached.
Thanks
Daniel
Exception in thread "main" java.lang.VerifyError: (class:
com/spinsoftware/test/p1/ConcreteTest, method:
ajc$inlineAccessMethod$com_spinsoftware_test_p1_ConcreteTest$com_spinsoftware_test_p2_AbstractTest$getField
signature: (Lcom/spinsoftware/test/p2/AbstractTest;)I) Bad access to
protected data
at com.spinsoftware.test.Driver.doStuff(Driver.java)
at com.spinsoftware.test.Driver.main(Driver.java:18)
package com.spinsoftware.test;
public class Driver{
public static void main(String[] args) {
Driver d = new Driver();
d.doStuff();
d.doOtherStuff();
}
private void doOtherStuff() {
System.out.println("doing other stuff");
}
private void doStuff() {
System.out.println("doing stuff");
}
}
package com.spinsoftware.test.p1;
import com.spinsoftware.test.p2.AbstractTest;
import com.spinsoftware.test.Driver;
final aspect ConcreteTest extends AbstractTest {
protected pointcut pc(): execution(* Driver.doStuff());
protected pointcut pc2(): execution(* Driver.doOtherStuff());
Object around(): pc2() {
System.out.println("adding to the other stuff");
/*If we comment out the next line we don't get a verify error.*/
System.out.println("The value of the field when replacing is " + getField());
return proceed();
}
protected void hook() {
/*This doesn't cause a verify error seemably because the advice calling it is in AbstractTest*/
System.out.println("The value of the field is " + getField());
}
}
package com.spinsoftware.test.p2;
public abstract aspect AbstractTest {
private int field;
protected abstract pointcut pc();
Object around(): pc() {
this.field++;
hook();
return proceed();
}
protected final int getField() {
return this.field;
}
protected abstract void hook();
}