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.
This commit is contained in:
Alexander Udalov
2020-08-12 19:48:20 +02:00
parent adcfbdec24
commit 9607414cf1
7 changed files with 35 additions and 29 deletions
@@ -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<IrSimpleFunction> {
val result = mutableSetOf<IrSimpleFunction>()
if (includeSelf) {
computeAllOverridden(this, result)
} else {
for (override in overriddenSymbols) {
computeAllOverridden(override.owner, result)
}
}
return result
}
private fun computeAllOverridden(function: IrSimpleFunction, result: MutableSet<IrSimpleFunction>) {
if (result.add(function)) {
for (override in function.overriddenSymbols) {
computeAllOverridden(override.owner, result)
}
}
}
@@ -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<IrSimpleFunction, SpecialMethodWithDefaultInfo>? {
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<IrSimpleFunction> {
val visited = mutableSetOf<IrSimpleFunction>()
fun IrSimpleFunction.search(): Sequence<IrSimpleFunction> {
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)
}
@@ -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 &&
@@ -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
@@ -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
@@ -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<Method, Bridge>()
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<SpecialBridge> = allOverridden().mapNotNull {
// List of special bridge methods which were not implemented in Kotlin superclasses.
private fun IrSimpleFunction.overriddenSpecialBridges(): List<SpecialBridge> = 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<IrSimpleFunction>()?.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 }
}
@@ -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