From 6422bafb7a3930bbdac168fdeb6a60d9d2d3627c Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 3 Jul 2014 18:39:57 +0400 Subject: [PATCH] More tests for synchronized() {} --- .../fullJdk/synchronized/changeMonitor.kt | 22 ++++++++++++++++ .../exceptionInMonitorExpression.kt | 15 +++++++++++ .../fullJdk/synchronized/finally.kt | 6 +++-- .../fullJdk/synchronized/longValue.kt | 10 ++++++++ .../fullJdk/synchronized/objectValue.kt | 10 ++++++++ .../fullJdk/synchronized/value.kt | 10 ++++++++ ...lackBoxWithStdlibCodegenTestGenerated.java | 25 +++++++++++++++++++ 7 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/changeMonitor.kt create mode 100644 compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/exceptionInMonitorExpression.kt create mode 100644 compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/longValue.kt create mode 100644 compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/objectValue.kt create mode 100644 compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/value.kt diff --git a/compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/changeMonitor.kt b/compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/changeMonitor.kt new file mode 100644 index 00000000000..8af680f664f --- /dev/null +++ b/compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/changeMonitor.kt @@ -0,0 +1,22 @@ +fun box(): String { + var obj0 = "0" as java.lang.Object + var obj1 = "1" as java.lang.Object + + var v = obj0 + synchronized (v) { + v = obj1 + } + assertThatThreadDoesNotOwnMonitor(obj0) + + return "OK" +} + +fun assertThatThreadDoesNotOwnMonitor(obj: java.lang.Object) { + try { + obj.wait(1) + throw IllegalStateException("Not owning a monitor!") + } + catch (e: IllegalMonitorStateException) { + // OK + } +} \ No newline at end of file diff --git a/compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/exceptionInMonitorExpression.kt b/compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/exceptionInMonitorExpression.kt new file mode 100644 index 00000000000..7e132d06d17 --- /dev/null +++ b/compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/exceptionInMonitorExpression.kt @@ -0,0 +1,15 @@ +fun box(): String { + val obj = "" as java.lang.Object + val e = IllegalArgumentException() + fun m() = throw e + try { + synchronized (m()) { + throw AssertionError("Should not have reached this point") + } + } + catch (caught: Throwable) { + if (!(caught identityEquals e)) return "Fail: $caught" + } + + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/finally.kt b/compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/finally.kt index 1c676b9936f..3ba247fccfa 100644 --- a/compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/finally.kt +++ b/compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/finally.kt @@ -1,12 +1,14 @@ fun box(): String { val obj = "" as java.lang.Object + val e = IllegalArgumentException() try { synchronized (obj) { - throw Throwable() + throw e } } - catch (e: Throwable) { + catch (caught: Throwable) { + if (!(caught identityEquals e)) return "Fail: $caught" // If monitorexit didn't happen (a finally block failed), this assertion would fail assertThatThreadDoesNotOwnMonitor(obj) } diff --git a/compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/longValue.kt b/compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/longValue.kt new file mode 100644 index 00000000000..de2eecd464a --- /dev/null +++ b/compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/longValue.kt @@ -0,0 +1,10 @@ +fun box(): String { + var obj = "0" as java.lang.Object + val result = synchronized (obj) { + 239L + } + + if (result != 239L) return "Fail: $result" + + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/objectValue.kt b/compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/objectValue.kt new file mode 100644 index 00000000000..bcfa98d1ad8 --- /dev/null +++ b/compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/objectValue.kt @@ -0,0 +1,10 @@ +fun box(): String { + var obj = "0" as java.lang.Object + val result = synchronized (obj) { + "239" + } + + if (result != "239") return "Fail: $result" + + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/value.kt b/compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/value.kt new file mode 100644 index 00000000000..020c42ba61c --- /dev/null +++ b/compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/value.kt @@ -0,0 +1,10 @@ +fun box(): String { + var obj = "0" as java.lang.Object + val result = synchronized (obj) { + 239 + } + + if (result != 239) return "Fail: $result" + + return "OK" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java index 983a5dc7bab..3fef55ce8dd 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java @@ -954,11 +954,26 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("changeMonitor.kt") + public void testChangeMonitor() throws Exception { + doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/changeMonitor.kt"); + } + + @TestMetadata("exceptionInMonitorExpression.kt") + public void testExceptionInMonitorExpression() throws Exception { + doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/exceptionInMonitorExpression.kt"); + } + @TestMetadata("finally.kt") public void testFinally() throws Exception { doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/finally.kt"); } + @TestMetadata("longValue.kt") + public void testLongValue() throws Exception { + doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/longValue.kt"); + } + @TestMetadata("nestedDifferentObjects.kt") public void testNestedDifferentObjects() throws Exception { doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/nestedDifferentObjects.kt"); @@ -969,11 +984,21 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/nestedSameObject.kt"); } + @TestMetadata("objectValue.kt") + public void testObjectValue() throws Exception { + doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/objectValue.kt"); + } + @TestMetadata("sync.kt") public void testSync() throws Exception { doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/sync.kt"); } + @TestMetadata("value.kt") + public void testValue() throws Exception { + doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/value.kt"); + } + @TestMetadata("wait.kt") public void testWait() throws Exception { doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/fullJdk/synchronized/wait.kt");