From 61e9f98b9fab9d6583ec78af84bc33e4c4f2029e Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Thu, 26 Jan 2023 22:03:00 +0100 Subject: [PATCH] Load JDK 8 platform implementations class without reflection Also remove search for other platform implementation classes because now the first match should be found in the same jar Helps to avoid GraalVM related reflection problems in KT-51579 --- libraries/stdlib/jvm/build.gradle | 14 +++++++++++++ .../JDK8PlatformImplementations.kt | 11 ++++++++++ .../internal/PlatformImplementations.kt | 20 +++---------------- 3 files changed, 28 insertions(+), 17 deletions(-) create mode 100644 libraries/stdlib/jvm/compileOnly/JDK8PlatformImplementations.kt diff --git a/libraries/stdlib/jvm/build.gradle b/libraries/stdlib/jvm/build.gradle index 4b5ff5a0556..506b0bf8a78 100644 --- a/libraries/stdlib/jvm/build.gradle +++ b/libraries/stdlib/jvm/build.gradle @@ -15,6 +15,11 @@ configurations { } sourceSets { + compileOnlyDeclarations { + java { + srcDir 'compileOnly' + } + } main { java { srcDir "${rootDir}/core/builtins/src" @@ -74,6 +79,7 @@ dependencies { api group: 'org.jetbrains', name: 'annotations', version:'13.0' + compileOnly sourceSets.compileOnlyDeclarations.output mainJdk7Api sourceSets.main.output mainJdk8Api sourceSets.main.output mainJdk8Api sourceSets.mainJdk7.output @@ -176,6 +182,14 @@ compileMainJdk8Kotlin { kotlinOptions.moduleName = "kotlin-stdlib-jdk8" } +compileCompileOnlyDeclarationsKotlin { + kotlinOptions { + freeCompilerArgs = [ + "-Xallow-kotlin-package", + ] + } +} + compileTestKotlin { kotlinOptions { freeCompilerArgs += [ diff --git a/libraries/stdlib/jvm/compileOnly/JDK8PlatformImplementations.kt b/libraries/stdlib/jvm/compileOnly/JDK8PlatformImplementations.kt new file mode 100644 index 00000000000..ae5c174dcd6 --- /dev/null +++ b/libraries/stdlib/jvm/compileOnly/JDK8PlatformImplementations.kt @@ -0,0 +1,11 @@ +/* + * Copyright 2010-2023 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. + */ + +package kotlin.internal.jdk8 + +// forward-reference declaration of JDK8PlatformImplementations +// declared in the source set compiled against JDK 8 +// used in the source set compiled against JDK 6 +public open class JDK8PlatformImplementations() diff --git a/libraries/stdlib/jvm/src/kotlin/internal/PlatformImplementations.kt b/libraries/stdlib/jvm/src/kotlin/internal/PlatformImplementations.kt index ad213cb9a6e..81bdd41e90c 100644 --- a/libraries/stdlib/jvm/src/kotlin/internal/PlatformImplementations.kt +++ b/libraries/stdlib/jvm/src/kotlin/internal/PlatformImplementations.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 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. */ @@ -47,22 +47,8 @@ internal open class PlatformImplementations { @JvmField -internal val IMPLEMENTATIONS: PlatformImplementations = run { - try { - return@run castToBaseType(Class.forName("kotlin.internal.jdk8.JDK8PlatformImplementations").newInstance()) - } catch (e: ClassNotFoundException) { } - try { - return@run castToBaseType(Class.forName("kotlin.internal.JRE8PlatformImplementations").newInstance()) - } catch (e: ClassNotFoundException) { } - try { - return@run castToBaseType(Class.forName("kotlin.internal.jdk7.JDK7PlatformImplementations").newInstance()) - } catch (e: ClassNotFoundException) { } - try { - return@run castToBaseType(Class.forName("kotlin.internal.JRE7PlatformImplementations").newInstance()) - } catch (e: ClassNotFoundException) { } - - PlatformImplementations() -} +internal val IMPLEMENTATIONS: PlatformImplementations = + castToBaseType(kotlin.internal.jdk8.JDK8PlatformImplementations()) @kotlin.internal.InlineOnly private inline fun castToBaseType(instance: Any): T {