diff --git a/backend.native/tests/build.gradle b/backend.native/tests/build.gradle index 0b6beb640e9..cf496f38b0d 100644 --- a/backend.native/tests/build.gradle +++ b/backend.native/tests/build.gradle @@ -737,6 +737,12 @@ task freeze5(type: RunKonanTest) { source = "runtime/workers/freeze5.kt" } +task freeze6(type: RunKonanTest) { + disabled = (project.testTarget == 'wasm32') // No exceptions on WASM. + goldValue = "OK\nOK\n" + source = "runtime/workers/freeze6.kt" +} + task atomic0(type: RunKonanTest) { disabled = (project.testTarget == 'wasm32') // Workers need pthreads. goldValue = "35\n" + "20\n" + "OK\n" diff --git a/backend.native/tests/runtime/workers/freeze6.kt b/backend.native/tests/runtime/workers/freeze6.kt new file mode 100644 index 00000000000..935a2671237 --- /dev/null +++ b/backend.native/tests/runtime/workers/freeze6.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the LICENSE file. + */ + +package runtime.workers.freeze6 + +import kotlin.test.* +import kotlin.native.concurrent.* + +@Test +fun ensureNeverFrozenNoFreezeChild(){ + val noFreeze = Hi("qwert") + noFreeze.ensureNeverFrozen() + + val nested = Nested(noFreeze) + assertFails { nested.freeze() } + + println("OK") +} + +@Test +fun ensureNeverFrozenFailsTarget(){ + val noFreeze = Hi("qwert") + noFreeze.ensureNeverFrozen() + + assertFalse(noFreeze.isFrozen) + assertFails { noFreeze.freeze() } + assertFalse(noFreeze.isFrozen) + println("OK") +} + +data class Hi(val s:String) +data class Nested(val hi:Hi) \ No newline at end of file diff --git a/runtime/src/main/cpp/Memory.cpp b/runtime/src/main/cpp/Memory.cpp index a533f66b7d8..e1547b27c70 100644 --- a/runtime/src/main/cpp/Memory.cpp +++ b/runtime/src/main/cpp/Memory.cpp @@ -1725,7 +1725,8 @@ void FreezeSubgraph(ObjHeader* root) { // Do DFS cycle detection. bool hasCycles = false; - KRef firstBlocker = nullptr; + KRef firstBlocker = root->has_meta_object() && ((root->meta_object()->flags_ & MF_NEVER_FROZEN) != 0) ? + root : nullptr; KStdVector order; depthFirstTraversal(rootContainer, &hasCycles, &firstBlocker, order); if (firstBlocker != nullptr) {