Fix problem with ensureNeverFrozen(). (#2292)
This commit is contained in:
@@ -737,6 +737,12 @@ task freeze5(type: RunKonanTest) {
|
|||||||
source = "runtime/workers/freeze5.kt"
|
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) {
|
task atomic0(type: RunKonanTest) {
|
||||||
disabled = (project.testTarget == 'wasm32') // Workers need pthreads.
|
disabled = (project.testTarget == 'wasm32') // Workers need pthreads.
|
||||||
goldValue = "35\n" + "20\n" + "OK\n"
|
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)
|
||||||
@@ -1725,7 +1725,8 @@ void FreezeSubgraph(ObjHeader* root) {
|
|||||||
|
|
||||||
// Do DFS cycle detection.
|
// Do DFS cycle detection.
|
||||||
bool hasCycles = false;
|
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;
|
KStdVector<ContainerHeader*> order;
|
||||||
depthFirstTraversal(rootContainer, &hasCycles, &firstBlocker, order);
|
depthFirstTraversal(rootContainer, &hasCycles, &firstBlocker, order);
|
||||||
if (firstBlocker != nullptr) {
|
if (firstBlocker != nullptr) {
|
||||||
|
|||||||
Reference in New Issue
Block a user