diff options
Diffstat (limited to 'tests/features152')
63 files changed, 2110 insertions, 0 deletions
diff --git a/tests/features152/synchronization/AfterLock.java b/tests/features152/synchronization/AfterLock.java new file mode 100644 index 000000000..34e5f9e2e --- /dev/null +++ b/tests/features152/synchronization/AfterLock.java @@ -0,0 +1,31 @@ +// after advice and lock + +public aspect AfterLock { + + after(Foo f): lock() && this(f) { + System.err.println("after(Foo) lock: advice running at "+thisJoinPoint.getSourceLocation()); + } + + after(): lock() { + System.err.println("after() lock: advice running at "+thisJoinPoint.getSourceLocation()); + } + + public static void main(String[] args) { + Foo aFoo = new Foo(); + aFoo.staticM(); + aFoo.nonstaticM(); + } + + static class Foo { + public void nonstaticM() { + synchronized (this) { + System.err.println("non-static method running"); + } + } + public static void staticM() { + synchronized (String.class) { + System.err.println("static method running"); + } + } + } +}
\ No newline at end of file diff --git a/tests/features152/synchronization/AfterUnlock.java b/tests/features152/synchronization/AfterUnlock.java new file mode 100644 index 000000000..5463a3215 --- /dev/null +++ b/tests/features152/synchronization/AfterUnlock.java @@ -0,0 +1,31 @@ +// after advice and unlock + +public aspect AfterUnlock { + + after(Foo f): unlock() && this(f) { + System.err.println("after(Foo) unlock: advice running at "+thisJoinPoint.getSourceLocation()); + } + + after(): unlock() { + System.err.println("after() unlock: advice running at "+thisJoinPoint.getSourceLocation()); + } + + public static void main(String[] args) { + Foo aFoo = new Foo(); + aFoo.staticM(); + aFoo.nonstaticM(); + } + + static class Foo { + public void nonstaticM() { + synchronized (this) { + System.err.println("non-static method running"); + } + } + public static void staticM() { + synchronized (String.class) { + System.err.println("static method running"); + } + } + } +}
\ No newline at end of file diff --git a/tests/features152/synchronization/AroundLock.java b/tests/features152/synchronization/AroundLock.java new file mode 100644 index 000000000..048fc8cd5 --- /dev/null +++ b/tests/features152/synchronization/AroundLock.java @@ -0,0 +1,41 @@ +// around advice and lock + +public aspect AroundLock { + + String s = "foo"; +// void around(Object f): lock() && args(f) { +// System.err.println("around(Object) lock: advice running at "+thisJoinPoint.getSourceLocation()); +// proceed(f); +// } + + void around(Object f): lock() && args(f){ + System.err.println("around() lock: advice running at "+thisJoinPoint.getSourceLocation()); + proceed(s); + proceed(s); + } + + void around(Object f): unlock() && args(f) { + System.err.println("around() unlock: advice running at "+thisJoinPoint.getSourceLocation()); + proceed(s); + proceed(s); + } + + public static void main(String[] args) { + Foo aFoo = new Foo(); + aFoo.staticM(); + aFoo.nonstaticM(); + } + + static class Foo { + public void nonstaticM() { + synchronized (this) { + System.err.println("non-static method running"); + } + } + public static void staticM() { + synchronized (String.class) { + System.err.println("static method running"); + } + } + } +}
\ No newline at end of file diff --git a/tests/features152/synchronization/AroundUnlock.java b/tests/features152/synchronization/AroundUnlock.java new file mode 100644 index 000000000..a4a3a91a8 --- /dev/null +++ b/tests/features152/synchronization/AroundUnlock.java @@ -0,0 +1,33 @@ +// around advice and unlock + +public aspect AroundUnlock { + + void around(Foo f): unlock() && args(f) { + System.err.println("around(Foo) lock: advice running at "+thisJoinPoint.getSourceLocation()); + proceed(f); + } + + void around(): unlock() { + System.err.println("around() lock: advice running at "+thisJoinPoint.getSourceLocation()); + proceed(); + } + + public static void main(String[] args) { + Foo aFoo = new Foo(); + aFoo.staticM(); + aFoo.nonstaticM(); + } + + static class Foo { + public void nonstaticM() { + synchronized (this) { + System.err.println("non-static method running"); + } + } + public static void staticM() { + synchronized (String.class) { + System.err.println("static method running"); + } + } + } +}
\ No newline at end of file diff --git a/tests/features152/synchronization/Basic.java b/tests/features152/synchronization/Basic.java new file mode 100644 index 000000000..3af3d523c --- /dev/null +++ b/tests/features152/synchronization/Basic.java @@ -0,0 +1,44 @@ +// Exploring synchronization + +public class Basic { + public static void main(String[] args) { + Basic b = new Basic(); + + b.methodWithSyncBlock1(); + b.staticMethodWithSyncBlock1(); + b.methodWithSyncBlock2(); + b.staticMethodWithSyncBlock2(); + } + + public void methodWithSyncBlock1() { + System.err.println("methodWithSyncBlock1"); + synchronized (this) { + } + } + + public void staticMethodWithSyncBlock1() { + System.err.println("staticMethodWithSyncBlock1"); + synchronized (Basic.class) { + } + } + + public void methodWithSyncBlock2() { + System.err.println("methodWithSyncBlock2"); + synchronized (this) { + int i = 0; + while (i<100) { + i++; + } + } + } + + public void staticMethodWithSyncBlock2() { + System.err.println("staticMethodWithSyncBlock2"); + synchronized (Basic.class) { + int i = 0; + while (i<100) { + i++; + } + } + } +} diff --git a/tests/features152/synchronization/Basic2.java b/tests/features152/synchronization/Basic2.java new file mode 100644 index 000000000..c7fade755 --- /dev/null +++ b/tests/features152/synchronization/Basic2.java @@ -0,0 +1,51 @@ +// Exploring synchronization + +aspect WithinAspect { + before(): within(Basic2) { + if (thisJoinPoint.toString().indexOf("lock(")!=-1) + System.err.println("Advice running at "+thisJoinPoint.getSignature()); + } +} + +public class Basic2 { + public static void main(String[] args) { + Basic2 b = new Basic2(); + + b.methodWithSyncBlock1(); + b.staticMethodWithSyncBlock1(); + b.methodWithSyncBlock2(); + b.staticMethodWithSyncBlock2(); + } + + public void methodWithSyncBlock1() { + System.err.println("methodWithSyncBlock1"); + synchronized (this) { + } + } + + public void staticMethodWithSyncBlock1() { + System.err.println("staticMethodWithSyncBlock1"); + synchronized (Basic2.class) { + } + } + + public void methodWithSyncBlock2() { + System.err.println("methodWithSyncBlock2"); + synchronized (this) { + int i = 0; + while (i<100) { + i++; + } + } + } + + public void staticMethodWithSyncBlock2() { + System.err.println("staticMethodWithSyncBlock2"); + synchronized (Basic2.class) { + int i = 0; + while (i<100) { + i++; + } + } + } +} diff --git a/tests/features152/synchronization/Basic3.java b/tests/features152/synchronization/Basic3.java new file mode 100644 index 000000000..01c196715 --- /dev/null +++ b/tests/features152/synchronization/Basic3.java @@ -0,0 +1,52 @@ +// Exploring synchronization + +aspect WithinAspect { + before(Object o ): within(Basic3) && this(o) { + if (thisJoinPoint.getSignature().toString().indexOf("lock(")!=-1) + System.err.println("Advice running at "+thisJoinPoint.getSignature()+ + " with this of type "+o.getClass()+" with value "+o); + } +} + +public class Basic3 { + public static void main(String[] args) { + Basic3 b = new Basic3(); + + b.methodWithSyncBlock1(); + b.staticMethodWithSyncBlock1(); + b.methodWithSyncBlock2(); + b.staticMethodWithSyncBlock2(); + } + + public void methodWithSyncBlock1() { + System.err.println("methodWithSyncBlock1"); + synchronized (this) { + } + } + + public void staticMethodWithSyncBlock1() { + System.err.println("staticMethodWithSyncBlock1"); + synchronized (Basic3.class) { + } + } + + public void methodWithSyncBlock2() { + System.err.println("methodWithSyncBlock2"); + synchronized (this) { + int i = 0; + while (i<100) { + i++; + } + } + } + + public void staticMethodWithSyncBlock2() { + System.err.println("staticMethodWithSyncBlock2"); + synchronized (Basic3.class) { + int i = 0; + while (i<100) { + i++; + } + } + } +} diff --git a/tests/features152/synchronization/Basic4.java b/tests/features152/synchronization/Basic4.java new file mode 100644 index 000000000..787f550a8 --- /dev/null +++ b/tests/features152/synchronization/Basic4.java @@ -0,0 +1,52 @@ +// Exploring synchronization + +aspect WithinAspect { + before(Object o ): within(Basic4) && args(o) { + if (thisJoinPoint.getSignature().toString().indexOf("lock(")!=-1) + System.err.println("Advice running at "+thisJoinPoint.getSignature()+ + " with args of type "+o.getClass()+" with value "+o); + } +} + +public class Basic4 { + public static void main(String[] args) { + Basic4 b = new Basic4(); + + b.methodWithSyncBlock1(); + b.staticMethodWithSyncBlock1(); + b.methodWithSyncBlock2(); + b.staticMethodWithSyncBlock2(); + } + + public void methodWithSyncBlock1() { + System.err.println("methodWithSyncBlock1"); + synchronized (this) { + } + } + + public void staticMethodWithSyncBlock1() { + System.err.println("staticMethodWithSyncBlock1"); + synchronized (Basic4.class) { + } + } + + public void methodWithSyncBlock2() { + System.err.println("methodWithSyncBlock2"); + synchronized (this) { + int i = 0; + while (i<100) { + i++; + } + } + } + + public void staticMethodWithSyncBlock2() { + System.err.println("staticMethodWithSyncBlock2"); + synchronized (Basic4.class) { + int i = 0; + while (i<100) { + i++; + } + } + } +} diff --git a/tests/features152/synchronization/Basic5.java b/tests/features152/synchronization/Basic5.java new file mode 100644 index 000000000..062b32014 --- /dev/null +++ b/tests/features152/synchronization/Basic5.java @@ -0,0 +1,52 @@ +// Exploring synchronization + +aspect WithinAspect { + before(Object o ): within(Basic5) && target(o) { + if (thisJoinPoint.getSignature().toString().indexOf("lock")!=-1) + System.err.println("Advice running at "+thisJoinPoint.getSignature()+ + " with target of type "+o.getClass()+" with value "+o); + } +} + +public class Basic5 { + public static void main(String[] args) { + Basic5 b = new Basic5(); + + b.methodWithSyncBlock1(); + b.staticMethodWithSyncBlock1(); + b.methodWithSyncBlock2(); + b.staticMethodWithSyncBlock2(); + } + + public void methodWithSyncBlock1() { + System.err.println("methodWithSyncBlock1"); + synchronized (this) { + } + } + + public void staticMethodWithSyncBlock1() { + System.err.println("staticMethodWithSyncBlock1"); + synchronized (Basic5.class) { + } + } + + public void methodWithSyncBlock2() { + System.err.println("methodWithSyncBlock2"); + synchronized (this) { + int i = 0; + while (i<100) { + i++; + } + } + } + + public void staticMethodWithSyncBlock2() { + System.err.println("staticMethodWithSyncBlock2"); + synchronized (Basic5.class) { + int i = 0; + while (i<100) { + i++; + } + } + } +} diff --git a/tests/features152/synchronization/BasicProgram1.java b/tests/features152/synchronization/BasicProgram1.java new file mode 100644 index 000000000..7e1491300 --- /dev/null +++ b/tests/features152/synchronization/BasicProgram1.java @@ -0,0 +1,21 @@ +// Subject to LTW + +public class BasicProgram1 { + + public static void main(String[] args) { + new BasicProgram1().nonstaticM(); + staticM(); + } + + public static void staticM() { + synchronized (String.class) { + System.err.println("static method running"); + } + } + + public void nonstaticM() { + synchronized (this) { + System.err.println("nonstatic method running"); + } + } +}
\ No newline at end of file diff --git a/tests/features152/synchronization/BeforeLock.java b/tests/features152/synchronization/BeforeLock.java new file mode 100644 index 000000000..334137ad1 --- /dev/null +++ b/tests/features152/synchronization/BeforeLock.java @@ -0,0 +1,31 @@ +// before advice and lock + +public aspect BeforeLock { + + before(Foo f): lock() && this(f) { + System.err.println("before(Foo) lock: advice running at "+thisJoinPoint.getSourceLocation()); + } + + before(): lock() { + System.err.println("before() lock: advice running at "+thisJoinPoint.getSourceLocation()); + } + + public static void main(String[] args) { + Foo aFoo = new Foo(); + aFoo.staticM(); + aFoo.nonstaticM(); + } + + static class Foo { + public void nonstaticM() { + synchronized (this) { + System.err.println("non-static method running"); + } + } + public static void staticM() { + synchronized (String.class) { + System.err.println("static method running"); + } + } + } +}
\ No newline at end of file diff --git a/tests/features152/synchronization/BeforeUnlock.java b/tests/features152/synchronization/BeforeUnlock.java new file mode 100644 index 000000000..8ef6401e1 --- /dev/null +++ b/tests/features152/synchronization/BeforeUnlock.java @@ -0,0 +1,31 @@ +// before advice and unlock + +public aspect BeforeUnlock { + + before(Foo f): unlock() && this(f) { + System.err.println("before(Foo) unlock: advice running at "+thisJoinPoint.getSourceLocation()); + } + + before(): unlock() { + System.err.println("before() unlock: advice running at "+thisJoinPoint.getSourceLocation()); + } + + public static void main(String[] args) { + Foo aFoo = new Foo(); + aFoo.staticM(); + aFoo.nonstaticM(); + } + + static class Foo { + public void nonstaticM() { + synchronized (this) { + System.err.println("non-static method running"); + } + } + public static void staticM() { + synchronized (String.class) { + System.err.println("static method running"); + } + } + } +}
\ No newline at end of file diff --git a/tests/features152/synchronization/CombiningPCDs1.java b/tests/features152/synchronization/CombiningPCDs1.java new file mode 100644 index 000000000..153c6134b --- /dev/null +++ b/tests/features152/synchronization/CombiningPCDs1.java @@ -0,0 +1,27 @@ +// lock/this + +public aspect CombiningPCDs1 { + + before(Foo f): lock() && this(f) { + System.err.println("advice running at "+thisJoinPoint.getSourceLocation()); + } + + public static void main(String[] args) { + Foo aFoo = new Foo(); + aFoo.staticM(); + aFoo.nonstaticM(); + } + + static class Foo { + public void nonstaticM() { + synchronized (this) { + System.err.println("non-static method running"); + } + } + public static void staticM() { + synchronized (String.class) { + System.err.println("static method running"); + } + } + } +}
\ No newline at end of file diff --git a/tests/features152/synchronization/CombiningPCDs2.java b/tests/features152/synchronization/CombiningPCDs2.java new file mode 100644 index 000000000..bd0653eed --- /dev/null +++ b/tests/features152/synchronization/CombiningPCDs2.java @@ -0,0 +1,27 @@ +// unlock/this + +public aspect CombiningPCDs2 { + + before(Foo f): unlock() && this(f) { + System.err.println("advice running at "+thisJoinPoint.getSourceLocation()); + } + + public static void main(String[] args) { + Foo aFoo = new Foo(); + aFoo.staticM(); + aFoo.nonstaticM(); + } + + static class Foo { + public void nonstaticM() { + synchronized (this) { + System.err.println("non-static method running"); + } + } + public static void staticM() { + synchronized (String.class) { + System.err.println("static method running"); + } + } + } +}
\ No newline at end of file diff --git a/tests/features152/synchronization/LockAspect1.java b/tests/features152/synchronization/LockAspect1.java new file mode 100644 index 000000000..a1b0bbc08 --- /dev/null +++ b/tests/features152/synchronization/LockAspect1.java @@ -0,0 +1,9 @@ +// to be LTW with BasicProgram1 +import org.aspectj.lang.annotation.*; + +public aspect LockAspect1 { + @SuppressAjWarnings("adviceDidNotMatch") + before(): lock() { + System.err.println("Lock advice running at "+thisJoinPoint.getSourceLocation()); + } +}
\ No newline at end of file diff --git a/tests/features152/synchronization/LockingWithTJP.java b/tests/features152/synchronization/LockingWithTJP.java new file mode 100644 index 000000000..a07b567ce --- /dev/null +++ b/tests/features152/synchronization/LockingWithTJP.java @@ -0,0 +1,28 @@ +// obtaining the object being locked on + +public aspect LockingWithTJP { + + before(): lock() { + System.err.println("before() lock: advice running at "+thisJoinPoint.getSourceLocation()); + System.err.println("Locked on "+thisJoinPoint.getArgs()[0]); + } + + public static void main(String[] args) { + Foo aFoo = new Foo(); + aFoo.nonstaticM(); + aFoo.staticM(); + } + + static class Foo { + public void nonstaticM() { + synchronized (this) { + System.err.println("non-static method running"); + } + } + public static void staticM() { + synchronized (String.class) { + System.err.println("static method running"); + } + } + } +}
\ No newline at end of file diff --git a/tests/features152/synchronization/Parsing1.java b/tests/features152/synchronization/Parsing1.java new file mode 100644 index 000000000..a1ee5fdfd --- /dev/null +++ b/tests/features152/synchronization/Parsing1.java @@ -0,0 +1,14 @@ +// Exploring synchronization + +public aspect Parsing1 { + + before(): lock() { } + + public static void main(String[] args) { + staticM(); + } + + public static void staticM() { +// synchronized (String.class) {} + } +}
\ No newline at end of file diff --git a/tests/features152/synchronization/Parsing2.java b/tests/features152/synchronization/Parsing2.java new file mode 100644 index 000000000..f0d4a1cbb --- /dev/null +++ b/tests/features152/synchronization/Parsing2.java @@ -0,0 +1,14 @@ +// Exploring synchronization + +public aspect Parsing2 { + + before(): unlock() { } + + public static void main(String[] args) { + staticM(); + } + + public static void staticM() { +// synchronized (String.class) {} + } +}
\ No newline at end of file diff --git a/tests/features152/synchronization/ParsingAndMatching1.java b/tests/features152/synchronization/ParsingAndMatching1.java new file mode 100644 index 000000000..9c6ab82aa --- /dev/null +++ b/tests/features152/synchronization/ParsingAndMatching1.java @@ -0,0 +1,18 @@ +// lock and static context + +public aspect ParsingAndMatching1 { + + before(): lock() { + System.err.println("Advice running at "+thisJoinPoint.getSourceLocation()); + } + + public static void main(String[] args) { + staticM(); + } + + public static void staticM() { + synchronized (String.class) { + System.err.println("static method running"); + } + } +}
\ No newline at end of file diff --git a/tests/features152/synchronization/ParsingAndMatching2.java b/tests/features152/synchronization/ParsingAndMatching2.java new file mode 100644 index 000000000..87599cb07 --- /dev/null +++ b/tests/features152/synchronization/ParsingAndMatching2.java @@ -0,0 +1,18 @@ +// unlock and static context + +public aspect ParsingAndMatching2 { + + before(): unlock() { + System.err.println("Advice running at "+thisJoinPoint.getSourceLocation()); + } + + public static void main(String[] args) { + staticM(); + } + + public static void staticM() { + synchronized (String.class) { + System.err.println("static method running"); + } + } +}
\ No newline at end of file diff --git a/tests/features152/synchronization/ParsingAndMatching3.java b/tests/features152/synchronization/ParsingAndMatching3.java new file mode 100644 index 000000000..7a6fee6c2 --- /dev/null +++ b/tests/features152/synchronization/ParsingAndMatching3.java @@ -0,0 +1,20 @@ +// lock and non-static context + +public aspect ParsingAndMatching3 { + + before(): lock() { + System.err.println("Advice running at "+thisJoinPoint.getSourceLocation()); + } + + public static void main(String[] args) { + new Foo().nonstaticM(); + } + + static class Foo { + public void nonstaticM() { + synchronized (String.class) { + System.err.println("non-static method running"); + } + } + } +}
\ No newline at end of file diff --git a/tests/features152/synchronization/ParsingAndMatching4.java b/tests/features152/synchronization/ParsingAndMatching4.java new file mode 100644 index 000000000..4fe3c6f5d --- /dev/null +++ b/tests/features152/synchronization/ParsingAndMatching4.java @@ -0,0 +1,20 @@ +// unlock and non-static context + +public aspect ParsingAndMatching4 { + + before(): unlock() { + System.err.println("Advice running at "+thisJoinPoint.getSourceLocation()); + } + + public static void main(String[] args) { + new Foo().nonstaticM(); + } + + static class Foo { + public void nonstaticM() { + synchronized (String.class) { + System.err.println("non-static method running"); + } + } + } +}
\ No newline at end of file diff --git a/tests/features152/synchronization/ThisJoinPointLock.java b/tests/features152/synchronization/ThisJoinPointLock.java new file mode 100644 index 000000000..ed5376a79 --- /dev/null +++ b/tests/features152/synchronization/ThisJoinPointLock.java @@ -0,0 +1,48 @@ +import org.aspectj.lang.reflect.*; + +aspect TJPAspect { + before(): withincode(void ThisJoinPointLock.nonStaticMethod()) { + if (thisJoinPoint.getSignature() instanceof LockSignature) { + System.err.println("match.toString(): "+thisJoinPoint.toString()); + System.err.println("match.toShortString(): "+thisJoinPoint.toShortString()); + System.err.println("match.toLongString(): "+thisJoinPoint.toLongString()); + } + + // SHORT => shorttypenames, no args, no throws, no modifiers, short type names + // MIDDLE=> args included + // LONG => modifiers included + } + +// before(): withincode(void ThisJoinPointLock.nonStaticMethod()) { +// if (thisJoinPoint.getSignature() instanceof MethodSignature) { +// System.err.println("match.toString(): "+thisJoinPoint.toString()); +// System.err.println("match.toShortString(): "+thisJoinPoint.toShortString()); +// System.err.println("match.toLongString(): "+thisJoinPoint.toLongString()); +// } +// +// // SHORT => shorttypenames, no args, no throws, no modifiers, short type names +// // MIDDLE=> args included +// // LONG => modifiers included +// } + +} + +public class ThisJoinPointLock { + public static void main(String[] args) { + ThisJoinPointLock b = new ThisJoinPointLock(); + b.nonStaticMethod(); + b.staticMethod(); + } + + public void nonStaticMethod() { + synchronized (this) { + staticMethod(); + } + } + + public void staticMethod() { + synchronized (ThisJoinPointLock.class) { + } + } + +} diff --git a/tests/features152/synchronization/ThisJoinPointUnlock.java b/tests/features152/synchronization/ThisJoinPointUnlock.java new file mode 100644 index 000000000..46bee3da5 --- /dev/null +++ b/tests/features152/synchronization/ThisJoinPointUnlock.java @@ -0,0 +1,48 @@ +import org.aspectj.lang.reflect.*; + +aspect TJPAspect { + before(): withincode(void ThisJoinPointUnlock.nonStaticMethod()) { + if (thisJoinPoint.getSignature() instanceof UnlockSignature) { + System.err.println("match.toString(): "+thisJoinPoint.toString()); + System.err.println("match.toShortString(): "+thisJoinPoint.toShortString()); + System.err.println("match.toLongString(): "+thisJoinPoint.toLongString()); + } + + // SHORT => shorttypenames, no args, no throws, no modifiers, short type names + // MIDDLE=> args included + // LONG => modifiers included + } + +// before(): withincode(void ThisJoinPointLock.nonStaticMethod()) { +// if (thisJoinPoint.getSignature() instanceof MethodSignature) { +// System.err.println("match.toString(): "+thisJoinPoint.toString()); +// System.err.println("match.toShortString(): "+thisJoinPoint.toShortString()); +// System.err.println("match.toLongString(): "+thisJoinPoint.toLongString()); +// } +// +// // SHORT => shorttypenames, no args, no throws, no modifiers, short type names +// // MIDDLE=> args included +// // LONG => modifiers included +// } + +} + +public class ThisJoinPointUnlock { + public static void main(String[] args) { + ThisJoinPointUnlock b = new ThisJoinPointUnlock(); + b.nonStaticMethod(); + b.staticMethod(); + } + + public void nonStaticMethod() { + synchronized (this) { + staticMethod(); + } + } + + public void staticMethod() { + synchronized (ThisJoinPointUnlock.class) { + } + } + +} diff --git a/tests/features152/synchronization/UnlockAspect1.java b/tests/features152/synchronization/UnlockAspect1.java new file mode 100644 index 000000000..b91e0a1e2 --- /dev/null +++ b/tests/features152/synchronization/UnlockAspect1.java @@ -0,0 +1,9 @@ +// to be LTW with BasicProgram1 +import org.aspectj.lang.annotation.*; + +public aspect UnlockAspect1 { + @SuppressAjWarnings("adviceDidNotMatch") + before(): unlock() { + System.err.println("Unlock advice running at "+thisJoinPoint.getSourceLocation()); + } +}
\ No newline at end of file diff --git a/tests/features152/synchronization/Useful1.java b/tests/features152/synchronization/Useful1.java new file mode 100644 index 000000000..d8ecbe3a0 --- /dev/null +++ b/tests/features152/synchronization/Useful1.java @@ -0,0 +1,51 @@ +// Exploring synchronization + +aspect WithinAspect { + long locktimer = 0; + int iterations = 0; + Object currentObject = null; + boolean didSomething = false; + long activeTimer; + + before(Object o ): within(Useful1) && args(o) { + if (thisJoinPoint.getSignature().toString().startsWith("lock(")) { + activeTimer = System.currentTimeMillis(); + didSomething = true; + } + } + + after(Object o ): within(Useful1) && args(o) { + if (thisJoinPoint.getSignature().toString().startsWith("unlock(")) { + if (activeTimer!=0) { + locktimer+=(System.currentTimeMillis()-activeTimer); + iterations++; + activeTimer=0; + didSomething = true; + } + } + } + + after() returning: execution(* main(..)) { + System.err.println("Average lock taking time over "+iterations+" iterations is "+ + (((double)locktimer)/ + ((double)iterations))+"ms"); + if (didSomething) System.err.println("We did time something!"); // can write a test looking for this line, it won't vary + } +} + +public class Useful1 { + public static void main(String[] args) { + Useful1 u = new Useful1(); + + for (int i = 0; i < 2000; i++) { + u.methodWithSynchronizedBlock(); + } + } + + public void methodWithSynchronizedBlock() { + synchronized (this) { + for (int ii=0;ii<100;ii++); + } + } + +} diff --git a/tests/features152/synchronization/Useful2.java b/tests/features152/synchronization/Useful2.java new file mode 100644 index 000000000..46fc82d5a --- /dev/null +++ b/tests/features152/synchronization/Useful2.java @@ -0,0 +1,47 @@ +// Exploring synchronization + +aspect LockMonitor { + long locktimer = 0; + int iterations = 0; + Object currentObject = null; + long activeTimer; + + before(Useful2 o ): lock() && args(o) { + activeTimer = System.currentTimeMillis(); + currentObject = o; + } + + after(Useful2 o ): unlock() && args(o) { + if (o!=currentObject) { + throw new RuntimeException("Unlocking on incorrect thing?!?"); + } + if (activeTimer!=0) { + locktimer+=(System.currentTimeMillis()-activeTimer); + iterations++; + activeTimer=0; + } + } + + after() returning: execution(* main(..)) { + System.err.println("Average time spent with lock over "+iterations+" iterations is "+ + (((double)locktimer)/ + ((double)iterations))+"ms"); + } +} + +public class Useful2 { + public static void main(String[] args) { + Useful2 u = new Useful2(); + + for (int i = 0; i < 20; i++) { + u.methodWithSynchronizedBlock(); + } + } + + public void methodWithSynchronizedBlock() { + synchronized (this) { + for (int ii=0;ii<1000000;ii++); + } + } + +} diff --git a/tests/features152/synchronization/aop1.xml b/tests/features152/synchronization/aop1.xml new file mode 100644 index 000000000..c4c26ddaa --- /dev/null +++ b/tests/features152/synchronization/aop1.xml @@ -0,0 +1,8 @@ +<aspectj> + <aspects> + <aspect name="LockAspect1"/> + </aspects> + + <weaver options="-showWeaveInfo "> + </weaver> +</aspectj>
\ No newline at end of file diff --git a/tests/features152/synchronization/aop2.xml b/tests/features152/synchronization/aop2.xml new file mode 100644 index 000000000..1488e6e22 --- /dev/null +++ b/tests/features152/synchronization/aop2.xml @@ -0,0 +1,8 @@ +<aspectj> + <aspects> + <aspect name="UnlockAspect1"/> + </aspects> + + <weaver options="-showWeaveInfo"> + </weaver> +</aspectj>
\ No newline at end of file diff --git a/tests/features152/synchronization/aop3.xml b/tests/features152/synchronization/aop3.xml new file mode 100644 index 000000000..e07f8feae --- /dev/null +++ b/tests/features152/synchronization/aop3.xml @@ -0,0 +1,8 @@ +<aspectj> + <aspects> + <aspect name="LockAspect1"/> + </aspects> + + <weaver options=" -showWeaveInfo -Xjoinpoints:synchronization,trivial"> + </weaver> +</aspectj>
\ No newline at end of file diff --git a/tests/features152/synchronization/aop4.xml b/tests/features152/synchronization/aop4.xml new file mode 100644 index 000000000..892a16a0d --- /dev/null +++ b/tests/features152/synchronization/aop4.xml @@ -0,0 +1,8 @@ +<aspectj> + <aspects> + <aspect name="UnlockAspect1"/> + </aspects> + + <weaver options=" -showWeaveInfo -Xjoinpoints:synchronization"> + </weaver> +</aspectj>
\ No newline at end of file diff --git a/tests/features152/synchronization/transformed/Eight.java b/tests/features152/synchronization/transformed/Eight.java new file mode 100644 index 000000000..79af0a625 --- /dev/null +++ b/tests/features152/synchronization/transformed/Eight.java @@ -0,0 +1,22 @@ +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +// matching unlock in a transformed non-static method... + +public aspect Eight { + public static void main(String[] args) { + new C().b(); + } + + before(): !within(Eight) && unlock() { + System.err.println("Unlocking occurring at "+thisJoinPoint); + System.err.println(thisJoinPoint.getSourceLocation().getFileName()); + } +} + +class C { + public synchronized void b() { + System.err.println("hello"); + } +} diff --git a/tests/features152/synchronization/transformed/Eleven.java b/tests/features152/synchronization/transformed/Eleven.java new file mode 100644 index 000000000..e9a3fa85a --- /dev/null +++ b/tests/features152/synchronization/transformed/Eleven.java @@ -0,0 +1,22 @@ +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +// matching lock on transformed static method ( pre J5) + +public aspect Eleven { + public static void main(String[] args) { + C.b(); + } + + before(): !within(Eleven) && lock() { + System.err.println("Locking occurring at "+thisJoinPoint); + System.err.println(thisJoinPoint.getSourceLocation().getFileName()); + } +} + +class C { + public static synchronized void b() { + System.err.println("hello"); + } +} diff --git a/tests/features152/synchronization/transformed/Five.java b/tests/features152/synchronization/transformed/Five.java new file mode 100644 index 000000000..e5e30c6f5 --- /dev/null +++ b/tests/features152/synchronization/transformed/Five.java @@ -0,0 +1,38 @@ +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +public aspect Five { + public static void main(String[] args) { + C.b(); + C.c(); + C.d(); + C.e(); + } + + before(): !within(Five) && call(* println(..)) { System.err.println("test");} +} + +class C { + public static synchronized void b() { + System.err.println("hello"); + } + + public static void c() { + synchronized (C.class) { + System.err.println("hello"); + } + } + public static void d() { + synchronized (String.class) { + System.err.println("hello"); + } + } + public static void e() { + synchronized (Five.class) { + System.err.println("hello"); + } + } +} + +aspect FiveX { pointcut p(): unlock(); } diff --git a/tests/features152/synchronization/transformed/Four.java b/tests/features152/synchronization/transformed/Four.java new file mode 100644 index 000000000..454fdb1f1 --- /dev/null +++ b/tests/features152/synchronization/transformed/Four.java @@ -0,0 +1,29 @@ +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +public aspect Four { + public static void main(String[] args) { + new C().m(); + try {new C().m2(); } catch (MyException me) {int i=1;} + } + after() returning: execution(synchronized * m(..)) { System.err.println("execution advice running1");} + after() throwing: execution(synchronized * m2(..)) { System.err.println("execution advice running2");} +} + +class C { + + public synchronized void m() { + System.err.println("hello"); + } + + public synchronized void m2() { + System.err.println("hello"); + throw new MyException(); + } + +} + +class MyException extends RuntimeException { } + +aspect FourX { pointcut p(): lock(); } diff --git a/tests/features152/synchronization/transformed/Investigation.java b/tests/features152/synchronization/transformed/Investigation.java new file mode 100644 index 000000000..1fad31a6f --- /dev/null +++ b/tests/features152/synchronization/transformed/Investigation.java @@ -0,0 +1,357 @@ +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +public class Investigation { + public static void main(String[] args) { + + } + + + // Basic synchronized method + public void a() { + synchronized (this) { + + } + } + + // ... that does something ... + public void b() { + synchronized (this) { + System.out.println("hello"); + } + } + + // ... that includes try/catch ... + public void c() { + synchronized(this) { + try { + File f = new File("fred"); + FileInputStream fis = new FileInputStream(f); + } catch (IOException ioe) { + System.out.println("bang"); + } + } + } + + // ... with multiple synchronized blocks ... + public void d() { + synchronized (this) { + System.out.println("hello"); + } + synchronized (this) { + System.out.println("world"); + } + } + + // ... with nested synchronized blocks ... + public void e() { + synchronized (this) { + System.out.println("hello"); + synchronized (new String()) { + System.out.println("other"); + } + } + } + + /* + Compiled from "Investigation.java" + public class Investigation extends java.lang.Object + SourceFile: "Investigation.java" + minor version: 0 + major version: 46 + Constant pool: + const #1 = Asciz Investigation; + const #2 = class #1; // Investigation + const #3 = Asciz java/lang/Object; + const #4 = class #3; // java/lang/Object + const #5 = Asciz <init>; + const #6 = Asciz ()V; + const #7 = Asciz Code; + const #8 = NameAndType #5:#6;// "<init>":()V + const #9 = Method #4.#8; // java/lang/Object."<init>":()V + const #10 = Asciz LineNumberTable; + const #11 = Asciz LocalVariableTable; + const #12 = Asciz this; + const #13 = Asciz LInvestigation;; + const #14 = Asciz main; + const #15 = Asciz ([Ljava/lang/String;)V; + const #16 = Asciz org.aspectj.weaver.MethodDeclarationLineNumber; + const #17 = Asciz args; + const #18 = Asciz [Ljava/lang/String;; + const #19 = Asciz a; + const #20 = Asciz b; + const #21 = Asciz java/lang/System; + const #22 = class #21; // java/lang/System + const #23 = Asciz out; + const #24 = Asciz Ljava/io/PrintStream;; + const #25 = NameAndType #23:#24;// out:Ljava/io/PrintStream; + const #26 = Field #22.#25; // java/lang/System.out:Ljava/io/PrintStream; + const #27 = Asciz hello; + const #28 = String #27; // hello + const #29 = Asciz java/io/PrintStream; + const #30 = class #29; // java/io/PrintStream + const #31 = Asciz println; + const #32 = Asciz (Ljava/lang/String;)V; + const #33 = NameAndType #31:#32;// println:(Ljava/lang/String;)V + const #34 = Method #30.#33; // java/io/PrintStream.println:(Ljava/lang/String;)V + const #35 = Asciz c; + const #36 = Asciz java/io/File; + const #37 = class #36; // java/io/File + const #38 = Asciz fred; + const #39 = String #38; // fred + const #40 = NameAndType #5:#32;// "<init>":(Ljava/lang/String;)V + const #41 = Method #37.#40; // java/io/File."<init>":(Ljava/lang/String;)V + const #42 = Asciz java/io/FileInputStream; + const #43 = class #42; // java/io/FileInputStream + const #44 = Asciz (Ljava/io/File;)V; + const #45 = NameAndType #5:#44;// "<init>":(Ljava/io/File;)V + const #46 = Method #43.#45; // java/io/FileInputStream."<init>":(Ljava/io/File;)V + const #47 = Asciz bang; + const #48 = String #47; // bang + const #49 = Asciz java/io/IOException; + const #50 = class #49; // java/io/IOException + const #51 = Asciz f; + const #52 = Asciz Ljava/io/File;; + const #53 = Asciz d; + const #54 = Asciz world; + const #55 = String #54; // world + const #56 = Asciz e; + const #57 = Asciz java/lang/String; + const #58 = class #57; // java/lang/String + const #59 = Method #58.#8; // java/lang/String."<init>":()V + const #60 = Asciz other; + const #61 = String #60; // other + const #62 = Asciz SourceFile; + const #63 = Asciz Investigation.java; + + { + public Investigation(); + Code: + Stack=1, Locals=1, Args_size=1 + 0: aload_0 + 1: invokespecial #9; //Method java/lang/Object."<init>":()V + 4: return + LineNumberTable: + line 5: 0 + LocalVariableTable: + Start Length Slot Name Signature + 0 5 0 this LInvestigation; + + public static void main(java.lang.String[]); + org.aspectj.weaver.MethodDeclarationLineNumber: length = 0x8 + 00 00 00 06 00 00 00 FFFFFF88 + Code: + Stack=0, Locals=1, Args_size=1 + 0: return + LineNumberTable: + line 8: 0 + LocalVariableTable: + Start Length Slot Name Signature + 0 1 0 args [Ljava/lang/String; + + public void a(); + org.aspectj.weaver.MethodDeclarationLineNumber: length = 0x8 + 00 00 00 0C 00 00 00 FFFFFFD9 + Code: + Stack=2, Locals=1, Args_size=1 + 0: aload_0 + 1: dup + 2: monitorenter + 3: monitorexit + 4: return + LineNumberTable: + line 13: 0 + line 16: 4 + LocalVariableTable: + Start Length Slot Name Signature + 0 5 0 this LInvestigation; + + public void b(); + org.aspectj.weaver.MethodDeclarationLineNumber: length = 0x8 + 00 00 00 13 00 00 01 38 + Code: + Stack=2, Locals=2, Args_size=1 + 0: aload_0 + 1: dup + 2: astore_1 + 3: monitorenter + 4: getstatic #26; //Field java/lang/System.out:Ljava/io/PrintStream; + 7: ldc #28; //String hello + 9: invokevirtual #34; //Method java/io/PrintStream.println:(Ljava/lang/String;)V + 12: aload_1 + 13: monitorexit + 14: goto 20 + 17: aload_1 + 18: monitorexit + 19: athrow + 20: return + Exception table: + from to target type + 4 14 17 any + 17 19 17 any + LineNumberTable: + line 20: 0 + line 21: 4 + line 20: 12 + line 23: 20 + LocalVariableTable: + Start Length Slot Name Signature + 0 21 0 this LInvestigation; + + public void c(); + org.aspectj.weaver.MethodDeclarationLineNumber: length = 0x8 + 00 00 00 1A 00 00 01 FFFFFFB7 + Code: + Stack=3, Locals=3, Args_size=1 + 0: aload_0 + 1: dup + 2: astore_1 + 3: monitorenter + 4: new #37; //class java/io/File + 7: dup + 8: ldc #39; //String fred + 10: invokespecial #41; //Method java/io/File."<init>":(Ljava/lang/String;)V + 13: astore_2 + 14: new #43; //class java/io/FileInputStream + 17: dup + 18: aload_2 + 19: invokespecial #46; //Method java/io/FileInputStream."<init>":(Ljava/io/File;)V + 22: pop + 23: goto 35 + 26: pop + 27: getstatic #26; //Field java/lang/System.out:Ljava/io/PrintStream; + 30: ldc #48; //String bang + 32: invokevirtual #34; //Method java/io/PrintStream.println:(Ljava/lang/String;)V + 35: aload_1 + 36: monitorexit + 37: goto 43 + 40: aload_1 + 41: monitorexit + 42: athrow + 43: return + Exception table: + from to target type + 4 26 26 Class java/io/IOException + + 4 37 40 any + 40 42 40 any + LineNumberTable: + line 27: 0 + line 29: 4 + line 30: 14 + line 31: 26 + line 32: 27 + line 27: 35 + line 35: 43 + LocalVariableTable: + Start Length Slot Name Signature + 0 44 0 this LInvestigation; + 14 12 2 f Ljava/io/File; + + public void d(); + org.aspectj.weaver.MethodDeclarationLineNumber: length = 0x8 + 00 00 00 26 00 00 02 FFFFFFC2 + Code: + Stack=2, Locals=2, Args_size=1 + 0: aload_0 + 1: dup + 2: astore_1 + 3: monitorenter + 4: getstatic #26; //Field java/lang/System.out:Ljava/io/PrintStream; + 7: ldc #28; //String hello + 9: invokevirtual #34; //Method java/io/PrintStream.println:(Ljava/lang/String;)V + 12: aload_1 + 13: monitorexit + 14: goto 20 + 17: aload_1 + 18: monitorexit + 19: athrow + 20: aload_0 + 21: dup + 22: astore_1 + 23: monitorenter + 24: getstatic #26; //Field java/lang/System.out:Ljava/io/PrintStream; + 27: ldc #55; //String world + 29: invokevirtual #34; //Method java/io/PrintStream.println:(Ljava/lang/String;)V + 32: aload_1 + 33: monitorexit + 34: goto 40 + 37: aload_1 + 38: monitorexit + 39: athrow + 40: return + Exception table: + from to target type + 4 14 17 any + 17 19 17 any + 24 34 37 any + 37 39 37 any + LineNumberTable: + line 39: 0 + line 40: 4 + line 39: 12 + line 42: 20 + line 43: 24 + line 42: 32 + line 45: 40 + LocalVariableTable: + Start Length Slot Name Signature + 0 41 0 this LInvestigation; + + public void e(); + org.aspectj.weaver.MethodDeclarationLineNumber: length = 0x8 + 00 00 00 30 00 00 03 FFFFFF88 + Code: + Stack=2, Locals=3, Args_size=1 + 0: aload_0 + 1: dup + 2: astore_1 + 3: monitorenter + 4: getstatic #26; //Field java/lang/System.out:Ljava/io/PrintStream; + 7: ldc #28; //String hello + 9: invokevirtual #34; //Method java/io/PrintStream.println:(Ljava/lang/String;)V + 12: new #58; //class java/lang/String + 15: dup + 16: invokespecial #59; //Method java/lang/String."<init>":()V + 19: dup + 20: astore_2 + 21: monitorenter + 22: getstatic #26; //Field java/lang/System.out:Ljava/io/PrintStream; + 25: ldc #61; //String other + 27: invokevirtual #34; //Method java/io/PrintStream.println:(Ljava/lang/String;)V + 30: aload_2 + 31: monitorexit + 32: goto 38 + 35: aload_2 + 36: monitorexit + 37: athrow + 38: aload_1 + 39: monitorexit + 40: goto 46 + 43: aload_1 + 44: monitorexit + 45: athrow + 46: return + Exception table: + from to target type + 22 32 35 any + 35 37 35 any + 4 40 43 any + 43 45 43 any + LineNumberTable: + line 49: 0 + line 50: 4 + line 51: 12 + line 52: 22 + line 51: 30 + line 49: 38 + line 55: 46 + LocalVariableTable: + Start Length Slot Name Signature + 0 47 0 this LInvestigation; + + } +*/ + +}
\ No newline at end of file diff --git a/tests/features152/synchronization/transformed/Nine.java b/tests/features152/synchronization/transformed/Nine.java new file mode 100644 index 000000000..8bd5fdf64 --- /dev/null +++ b/tests/features152/synchronization/transformed/Nine.java @@ -0,0 +1,22 @@ +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +// matching lock on transformed static method (J5) + +public aspect Nine { + public static void main(String[] args) { + C.b(); + } + + before(): !within(Nine) && lock() { + System.err.println("Locking occurring at "+thisJoinPoint); + System.err.println(thisJoinPoint.getSourceLocation().getFileName()); + } +} + +class C { + public static synchronized void b() { + System.err.println("hello"); + } +} diff --git a/tests/features152/synchronization/transformed/One.java b/tests/features152/synchronization/transformed/One.java new file mode 100644 index 000000000..49a80c9d7 --- /dev/null +++ b/tests/features152/synchronization/transformed/One.java @@ -0,0 +1,39 @@ +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +public aspect One { + public static void main(String[] args) { + + } + + before(): call(* println(..)) {} + + // ... that does something ... + public synchronized void b() { + System.out.println("hello"); + } + + // ... that includes try/catch ... + public synchronized void c() { + try { + File f = new File("fred"); + FileInputStream fis = new FileInputStream(f); + } catch (IOException ioe) { + System.out.println("bang"); + } + } + + // ... with nested synchronized blocks ... + public synchronized void e() { + System.out.println("hello"); + synchronized (new String()) { + System.out.println("other"); + } + } + +} + +aspect OneX { + pointcut p(): lock(); +} diff --git a/tests/features152/synchronization/transformed/OtherTargeters.java b/tests/features152/synchronization/transformed/OtherTargeters.java new file mode 100644 index 000000000..e88a95f74 --- /dev/null +++ b/tests/features152/synchronization/transformed/OtherTargeters.java @@ -0,0 +1,25 @@ +public class OtherTargeters { + public static void main(String[] args) { + new OtherTargeters().foo(); + } + + // This method will have branch instructions that target a return which must be + // adjusted to target the monitor exit block + public synchronized void foo() { + int i = 35; + if (i==35) { + System.err.println("foo() running"); + } + } + + public void goo() { + int i = 35; + if (i==35) { + System.err.println("goo() running"); + } + } +} + +aspect X { + before(): execution(* foo(..)) {System.err.println("advice running");} +}
\ No newline at end of file diff --git a/tests/features152/synchronization/transformed/Seven.java b/tests/features152/synchronization/transformed/Seven.java new file mode 100644 index 000000000..6e786be63 --- /dev/null +++ b/tests/features152/synchronization/transformed/Seven.java @@ -0,0 +1,22 @@ +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +// matching lock in a transformed non-static method... + +public aspect Seven { + public static void main(String[] args) { + new C().b(); + } + + before(): !within(Seven) && lock() { + System.err.println("Locking occurring at "+thisJoinPoint); + System.err.println(thisJoinPoint.getSourceLocation().getFileName()); + } +} + +class C { + public synchronized void b() { + System.err.println("hello"); + } +} diff --git a/tests/features152/synchronization/transformed/Six.java b/tests/features152/synchronization/transformed/Six.java new file mode 100644 index 000000000..71c800a4b --- /dev/null +++ b/tests/features152/synchronization/transformed/Six.java @@ -0,0 +1,26 @@ +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +public aspect Six { + public static void main(String[] args) { + C.bbb(); + C.c(); + } + + before(): !within(Six) && call(* println(..)) { System.err.println("test");} +} + +class C { + public static synchronized void bbb() { + System.err.println("hello"); + } + + public static void c() { + synchronized (C.class) { + System.err.println("hello"); + } + } +} + +aspect SixX { pointcut p(): unlock(); } diff --git a/tests/features152/synchronization/transformed/Ten.java b/tests/features152/synchronization/transformed/Ten.java new file mode 100644 index 000000000..9a7b54105 --- /dev/null +++ b/tests/features152/synchronization/transformed/Ten.java @@ -0,0 +1,22 @@ +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +// matching unlock on transformed static method (J5) + +public aspect Ten { + public static void main(String[] args) { + C.b(); + } + + before(): !within(Ten) && unlock() { + System.err.println("Unlocking occurring at "+thisJoinPoint); + System.err.println(thisJoinPoint.getSourceLocation().getFileName()); + } +} + +class C { + public static synchronized void b() { + System.err.println("hello"); + } +} diff --git a/tests/features152/synchronization/transformed/Thirteen.java b/tests/features152/synchronization/transformed/Thirteen.java new file mode 100644 index 000000000..82c71d0c6 --- /dev/null +++ b/tests/features152/synchronization/transformed/Thirteen.java @@ -0,0 +1,6 @@ +interface I { + + synchronized void foo(); +} +public class Thirteen { +} diff --git a/tests/features152/synchronization/transformed/Three.java b/tests/features152/synchronization/transformed/Three.java new file mode 100644 index 000000000..6a99c2e11 --- /dev/null +++ b/tests/features152/synchronization/transformed/Three.java @@ -0,0 +1,44 @@ +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +public aspect Three { + public static void main(String[] args) { + new C().m3(); + try {new C().m32(); } catch (MyException me) {int i=1;} + new C().m33(); + try {new C().m34(); } catch (MyException me) {int i=1;} + } + after() returning: execution(* m3(..)) { System.err.println("execution advice running1");} + after() throwing: execution(* m32(..)) { System.err.println("execution advice running2");} + after() returning: execution(* m33(..)) { System.err.println("execution advice running3");} + after() throwing: execution(* m34(..)) { System.err.println("execution advice running4");} +} + +class C { + + public synchronized void m3() { + System.err.println("hello"); + } + + public synchronized void m32() { + System.err.println("hello"); + throw new MyException(); + } + + public void m33() { + synchronized (this) { + System.err.println("hello"); + } + } + + public void m34() { + synchronized (this) { + System.err.println("hello"); + throw new MyException(); + } + } +} + class MyException extends RuntimeException { } + +class ThreeX { pointcut p(): lock(); } diff --git a/tests/features152/synchronization/transformed/Twelve.java b/tests/features152/synchronization/transformed/Twelve.java new file mode 100644 index 000000000..f0016b5ef --- /dev/null +++ b/tests/features152/synchronization/transformed/Twelve.java @@ -0,0 +1,22 @@ +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +// matching unlock on transformed static method ( pre J5) + +public aspect Twelve { + public static void main(String[] args) { + C.b(); + } + + before(): !within(Twelve) && unlock() { + System.err.println("Unlocking occurring at "+thisJoinPoint); + System.err.println(thisJoinPoint.getSourceLocation().getFileName()); + } +} + +class C { + public static synchronized void b() { + System.err.println("hello"); + } +} diff --git a/tests/features152/synchronization/transformed/Two.java b/tests/features152/synchronization/transformed/Two.java new file mode 100644 index 000000000..129222cd3 --- /dev/null +++ b/tests/features152/synchronization/transformed/Two.java @@ -0,0 +1,19 @@ +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +public aspect Two { + public static void main(String[] args) { + new C().ma(); + } + before(): execution(* ma(..)) { System.err.println("execution advice running");} +} + +class C { + + public synchronized void ma() { + System.err.println("hello"); + } +} + +aspect TwoX { pointcut p(): lock(); } diff --git a/tests/features152/synchronization/transformed/expected/C.b.txt b/tests/features152/synchronization/transformed/expected/C.b.txt new file mode 100644 index 000000000..15f85674d --- /dev/null +++ b/tests/features152/synchronization/transformed/expected/C.b.txt @@ -0,0 +1,22 @@ + public static void b() org.aspectj.weaver.MethodDeclarationLineNumber: 17:340 +: + LDC C + DUP + ASTORE_0 + MONITORENTER + finally -> E1 + | GETSTATIC java.lang.System.err Ljava/io/PrintStream; (line 18) + | LDC "hello" + | INVOKESTATIC Five.aspectOf ()LFive; + | INVOKEVIRTUAL Five.ajc$before$Five$1$af123de3 ()V + | INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/String;)V + | ALOAD_0 + | MONITOREXIT + | RETURN (line 19) + finally -> E1 + finally -> E1 + | E1: ALOAD_0 + | MONITOREXIT + finally -> E1 + ATHROW + end public static void b() diff --git a/tests/features152/synchronization/transformed/expected/C.bbb.txt b/tests/features152/synchronization/transformed/expected/C.bbb.txt new file mode 100644 index 000000000..b9f54d8eb --- /dev/null +++ b/tests/features152/synchronization/transformed/expected/C.bbb.txt @@ -0,0 +1,38 @@ + public static void bbb() org.aspectj.weaver.MethodDeclarationLineNumber: 15:316 +: + GETSTATIC C.class$1 Ljava/lang/Class; + DUP + IFNONNULL L0 + POP + catch java.lang.ClassNotFoundException -> E0 + | LDC "C" + | INVOKESTATIC java.lang.Class.forName (Ljava/lang/String;)Ljava/lang/Class; + catch java.lang.ClassNotFoundException -> E0 + DUP + PUTSTATIC C.class$1 Ljava/lang/Class; + GOTO L0 + E0: NEW java.lang.NoClassDefFoundError + DUP_X1 + SWAP + INVOKEVIRTUAL java.lang.Throwable.getMessage ()Ljava/lang/String; + INVOKESPECIAL java.lang.NoClassDefFoundError.<init> (Ljava/lang/String;)V + ATHROW + L0: DUP + ASTORE_0 + MONITORENTER + finally -> E2 + | GETSTATIC java.lang.System.err Ljava/io/PrintStream; (line 16) + | LDC "hello" + | INVOKESTATIC Six.aspectOf ()LSix; + | INVOKEVIRTUAL Six.ajc$before$Six$1$cb48297b ()V + | INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/String;)V + | ALOAD_0 + | MONITOREXIT + | RETURN (line 17) + finally -> E2 + finally -> E2 + | E2: ALOAD_0 + | MONITOREXIT + finally -> E2 + ATHROW + end public static void bbb() diff --git a/tests/features152/synchronization/transformed/expected/C.m.txt b/tests/features152/synchronization/transformed/expected/C.m.txt new file mode 100644 index 000000000..7f5a34cdc --- /dev/null +++ b/tests/features152/synchronization/transformed/expected/C.m.txt @@ -0,0 +1,23 @@ + public void m() org.aspectj.weaver.MethodDeclarationLineNumber: 16:496 +: + ALOAD_0 + DUP + ASTORE_1 + MONITORENTER + finally -> E1 + | GETSTATIC java.lang.System.err Ljava/io/PrintStream; (line 17) + | LDC "hello" + | INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/String;)V + | ALOAD_1 + | MONITOREXIT + | GOTO L0 (line 18) + finally -> E1 + finally -> E1 + | E1: ALOAD_1 + | MONITOREXIT + finally -> E1 + ATHROW + L0: INVOKESTATIC Four.aspectOf ()LFour; + INVOKEVIRTUAL Four.ajc$afterReturning$Four$1$c2776aed ()V + RETURN + end public void m() diff --git a/tests/features152/synchronization/transformed/expected/C.m2.txt b/tests/features152/synchronization/transformed/expected/C.m2.txt new file mode 100644 index 000000000..ab4a19919 --- /dev/null +++ b/tests/features152/synchronization/transformed/expected/C.m2.txt @@ -0,0 +1,28 @@ + public void m2() org.aspectj.weaver.MethodDeclarationLineNumber: 20:571 +: + catch java.lang.Throwable -> E2 + | ALOAD_0 + | DUP + | ASTORE_1 + | MONITORENTER + | finally -> E1 + | | GETSTATIC java.lang.System.err Ljava/io/PrintStream; (line 21) + | | LDC "hello" + | | INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/String;)V + | | NEW MyException (line 22) + | | DUP + | | INVOKESPECIAL MyException.<init> ()V + | | ATHROW + | finally -> E1 + | finally -> E1 + | | E1: ALOAD_1 + | | MONITOREXIT + | finally -> E1 + | ATHROW + catch java.lang.Throwable -> E2 + E2: ASTORE_2 + INVOKESTATIC Four.aspectOf ()LFour; + INVOKEVIRTUAL Four.ajc$afterThrowing$Four$2$9d31eed1 ()V + ALOAD_2 + ATHROW + end public void m2() diff --git a/tests/features152/synchronization/transformed/expected/C.m3.txt b/tests/features152/synchronization/transformed/expected/C.m3.txt new file mode 100644 index 000000000..f1157285e --- /dev/null +++ b/tests/features152/synchronization/transformed/expected/C.m3.txt @@ -0,0 +1,23 @@ + public void m3() org.aspectj.weaver.MethodDeclarationLineNumber: 20:747 +: + ALOAD_0 + DUP + ASTORE_1 + MONITORENTER + finally -> E1 + | GETSTATIC java.lang.System.err Ljava/io/PrintStream; (line 21) + | LDC "hello" + | INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/String;)V + | ALOAD_1 + | MONITOREXIT + | GOTO L0 (line 22) + finally -> E1 + finally -> E1 + | E1: ALOAD_1 + | MONITOREXIT + finally -> E1 + ATHROW + L0: INVOKESTATIC Three.aspectOf ()LThree; + INVOKEVIRTUAL Three.ajc$afterReturning$Three$1$3f09355c ()V + RETURN + end public void m3() diff --git a/tests/features152/synchronization/transformed/expected/C.m32.txt b/tests/features152/synchronization/transformed/expected/C.m32.txt new file mode 100644 index 000000000..0e2819293 --- /dev/null +++ b/tests/features152/synchronization/transformed/expected/C.m32.txt @@ -0,0 +1,28 @@ + public void m32() org.aspectj.weaver.MethodDeclarationLineNumber: 24:823 +: + catch java.lang.Throwable -> E2 + | ALOAD_0 + | DUP + | ASTORE_1 + | MONITORENTER + | finally -> E1 + | | GETSTATIC java.lang.System.err Ljava/io/PrintStream; (line 25) + | | LDC "hello" + | | INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/String;)V + | | NEW MyException (line 26) + | | DUP + | | INVOKESPECIAL MyException.<init> ()V + | | ATHROW + | finally -> E1 + | finally -> E1 + | | E1: ALOAD_1 + | | MONITOREXIT + | finally -> E1 + | ATHROW + catch java.lang.Throwable -> E2 + E2: ASTORE_2 + INVOKESTATIC Three.aspectOf ()LThree; + INVOKEVIRTUAL Three.ajc$afterThrowing$Three$2$b2d97242 ()V + ALOAD_2 + ATHROW + end public void m32() diff --git a/tests/features152/synchronization/transformed/expected/C.m33.txt b/tests/features152/synchronization/transformed/expected/C.m33.txt new file mode 100644 index 000000000..86b78ffb3 --- /dev/null +++ b/tests/features152/synchronization/transformed/expected/C.m33.txt @@ -0,0 +1,24 @@ + public void m33() org.aspectj.weaver.MethodDeclarationLineNumber: 29:917 +: + ALOAD_0 // LC; this (line 30) + DUP + ASTORE_1 + MONITORENTER + finally -> E1 + | GETSTATIC java.lang.System.err Ljava/io/PrintStream; (line 31) + | LDC "hello" + | INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/String;)V + | ALOAD_1 (line 30) + | MONITOREXIT + finally -> E1 + GOTO L0 + finally -> E1 + | E1: ALOAD_1 + | MONITOREXIT + finally -> E1 + ATHROW + L0: GOTO L1 (line 33) + L1: INVOKESTATIC Three.aspectOf ()LThree; + INVOKEVIRTUAL Three.ajc$afterReturning$Three$3$b48e4ae1 ()V + RETURN + end public void m33() diff --git a/tests/features152/synchronization/transformed/expected/C.m34.txt b/tests/features152/synchronization/transformed/expected/C.m34.txt new file mode 100644 index 000000000..c787ba249 --- /dev/null +++ b/tests/features152/synchronization/transformed/expected/C.m34.txt @@ -0,0 +1,26 @@ + public void m34() org.aspectj.weaver.MethodDeclarationLineNumber: 35:1018 +: + catch java.lang.Throwable -> E1 + | ALOAD_0 // LC; this (line 36) + | DUP + | ASTORE_1 + | MONITORENTER + | finally -> E0 + | | GETSTATIC java.lang.System.err Ljava/io/PrintStream; (line 37) + | | LDC "hello" + | | INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/String;)V + | | NEW MyException (line 38) + | | DUP + | | INVOKESPECIAL MyException.<init> ()V + | | ATHROW + | | E0: ALOAD_1 (line 36) + | | MONITOREXIT + | finally -> E0 + | ATHROW + catch java.lang.Throwable -> E1 + E1: ASTORE_2 + INVOKESTATIC Three.aspectOf ()LThree; + INVOKEVIRTUAL Three.ajc$afterThrowing$Three$4$b6432380 ()V + ALOAD_2 + ATHROW + end public void m34() diff --git a/tests/features152/synchronization/transformed/expected/C.m4.txt b/tests/features152/synchronization/transformed/expected/C.m4.txt new file mode 100644 index 000000000..9e50085ea --- /dev/null +++ b/tests/features152/synchronization/transformed/expected/C.m4.txt @@ -0,0 +1,26 @@ + public void m4() org.aspectj.weaver.MethodDeclarationLineNumber: 35:1007 +: + catch java.lang.Throwable -> E1 + | ALOAD_0 // LC; this (line 36) + | DUP + | ASTORE_1 + | MONITORENTER + | finally -> E0 + | | GETSTATIC java.lang.System.err Ljava/io/PrintStream; (line 37) + | | LDC "hello" + | | INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/String;)V + | | NEW MyException (line 38) + | | DUP + | | INVOKESPECIAL MyException.<init> ()V + | | ATHROW + | | E0: ALOAD_1 (line 36) + | | MONITOREXIT + | finally -> E0 + | ATHROW + catch java.lang.Throwable -> E1 + E1: ASTORE_2 + INVOKESTATIC Three.aspectOf ()LThree; + INVOKEVIRTUAL Three.ajc$afterThrowing$Three$4$40be0dfb ()V + ALOAD_2 + ATHROW + end public void m4() diff --git a/tests/features152/synchronization/transformed/expected/C.ma.txt b/tests/features152/synchronization/transformed/expected/C.ma.txt new file mode 100644 index 000000000..0a6b97849 --- /dev/null +++ b/tests/features152/synchronization/transformed/expected/C.ma.txt @@ -0,0 +1,22 @@ + public void ma() org.aspectj.weaver.MethodDeclarationLineNumber: 14:307 +: + INVOKESTATIC Two.aspectOf ()LTwo; + INVOKEVIRTUAL Two.ajc$before$Two$1$8d8821ee ()V + ALOAD_0 + DUP + ASTORE_1 + MONITORENTER + finally -> E1 + | GETSTATIC java.lang.System.err Ljava/io/PrintStream; (line 15) + | LDC "hello" + | INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/String;)V + | ALOAD_1 + | MONITOREXIT + | RETURN (line 16) + finally -> E1 + finally -> E1 + | E1: ALOAD_1 + | MONITOREXIT + finally -> E1 + ATHROW + end public void ma() diff --git a/tests/features152/synchronization/transformed/expected/Investigation.b.txt b/tests/features152/synchronization/transformed/expected/Investigation.b.txt new file mode 100644 index 000000000..15f83a1d6 --- /dev/null +++ b/tests/features152/synchronization/transformed/expected/Investigation.b.txt @@ -0,0 +1,21 @@ + public void b() org.aspectj.weaver.MethodDeclarationLineNumber: 19:312 +: + ALOAD_0 // LInvestigation; this (line 20) + DUP + ASTORE_1 + MONITORENTER + finally -> E1 + | GETSTATIC java.lang.System.out Ljava/io/PrintStream; (line 21) + | LDC "hello" + | INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/String;)V + | ALOAD_1 (line 20) + | MONITOREXIT + finally -> E1 + GOTO L0 + finally -> E1 + | E1: ALOAD_1 + | MONITOREXIT + finally -> E1 + ATHROW + L0: RETURN (line 23) + end public void b() diff --git a/tests/features152/synchronization/transformed/expected/Investigation.c.txt b/tests/features152/synchronization/transformed/expected/Investigation.c.txt new file mode 100644 index 000000000..7fa235d5d --- /dev/null +++ b/tests/features152/synchronization/transformed/expected/Investigation.c.txt @@ -0,0 +1,35 @@ + public void c() org.aspectj.weaver.MethodDeclarationLineNumber: 26:439 +: + ALOAD_0 // LInvestigation; this (line 27) + DUP + ASTORE_1 + MONITORENTER + finally -> E2 + | catch java.io.IOException -> E0 + | | NEW java.io.File (line 29) + | | DUP + | | LDC "fred" + | | INVOKESPECIAL java.io.File.<init> (Ljava/lang/String;)V + | | ASTORE_2 + | | NEW java.io.FileInputStream (line 30) + | | DUP + | | ALOAD_2 // Ljava/io/File; f + | | INVOKESPECIAL java.io.FileInputStream.<init> (Ljava/io/File;)V + | | POP + | | GOTO L0 + | catch java.io.IOException -> E0 + | E0: POP (line 31) + | GETSTATIC java.lang.System.out Ljava/io/PrintStream; (line 32) + | LDC "bang" + | INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/String;)V + | L0: ALOAD_1 (line 27) + | MONITOREXIT + finally -> E2 + GOTO L1 + finally -> E2 + | E2: ALOAD_1 + | MONITOREXIT + finally -> E2 + ATHROW + L1: RETURN (line 35) + end public void c() diff --git a/tests/features152/synchronization/transformed/expected/Investigation.d.txt b/tests/features152/synchronization/transformed/expected/Investigation.d.txt new file mode 100644 index 000000000..a2a73c36a --- /dev/null +++ b/tests/features152/synchronization/transformed/expected/Investigation.d.txt @@ -0,0 +1,38 @@ + public void d() org.aspectj.weaver.MethodDeclarationLineNumber: 38:706 +: + ALOAD_0 // LInvestigation; this (line 39) + DUP + ASTORE_1 + MONITORENTER + finally -> E1 + | GETSTATIC java.lang.System.out Ljava/io/PrintStream; (line 40) + | LDC "hello" + | INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/String;)V + | ALOAD_1 (line 39) + | MONITOREXIT + finally -> E1 + GOTO L0 + finally -> E1 + | E1: ALOAD_1 + | MONITOREXIT + finally -> E1 + ATHROW + L0: ALOAD_0 // LInvestigation; this (line 42) + DUP + ASTORE_1 + MONITORENTER + finally -> E3 + | GETSTATIC java.lang.System.out Ljava/io/PrintStream; (line 43) + | LDC "world" + | INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/String;)V + | ALOAD_1 (line 42) + | MONITOREXIT + finally -> E3 + GOTO L1 + finally -> E3 + | E3: ALOAD_1 + | MONITOREXIT + finally -> E3 + ATHROW + L1: RETURN (line 45) + end public void d() diff --git a/tests/features152/synchronization/transformed/expected/Investigation.e.txt b/tests/features152/synchronization/transformed/expected/Investigation.e.txt new file mode 100644 index 000000000..6508daf3a --- /dev/null +++ b/tests/features152/synchronization/transformed/expected/Investigation.e.txt @@ -0,0 +1,40 @@ + public void e() org.aspectj.weaver.MethodDeclarationLineNumber: 48:904 +: + ALOAD_0 // LInvestigation; this (line 49) + DUP + ASTORE_1 + MONITORENTER + finally -> E3 + | GETSTATIC java.lang.System.out Ljava/io/PrintStream; (line 50) + | LDC "hello" + | INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/String;)V + | NEW java.lang.String (line 51) + | DUP + | INVOKESPECIAL java.lang.String.<init> ()V + | DUP + | ASTORE_2 + | MONITORENTER + | finally -> E1 + | | GETSTATIC java.lang.System.out Ljava/io/PrintStream; (line 52) + | | LDC "other" + | | INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/String;)V + | | ALOAD_2 (line 51) + | | MONITOREXIT + | finally -> E1 + | GOTO L0 + | finally -> E1 + | | E1: ALOAD_2 + | | MONITOREXIT + | finally -> E1 + | ATHROW + | L0: ALOAD_1 (line 49) + | MONITOREXIT + finally -> E3 + GOTO L1 + finally -> E3 + | E3: ALOAD_1 + | MONITOREXIT + finally -> E3 + ATHROW + L1: RETURN (line 55) + end public void e() diff --git a/tests/features152/synchronization/transformed/expected/One.b.txt b/tests/features152/synchronization/transformed/expected/One.b.txt new file mode 100644 index 000000000..948cb66cd --- /dev/null +++ b/tests/features152/synchronization/transformed/expected/One.b.txt @@ -0,0 +1,22 @@ + public void b() org.aspectj.weaver.MethodDeclarationLineNumber: 13:259 +: + ALOAD_0 + DUP + ASTORE_1 + MONITORENTER + finally -> E1 + | GETSTATIC java.lang.System.out Ljava/io/PrintStream; (line 14) + | LDC "hello" + | INVOKESTATIC One.aspectOf ()LOne; + | INVOKEVIRTUAL One.ajc$before$One$1$d2a8f7b9 ()V + | INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/String;)V + | ALOAD_1 + | MONITOREXIT + | RETURN (line 15) + finally -> E1 + finally -> E1 + | E1: ALOAD_1 + | MONITOREXIT + finally -> E1 + ATHROW + end public void b() diff --git a/tests/features152/synchronization/transformed/expected/One.c.txt b/tests/features152/synchronization/transformed/expected/One.c.txt new file mode 100644 index 000000000..3641c9b36 --- /dev/null +++ b/tests/features152/synchronization/transformed/expected/One.c.txt @@ -0,0 +1,36 @@ + public void c() org.aspectj.weaver.MethodDeclarationLineNumber: 18:368 +: + ALOAD_0 + DUP + ASTORE_2 + MONITORENTER + finally -> E2 + | catch java.io.IOException -> E0 + | | NEW java.io.File (line 20) + | | DUP + | | LDC "fred" + | | INVOKESPECIAL java.io.File.<init> (Ljava/lang/String;)V + | | ASTORE_1 + | | NEW java.io.FileInputStream (line 21) + | | DUP + | | ALOAD_1 // Ljava/io/File; f + | | INVOKESPECIAL java.io.FileInputStream.<init> (Ljava/io/File;)V + | | POP + | | GOTO L0 + | catch java.io.IOException -> E0 + | E0: POP (line 22) + | GETSTATIC java.lang.System.out Ljava/io/PrintStream; (line 23) + | LDC "bang" + | INVOKESTATIC One.aspectOf ()LOne; + | INVOKEVIRTUAL One.ajc$before$One$1$d2a8f7b9 ()V + | INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/String;)V + | L0: ALOAD_2 + | MONITOREXIT + | RETURN (line 25) + finally -> E2 + finally -> E2 + | E2: ALOAD_2 + | MONITOREXIT + finally -> E2 + ATHROW + end public void c() diff --git a/tests/features152/synchronization/transformed/expected/One.e.txt b/tests/features152/synchronization/transformed/expected/One.e.txt new file mode 100644 index 000000000..85d93f0ed --- /dev/null +++ b/tests/features152/synchronization/transformed/expected/One.e.txt @@ -0,0 +1,43 @@ + public void e() org.aspectj.weaver.MethodDeclarationLineNumber: 28:611 +: + ALOAD_0 + DUP + ASTORE_2 + MONITORENTER + finally -> E3 + | GETSTATIC java.lang.System.out Ljava/io/PrintStream; (line 29) + | LDC "hello" + | INVOKESTATIC One.aspectOf ()LOne; + | INVOKEVIRTUAL One.ajc$before$One$1$d2a8f7b9 ()V + | INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/String;)V + | NEW java.lang.String (line 30) + | DUP + | INVOKESPECIAL java.lang.String.<init> ()V + | DUP + | ASTORE_1 + | MONITORENTER + | finally -> E1 + | | GETSTATIC java.lang.System.out Ljava/io/PrintStream; (line 31) + | | LDC "other" + | | INVOKESTATIC One.aspectOf ()LOne; + | | INVOKEVIRTUAL One.ajc$before$One$1$d2a8f7b9 ()V + | | INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/String;)V + | | ALOAD_1 (line 30) + | | MONITOREXIT + | finally -> E1 + | GOTO L0 + | finally -> E1 + | | E1: ALOAD_1 + | | MONITOREXIT + | finally -> E1 + | ATHROW + | L0: ALOAD_2 + | MONITOREXIT + | RETURN (line 33) + finally -> E3 + finally -> E3 + | E3: ALOAD_2 + | MONITOREXIT + finally -> E3 + ATHROW + end public void e() |