From f1c10943933035322cf2219a7b0a7928e5263d28 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Thu, 14 Oct 2021 23:19:18 +0500 Subject: [PATCH] [K/N][optmz] Fix for https://youtrack.jetbrains.com/issue/KT-49234 --- .../FileInitializersOptimization.kt | 6 ++-- .../backend.native/tests/build.gradle | 5 ++++ .../tests/codegen/initializers/object.kt | 30 +++++++++++++++++++ 3 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 kotlin-native/backend.native/tests/codegen/initializers/object.kt diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/FileInitializersOptimization.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/FileInitializersOptimization.kt index 8729b11b328..6e5cf17d8f7 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/FileInitializersOptimization.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/FileInitializersOptimization.kt @@ -439,10 +439,8 @@ internal object FileInitializersOptimization { } else { require(objectClass.isExternal || objectClass is IrLazyClass) { "No constructor for ${objectClass.render()}" } } - val file = objectClass.fileOrNull ?: return data - val fileId = initializedFiles.fileIds[file]!! - if (data.get(fileId)) return data - return data.copy().also { it.set(fileId) } + // Don't update [data] as the constructor might not be called here (the object might be initialized already). + return data } private fun processCall(expression: IrFunctionAccessExpression, actualCallee: IrFunction, data: BitSet): BitSet { diff --git a/kotlin-native/backend.native/tests/build.gradle b/kotlin-native/backend.native/tests/build.gradle index ef5568fab9e..28846dc53a0 100644 --- a/kotlin-native/backend.native/tests/build.gradle +++ b/kotlin-native/backend.native/tests/build.gradle @@ -1622,6 +1622,11 @@ standaloneTest("initializers_return2") { useGoldenData = true } +standaloneTest("initializers_object") { + source = "codegen/initializers/object.kt" + flags = ['-Xir-property-lazy-initialization=enable'] +} + linkTest("initializers_linkTest1") { useGoldenData = true source = "codegen/initializers/linkTest1_main.kt" diff --git a/kotlin-native/backend.native/tests/codegen/initializers/object.kt b/kotlin-native/backend.native/tests/codegen/initializers/object.kt new file mode 100644 index 00000000000..b723cfcd03f --- /dev/null +++ b/kotlin-native/backend.native/tests/codegen/initializers/object.kt @@ -0,0 +1,30 @@ +/* + * 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. + */ + +// FILE: lib.kt +var z = false + +// FILE: lib2.kt +val x = foo() + +fun foo(): Int { + z = true + return 42 +} + +object Z { + fun bar() { } + fun baz() = x +} + +// FILE: main.kt +import kotlin.test.* + +fun main() { + Z.bar() + assertFalse(z) + assertEquals(42, Z.baz()) + assertTrue(z) +}