Fix problem with ensureNeverFrozen(). (#2292)

This commit is contained in:
Nikolay Igotti
2018-11-02 17:47:41 +03:00
committed by GitHub
parent 9c8b85af5d
commit 3d2453b795
3 changed files with 42 additions and 1 deletions
+6
View File
@@ -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"
@@ -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)
+2 -1
View File
@@ -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<ContainerHeader*> order;
depthFirstTraversal(rootContainer, &hasCycles, &firstBlocker, order);
if (firstBlocker != nullptr) {