From a9f7ff254b8d359884b3f8625d11f2ba2a262d0e Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 12 Mar 2020 14:04:37 +0100 Subject: [PATCH] Add -Xno-optimized-callable-references to disable KT-27362 optimization This argument is useful in situations where the stdlib version which the code compiles against is different from the one which is available at runtime, such as the case of kotlin-gradle-plugin, which depends on the compiler/stdlib compiled by 1.4, but may be executed in Gradle where only 1.3.x is available. #KT-37435 --- .../src/org/jetbrains/kotlin/codegen/JvmRuntimeTypes.kt | 9 +++++++-- .../jetbrains/kotlin/codegen/state/GenerationState.kt | 4 +++- .../cli/common/arguments/K2JVMCompilerArguments.kt | 6 ++++++ .../cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt | 1 + .../jetbrains/kotlin/config/JVMConfigurationKeys.java | 3 +++ compiler/testData/cli/jvm/extraHelp.out | 2 ++ 6 files changed, 22 insertions(+), 3 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmRuntimeTypes.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmRuntimeTypes.kt index 7e97f7f8a4e..293ff2a0b29 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmRuntimeTypes.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmRuntimeTypes.kt @@ -26,12 +26,17 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.types.KotlinType -class JvmRuntimeTypes(module: ModuleDescriptor, private val languageVersionSettings: LanguageVersionSettings) { +class JvmRuntimeTypes( + module: ModuleDescriptor, + private val languageVersionSettings: LanguageVersionSettings, + forceNoOptimizedCallableReferences: Boolean +) { private val kotlinJvmInternalPackage = MutablePackageFragmentDescriptor(module, FqName("kotlin.jvm.internal")) private val kotlinCoroutinesJvmInternalPackage = MutablePackageFragmentDescriptor(module, languageVersionSettings.coroutinesJvmInternalPackageFqName()) - val generateOptimizedCallableReferenceSuperClasses = languageVersionSettings.apiVersion >= ApiVersion.KOTLIN_1_4 + val generateOptimizedCallableReferenceSuperClasses = + languageVersionSettings.apiVersion >= ApiVersion.KOTLIN_1_4 && !forceNoOptimizedCallableReferences private fun internal(className: String, packageFragment: PackageFragmentDescriptor = kotlinJvmInternalPackage): Lazy = lazy { createClass(packageFragment, className) } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt index e0fabef66e2..84e3b87ed8f 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt @@ -219,7 +219,9 @@ class GenerationState private constructor( val samWrapperClasses: SamWrapperClasses = SamWrapperClasses(this) val globalInlineContext: GlobalInlineContext = GlobalInlineContext(diagnostics) val mappingsClassesForWhenByEnum: MappingsClassesForWhenByEnum = MappingsClassesForWhenByEnum(this) - val jvmRuntimeTypes: JvmRuntimeTypes = JvmRuntimeTypes(module, configuration.languageVersionSettings) + val jvmRuntimeTypes: JvmRuntimeTypes = JvmRuntimeTypes( + module, configuration.languageVersionSettings, configuration.getBoolean(JVMConfigurationKeys.NO_OPTIMIZED_CALLABLE_REFERENCES) + ) val factory: ClassFileFactory private var duplicateSignatureFactory: BuilderFactoryForDuplicateSignatureDiagnostics? = null diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt index 7c7b1412fec..2d8949b2942 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt @@ -323,6 +323,12 @@ class K2JVMCompilerArguments : CommonCompilerArguments() { ) var klibLibraries: String? by NullableStringFreezableVar(null) + @Argument( + value = "-Xno-optimized-callable-references", + description = "Do not use optimized callable reference superclasses available from 1.4" + ) + var noOptimizedCallableReferences: Boolean by FreezableVar(false) + override fun configureAnalysisFlags(collector: MessageCollector): MutableMap, Any> { val result = super.configureAnalysisFlags(collector) result[JvmAnalysisFlags.strictMetadataVersionSemantics] = strictMetadataVersionSemantics diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt index a3f17c18529..3e1105bcc55 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt @@ -153,6 +153,7 @@ fun CompilerConfiguration.configureAdvancedJvmOptions(arguments: K2JVMCompilerAr ) put(JVMConfigurationKeys.DISABLE_OPTIMIZATION, arguments.noOptimize) put(JVMConfigurationKeys.EMIT_JVM_TYPE_ANNOTATIONS, arguments.emitJvmTypeAnnotations) + put(JVMConfigurationKeys.NO_OPTIMIZED_CALLABLE_REFERENCES, arguments.noOptimizedCallableReferences) if (!JVMConstructorCallNormalizationMode.isSupportedValue(arguments.constructorCallNormalizationMode)) { getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY).report( diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java b/compiler/frontend.java/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java index 4257128f186..1ef813a851b 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java @@ -119,4 +119,7 @@ public class JVMConfigurationKeys { public static final CompilerConfigurationKey IS_IR_WITH_STABLE_ABI = CompilerConfigurationKey.create("Is IR with stable ABI"); + + public static final CompilerConfigurationKey NO_OPTIMIZED_CALLABLE_REFERENCES = + CompilerConfigurationKey.create("Do not use optimized callable reference superclasses available from 1.4"); } diff --git a/compiler/testData/cli/jvm/extraHelp.out b/compiler/testData/cli/jvm/extraHelp.out index 5146b25f7b3..93c1f48b64d 100644 --- a/compiler/testData/cli/jvm/extraHelp.out +++ b/compiler/testData/cli/jvm/extraHelp.out @@ -50,6 +50,8 @@ where advanced options include: -Xno-exception-on-explicit-equals-for-boxed-null Do not throw NPE on explicit 'equals' call for null receiver of platform boxed primitive type -Xno-optimize Disable optimizations + -Xno-optimized-callable-references + Do not use optimized callable reference superclasses available from 1.4 -Xno-param-assertions Don't generate not-null assertions on parameters of methods accessible from Java -Xno-receiver-assertions Don't generate not-null assertion for extension receiver arguments of platform types -Xno-use-ir Do not use the IR backend. Useful for a custom-built compiler where IR backend is enabled by default