From 9607414cf16b90d23a475d4ae20cede8823da254 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 12 Aug 2020 19:48:20 +0200 Subject: [PATCH] IR: make allOverridden return Set instead of Sequence, move to IrUtils This doesn't hurt performance, but improves stack traces, in particular in JVM's BridgeLowering. --- .../kotlin/backend/common/ir/IrUtils.kt | 20 +++++++++++++++++++ .../common/lower/SpecialBridgeMethods.kt | 18 ++--------------- .../backend/jvm/codegen/CoroutineCodegen.kt | 9 +++------ .../jvm/codegen/MethodSignatureMapper.kt | 2 +- .../backend/jvm/codegen/irCodegenUtils.kt | 2 +- .../backend/jvm/lower/BridgeLowering.kt | 11 ++++++---- .../kotlin/android/parcel/ir/irUtils.kt | 2 +- 7 files changed, 35 insertions(+), 29 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt index 4c8d29313ed..a565085166e 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt @@ -620,3 +620,23 @@ private fun IrSimpleFunction.copyAndRenameConflictingTypeParametersFrom( val IrSymbol.isSuspend: Boolean get() = this is IrSimpleFunctionSymbol && owner.isSuspend + +fun IrSimpleFunction.allOverridden(includeSelf: Boolean = false): Set { + val result = mutableSetOf() + if (includeSelf) { + computeAllOverridden(this, result) + } else { + for (override in overriddenSymbols) { + computeAllOverridden(override.owner, result) + } + } + return result +} + +private fun computeAllOverridden(function: IrSimpleFunction, result: MutableSet) { + if (result.add(function)) { + for (override in function.overriddenSymbols) { + computeAllOverridden(override.owner, result) + } + } +} diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SpecialBridgeMethods.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SpecialBridgeMethods.kt index 9c10d97e638..93bf837ac17 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SpecialBridgeMethods.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SpecialBridgeMethods.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.backend.common.lower import org.jetbrains.kotlin.backend.common.CommonBackendContext +import org.jetbrains.kotlin.backend.common.ir.allOverridden import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction @@ -107,7 +108,7 @@ class SpecialBridgeMethods(val context: CommonBackendContext) { val specialPropertyNames = specialProperties.map { (description) -> description.name }.toHashSet() fun findSpecialWithOverride(irFunction: IrSimpleFunction): Pair? { - irFunction.allOverridden().forEach { overridden -> + for (overridden in irFunction.allOverridden()) { val description = overridden.toDescription() specialMethodsWithDefaults[description]?.let { return Pair(overridden, it) @@ -132,18 +133,3 @@ class SpecialBridgeMethods(val context: CommonBackendContext) { return specialMethods[irFunction.toDescription()] } } - -fun IrSimpleFunction.allOverridden(includeSelf: Boolean = false): Sequence { - val visited = mutableSetOf() - - fun IrSimpleFunction.search(): Sequence { - if (this in visited) return emptySequence() - return sequence { - yield(this@search) - visited.add(this@search) - overriddenSymbols.forEach { yieldAll(it.owner.search()) } - } - } - - return if (includeSelf) search() else search().drop(1) -} diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt index b8b2eed8681..480206f38b0 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt @@ -6,8 +6,8 @@ package org.jetbrains.kotlin.backend.jvm.codegen import org.jetbrains.kotlin.backend.common.CodegenUtil +import org.jetbrains.kotlin.backend.common.ir.allOverridden import org.jetbrains.kotlin.backend.common.lower.LocalDeclarationsLowering -import org.jetbrains.kotlin.backend.common.lower.allOverridden import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.backend.jvm.ir.isStaticInlineClassReplacement @@ -71,11 +71,8 @@ internal fun MethodNode.acceptWithStateMachine( accept(visitor) } -private fun IrFunction.anyOfOverriddenFunctionsReturnsNonUnit(): Boolean { - return (this as? IrSimpleFunction)?.allOverridden()?.toList()?.let { functions -> - functions.isNotEmpty() && functions.any { !it.returnType.isUnit() } - } == true -} +private fun IrFunction.anyOfOverriddenFunctionsReturnsNonUnit(): Boolean = + this is IrSimpleFunction && allOverridden().any { !it.returnType.isUnit() } internal fun IrFunction.suspendForInlineToOriginal(): IrSimpleFunction? { if (origin != JvmLoweredDeclarationOrigin.FOR_INLINE_STATE_MACHINE_TEMPLATE && diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt index f54da570f71..e59edf196fa 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt @@ -5,9 +5,9 @@ package org.jetbrains.kotlin.backend.jvm.codegen +import org.jetbrains.kotlin.backend.common.ir.allOverridden import org.jetbrains.kotlin.backend.common.ir.isMethodOfAny import org.jetbrains.kotlin.backend.common.ir.isTopLevel -import org.jetbrains.kotlin.backend.common.lower.allOverridden import org.jetbrains.kotlin.backend.common.lower.parentsWithSelf import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/irCodegenUtils.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/irCodegenUtils.kt index dfd9bbe63ac..42b62d0fc60 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/irCodegenUtils.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/irCodegenUtils.kt @@ -6,8 +6,8 @@ package org.jetbrains.kotlin.backend.jvm.codegen import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.backend.common.ir.allOverridden import org.jetbrains.kotlin.backend.common.ir.ir2string -import org.jetbrains.kotlin.backend.common.lower.allOverridden import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.backend.jvm.lower.MultifileFacadeFileEntry diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt index 7f33de70905..3e6bc1df122 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.backend.jvm.lower import org.jetbrains.kotlin.backend.common.FileLoweringPass +import org.jetbrains.kotlin.backend.common.ir.allOverridden import org.jetbrains.kotlin.backend.common.ir.copyTo import org.jetbrains.kotlin.backend.common.ir.isMethodOfAny import org.jetbrains.kotlin.backend.common.ir.isStatic @@ -294,7 +295,9 @@ internal class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass // Generate common bridges val generated = mutableMapOf() - irFunction.allOverridden().filter { !it.isFakeOverride }.forEach { override -> + for (override in irFunction.allOverridden()) { + if (override.isFakeOverride) continue + val signature = override.jvmMethod if (targetMethod != signature && signature !in blacklist) { generated.getOrPut(signature) { @@ -338,8 +341,8 @@ internal class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass it.specialBridgeOrNull?.signature?.takeIf { bridgeSignature -> bridgeSignature != it.jvmMethod } } - // Sequence of special bridge methods which were not implemented in Kotlin superclasses. - private fun IrSimpleFunction.overriddenSpecialBridges(): Sequence = allOverridden().mapNotNull { + // List of special bridge methods which were not implemented in Kotlin superclasses. + private fun IrSimpleFunction.overriddenSpecialBridges(): List = allOverridden().mapNotNull { if (it.parentAsClass.isInterface || it.comesFromJava()) it.specialBridgeOrNull?.takeIf { bridge -> bridge.signature != jvmMethod } ?.copy(isFinal = false, isSynthetic = true, methodInfo = null) @@ -386,7 +389,7 @@ internal class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass function.owner.safeAs()?.overriddenSymbols ?: emptyList() } val redundantOverrides = inheritedOverrides.flatMapTo(mutableSetOf()) { - it.owner.allOverridden().map { override -> override.symbol }.asIterable() + it.owner.allOverridden().map { override -> override.symbol } } overriddenSymbols = inheritedOverrides.filter { it !in redundantOverrides } } diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ir/irUtils.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ir/irUtils.kt index c78e6ddfc60..ec86b18ccf0 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ir/irUtils.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ir/irUtils.kt @@ -11,7 +11,7 @@ import org.jetbrains.kotlin.android.parcel.PARCELER_FQNAME import org.jetbrains.kotlin.android.parcel.PARCELIZE_CLASS_FQNAME import org.jetbrains.kotlin.android.parcel.serializers.ParcelableExtensionBase import org.jetbrains.kotlin.android.parcel.serializers.ParcelableExtensionBase.Companion.CREATOR_NAME -import org.jetbrains.kotlin.backend.common.lower.allOverridden +import org.jetbrains.kotlin.backend.common.ir.allOverridden import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.declarations.IrClass