From 0065236bdebefa72c06aa7b32fe78bec6eb65781 Mon Sep 17 00:00:00 2001 From: Dmitry Savvinov Date: Mon, 12 Aug 2019 12:26:50 +0300 Subject: [PATCH] Move default implementation of TargetPlatform.platformName to leaf classes Otherwise, we have a static initialization loop, leading to null-leaks Removing default interface method indeed disconnects the loop, as per JVM Specification, "5.5 Initialization". See KT-33245 for detailed explanations ^KT-33245 Fixed --- .../org/jetbrains/kotlin/analyzer/common/CommonPlatform.kt | 4 ---- .../src/org/jetbrains/kotlin/platform/CommonPlatforms.kt | 5 ++++- .../src/org/jetbrains/kotlin/platform/konan/KonanPlatform.kt | 5 ++++- .../jetbrains/kotlin/resolve/konan/platform/KonanPlatform.kt | 4 ---- .../src/org/jetbrains/kotlin/platform/jvm/JvmPlatform.kt | 5 ++++- .../org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatform.kt | 4 ---- .../src/org/jetbrains/kotlin/js/resolve/JsPlatform.kt | 4 ---- .../src/org/jetbrains/kotlin/platform/js/JsPlatform.kt | 5 ++++- 8 files changed, 16 insertions(+), 20 deletions(-) diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/analyzer/common/CommonPlatform.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/analyzer/common/CommonPlatform.kt index 7425214f23e..4841a1fb621 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/analyzer/common/CommonPlatform.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/analyzer/common/CommonPlatform.kt @@ -16,10 +16,6 @@ import org.jetbrains.kotlin.resolve.TargetPlatform level = DeprecationLevel.ERROR ) interface CommonPlatform : TargetPlatform { - @JvmDefault - override val platformName: String - get() = "Default" - companion object { @JvmField val INSTANCE: CommonPlatform = CommonPlatforms.CompatCommonPlatform diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/platform/CommonPlatforms.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/platform/CommonPlatforms.kt index 182418218b9..8c75b108314 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/platform/CommonPlatforms.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/platform/CommonPlatforms.kt @@ -25,7 +25,10 @@ object CommonPlatforms { defaultJsPlatform.single(), defaultKonanPlatform.single() ) - ), org.jetbrains.kotlin.analyzer.common.CommonPlatform + ), org.jetbrains.kotlin.analyzer.common.CommonPlatform { + override val platformName: String + get() = "Default" + } val defaultCommonPlatform: TargetPlatform get() = CompatCommonPlatform diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/platform/konan/KonanPlatform.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/platform/konan/KonanPlatform.kt index 185572e9eb5..7ae5a3f6e12 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/platform/konan/KonanPlatform.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/platform/konan/KonanPlatform.kt @@ -24,7 +24,10 @@ object KonanPlatforms { ) object CompatKonanPlatform : TargetPlatform(setOf(DefaultSimpleKonanPlatform)), // Needed for backward compatibility, because old code uses INSTANCEOF checks instead of calling extensions - org.jetbrains.kotlin.resolve.konan.platform.KonanPlatform {} + org.jetbrains.kotlin.resolve.konan.platform.KonanPlatform { + override val platformName: String + get() = "Native" + } val defaultKonanPlatform: TargetPlatform get() = CompatKonanPlatform diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/resolve/konan/platform/KonanPlatform.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/resolve/konan/platform/KonanPlatform.kt index ce235acaea1..68559fdcce6 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/resolve/konan/platform/KonanPlatform.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/resolve/konan/platform/KonanPlatform.kt @@ -16,10 +16,6 @@ import org.jetbrains.kotlin.resolve.TargetPlatform level = DeprecationLevel.ERROR ) interface KonanPlatform : TargetPlatform { - @JvmDefault - override val platformName: String - get() = "Native" - companion object { @JvmField val INSTANCE: KonanPlatform = KonanPlatforms.CompatKonanPlatform diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/platform/jvm/JvmPlatform.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/platform/jvm/JvmPlatform.kt index edc348b71a4..659bb7681c1 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/platform/jvm/JvmPlatform.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/platform/jvm/JvmPlatform.kt @@ -45,7 +45,10 @@ object JvmPlatforms { ) object CompatJvmPlatform : TargetPlatform(setOf(UNSPECIFIED_SIMPLE_JVM_PLATFORM)), // Needed for backward compatibility, because old code uses INSTANCEOF checks instead of calling extensions - org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform {} + org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform { + override val platformName: String + get() = "JVM" + } } class JdkPlatform(val targetVersion: JvmTarget) : JvmPlatform() { diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatform.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatform.kt index 4ac6d9d84dc..edb1a2d2cc6 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatform.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatform.kt @@ -16,10 +16,6 @@ import org.jetbrains.kotlin.resolve.TargetPlatform level = DeprecationLevel.ERROR ) interface JvmPlatform : TargetPlatform { - @JvmDefault - override val platformName: String - get() = "JVM" - companion object { @JvmField val INSTANCE: JvmPlatform = JvmPlatforms.CompatJvmPlatform diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatform.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatform.kt index 92e80de4868..9dcd60d6f42 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatform.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatform.kt @@ -27,10 +27,6 @@ import org.jetbrains.kotlin.resolve.TargetPlatform level = DeprecationLevel.ERROR ) interface JsPlatform : TargetPlatform { - @JvmDefault - override val platformName: String - get() = "JS" - companion object { @JvmField val INSTANCE: JsPlatform = JsPlatforms.CompatJsPlatform diff --git a/js/js.frontend/src/org/jetbrains/kotlin/platform/js/JsPlatform.kt b/js/js.frontend/src/org/jetbrains/kotlin/platform/js/JsPlatform.kt index a850db860b6..c73e9eca184 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/platform/js/JsPlatform.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/platform/js/JsPlatform.kt @@ -24,7 +24,10 @@ object JsPlatforms { ) object CompatJsPlatform : TargetPlatform(setOf(DefaultSimpleJsPlatform)), // Needed for backward compatibility, because old code uses INSTANCEOF checks instead of calling extensions - org.jetbrains.kotlin.js.resolve.JsPlatform {} + org.jetbrains.kotlin.js.resolve.JsPlatform { + override val platformName: String + get() = "JS" + } val defaultJsPlatform: TargetPlatform get() = CompatJsPlatform