diff --git a/kotlin-native/backend.native/tests/build.gradle b/kotlin-native/backend.native/tests/build.gradle index 42b67ae8819..5501077bf4a 100644 --- a/kotlin-native/backend.native/tests/build.gradle +++ b/kotlin-native/backend.native/tests/build.gradle @@ -3338,6 +3338,36 @@ standaloneTest("mpp_optional_expectation") { ] } +standaloneTest("freezing_control_basic_full") { + enabled = isExperimentalMM + source = "runtime/freezing_control/basic.kt" + flags = [ + '-Xbinary=freezing=full', + '-friend-modules', project.rootProject.file("${UtilsKt.getKotlinNativeDist(project)}/klib/common/stdlib").absolutePath + ] + arguments = ['full'] +} + +standaloneTest("freezing_control_basic_disabled") { + enabled = isExperimentalMM + source = "runtime/freezing_control/basic.kt" + flags = [ + '-Xbinary=freezing=disabled', + '-friend-modules', project.rootProject.file("${UtilsKt.getKotlinNativeDist(project)}/klib/common/stdlib").absolutePath + ] + arguments = ['disabled'] +} + +standaloneTest("freezing_control_basic_explicitOnly") { + enabled = isExperimentalMM + source = "runtime/freezing_control/basic.kt" + flags = [ + '-Xbinary=freezing=explicitOnly', + '-friend-modules', project.rootProject.file("${UtilsKt.getKotlinNativeDist(project)}/klib/common/stdlib").absolutePath + ] + arguments = ['explicitOnly'] +} + task unit1(type: KonanLocalTest) { goldValue = "First\nkotlin.Unit\n" source = "codegen/basics/unit1.kt" diff --git a/kotlin-native/backend.native/tests/runtime/freezing_control/basic.kt b/kotlin-native/backend.native/tests/runtime/freezing_control/basic.kt new file mode 100644 index 00000000000..4cb9fd142a1 --- /dev/null +++ b/kotlin-native/backend.native/tests/runtime/freezing_control/basic.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +import kotlin.test.* +import kotlin.native.concurrent.* +import kotlin.native.internal.Frozen + +class NonFrozenClass + +@Frozen +class FrozenClass + +val globalNonFrozen = NonFrozenClass() +@SharedImmutable +val sharedImmutableNonFrozen = NonFrozenClass() + +val globalFrozen = FrozenClass() +@SharedImmutable +val sharedImmutableFrozen = FrozenClass() + +fun main(args: Array) { + val mode = args.first() + val localNonFrozen = NonFrozenClass() + val localFrozen = FrozenClass() + + when (mode) { + "full" -> { + checkFreezeCheck(localNonFrozen, false, true) + checkFreezeCheck(localFrozen, true, true) + checkFreezeCheck(globalNonFrozen, false, true) + checkFreezeCheck(sharedImmutableNonFrozen, true, true) + checkFreezeCheck(globalFrozen, true, true) + checkFreezeCheck(sharedImmutableFrozen, true, true) + } + "disabled" -> { + checkFreezeCheck(localNonFrozen, false, false) + checkFreezeCheck(localFrozen, false, false) + checkFreezeCheck(globalNonFrozen, false, false) + checkFreezeCheck(sharedImmutableNonFrozen, false, false) + checkFreezeCheck(globalFrozen, false, false) + checkFreezeCheck(sharedImmutableFrozen, false, false) + } + "explicitOnly" -> { + checkFreezeCheck(localNonFrozen, false, true) + checkFreezeCheck(localFrozen, false, true) + checkFreezeCheck(globalNonFrozen, false, true) + checkFreezeCheck(sharedImmutableNonFrozen, false, true) + checkFreezeCheck(globalFrozen, false, true) + checkFreezeCheck(sharedImmutableFrozen, false, true) + } + } +} + +private fun checkFreezeCheck(arg: Any, isFrozenBefore: Boolean, isFrozenAfter: Boolean) { + assertEquals(isFrozenBefore, arg.isFrozen) + arg.freeze() + assertEquals(isFrozenAfter, arg.isFrozen) +} \ No newline at end of file