Sfoglia il codice sorgente

fix for problem with transform of static synchronized method on pre Java5.

tags/pre_pr_153572
aclement 18 anni fa
parent
commit
b6925cbe5f

+ 9
- 0
tests/src/org/aspectj/systemtest/ajc152/SynchronizationTransformTests.java Vedi File

public void testTransformWithLTW() { public void testTransformWithLTW() {
runTest("transform with LTW"); runTest("transform with LTW");
} }

public void testTransformStaticMethodPreJava5() {
runTest("transform static method - preJ5");
}

public void testTransformStaticMethodPreJava5_2() {
runTest("transform static method - packages - preJ5");
}


// more complex code sequences... // more complex code sequences...
public void testOtherTargeters() { public void testOtherTargeters() {

+ 26
- 0
tests/src/org/aspectj/systemtest/ajc152/synchronization.xml Vedi File

</run> </run>
</ajc-test> </ajc-test>
<ajc-test dir="features152/synchronization/transformed" title="transform static method - preJ5">
<compile files="Fifteen.java" options="-Xjoinpoints:synchronization -1.4">
</compile>
<run class="Fifteen">
<stderr>
<line text="Locking occurring at lock(lock(Object))"/>
<line text="Fifteen.java"/>
<line text="hello"/>
</stderr>
</run>
</ajc-test>
<ajc-test dir="features152/synchronization/transformed" title="transform static method - packages - preJ5">
<compile files="Sixteen.java" options="-Xjoinpoints:synchronization -1.4">
</compile>
<run class="a.b.c.d.Sixteen">
<stderr>
<line text="Locking occurring at lock(lock(Object))"/>
<line text="Sixteen.java"/>
<line text="hello"/>
</stderr>
</run>
</ajc-test>
<ajc-test dir="features152/synchronization" title="obtaining locked object through getArgs"> <ajc-test dir="features152/synchronization" title="obtaining locked object through getArgs">
<compile files="LockingWithTJP.java" options="-Xjoinpoints:synchronization"> <compile files="LockingWithTJP.java" options="-Xjoinpoints:synchronization">
</compile> </compile>

+ 4
- 3
weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java Vedi File

parttwo.append(InstructionFactory.MONITORENTER); parttwo.append(InstructionFactory.MONITORENTER);
String fieldname = synchronizedMethod.getEnclosingClass().allocateField("class$"); String fieldname = synchronizedMethod.getEnclosingClass().allocateField("class$");
System.err.println("Going to use field name "+fieldname);
Field f = new FieldGen(Modifier.STATIC | Modifier.PRIVATE, Field f = new FieldGen(Modifier.STATIC | Modifier.PRIVATE,
Type.getType(Class.class),fieldname,synchronizedMethod.getEnclosingClass().getConstantPoolGen()).getField(); Type.getType(Class.class),fieldname,synchronizedMethod.getEnclosingClass().getConstantPoolGen()).getField();
synchronizedMethod.getEnclosingClass().addField(f, null); synchronizedMethod.getEnclosingClass().addField(f, null);
// 25: invokevirtual #52; //Method java/lang/Throwable.getMessage:()Ljava/lang/String; // 25: invokevirtual #52; //Method java/lang/Throwable.getMessage:()Ljava/lang/String;
// 28: invokespecial #54; //Method java/lang/NoClassDefFoundError."<init>":(Ljava/lang/String;)V // 28: invokespecial #54; //Method java/lang/NoClassDefFoundError."<init>":(Ljava/lang/String;)V
// 31: athrow // 31: athrow
prepend.append(fact.createGetStatic("C", fieldname, Type.getType(Class.class)));
String name = synchronizedMethod.getEnclosingClass().getName();
prepend.append(fact.createGetStatic(name, fieldname, Type.getType(Class.class)));
prepend.append(InstructionFactory.createDup(1)); prepend.append(InstructionFactory.createDup(1));
prepend.append(InstructionFactory.createBranchInstruction(Constants.IFNONNULL, parttwo.getStart())); prepend.append(InstructionFactory.createBranchInstruction(Constants.IFNONNULL, parttwo.getStart()));
prepend.append(InstructionFactory.POP); prepend.append(InstructionFactory.POP);
prepend.append(fact.createConstant("C"));
prepend.append(fact.createConstant(name));
InstructionHandle tryInstruction = prepend.getEnd(); InstructionHandle tryInstruction = prepend.getEnd();
prepend.append(fact.createInvoke("java.lang.Class", "forName", clazzType,new Type[]{ Type.getType(String.class)}, Constants.INVOKESTATIC)); prepend.append(fact.createInvoke("java.lang.Class", "forName", clazzType,new Type[]{ Type.getType(String.class)}, Constants.INVOKESTATIC));
InstructionHandle catchInstruction = prepend.getEnd(); InstructionHandle catchInstruction = prepend.getEnd();

Loading…
Annulla
Salva