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)
}