From bf12f7eee0d8847c0e4f4eeb4609b9be8c0a776b Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 28 Oct 2019 19:22:26 +0100 Subject: [PATCH] JVM IR: do not lower trimIndent/trimMargin if API version is too high We cannot be sure that we won't change behavior of these functions in some corner cases, so only perform this optimization if the API version specified by the user is not greater than the compiler's own stdlib version it was compiled against. This is the same as the similar code in the old backend in IntrinsicMethods. --- .../kotlin/codegen/state/GenerationState.kt | 2 +- .../backend/common/lower/StringTrimLowering.kt | 7 ------- .../src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt | 12 ++++++++++++ 3 files changed, 13 insertions(+), 8 deletions(-) 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 4a5cb5274dd..99cf3ea4304 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt @@ -210,10 +210,10 @@ class GenerationState private constructor( target, isIrBackend ) + val canReplaceStdlibRuntimeApiBehavior = languageVersionSettings.apiVersion <= ApiVersion.parse(KotlinVersion.CURRENT.toString())!! val intrinsics: IntrinsicMethods = run { val shouldUseConsistentEquals = languageVersionSettings.supportsFeature(LanguageFeature.ThrowNpeOnExplicitEqualsForBoxedNull) && !configuration.getBoolean(JVMConfigurationKeys.NO_EXCEPTION_ON_EXPLICIT_EQUALS_FOR_BOXED_NULL) - val canReplaceStdlibRuntimeApiBehavior = languageVersionSettings.apiVersion <= ApiVersion.parse(KotlinVersion.CURRENT.toString())!! IntrinsicMethods(target, canReplaceStdlibRuntimeApiBehavior, shouldUseConsistentEquals) } val samWrapperClasses: SamWrapperClasses = SamWrapperClasses(this) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/StringTrimLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/StringTrimLowering.kt index 62a1586d726..48c7a62a48d 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/StringTrimLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/StringTrimLowering.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.backend.common.lower import org.jetbrains.kotlin.backend.common.CommonBackendContext import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.lower.matchers.SimpleCalleeMatcher -import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrConst @@ -20,12 +19,6 @@ import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.name.FqName -val computeStringTrimPhase = makeIrFilePhase( - ::StringTrimLowering, - name = "StringTrimLowering", - description = "Compute trimIndent and trimMargin operations on constant strings" -) - class StringTrimLowering(val context: CommonBackendContext) : FileLoweringPass, IrElementTransformerVoid() { override fun lower(irFile: IrFile) { irFile.transformChildrenVoid(this) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt index f095cd0eb1f..c81c3a00612 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.backend.jvm import org.jetbrains.kotlin.backend.common.CommonBackendContext +import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.lower.* import org.jetbrains.kotlin.backend.common.lower.loops.forLoopsPhase import org.jetbrains.kotlin.backend.common.phaser.* @@ -139,6 +140,17 @@ private val jvmLocalClassExtractionPhase = makeIrFilePhase( description = "Move local classes from field initializers and anonymous init blocks into the containing class" ) +private val computeStringTrimPhase = makeIrFilePhase( + { context -> + if (context.state.canReplaceStdlibRuntimeApiBehavior) + StringTrimLowering(context) + else + FileLoweringPass.Empty + }, + name = "StringTrimLowering", + description = "Compute trimIndent and trimMargin operations on constant strings" +) + private val defaultArgumentStubPhase = makeIrFilePhase( ::JvmDefaultArgumentStubGenerator, name = "DefaultArgumentsStubGenerator",