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
This commit is contained in:
Dmitry Savvinov
2019-08-12 12:26:50 +03:00
parent 555e1a35e9
commit 0065236bde
8 changed files with 16 additions and 20 deletions
@@ -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
@@ -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
@@ -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
@@ -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