From 4b0b9e1f80a7d8cfd88216c64df9fa8c0cf67359 Mon Sep 17 00:00:00 2001 From: pyos Date: Thu, 25 Apr 2019 10:52:06 +0200 Subject: [PATCH] JVM_IR: make ToArrayLowering linear in complexity by not running DFS from every node visited during another DFS. --- .../backend/jvm/lower/ToArrayLowering.kt | 29 +++++++------------ 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ToArrayLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ToArrayLowering.kt index 7cde74df8c3..35264f7e229 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ToArrayLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ToArrayLowering.kt @@ -39,19 +39,10 @@ internal val toArrayPhase = makeIrFilePhase( private class ToArrayLowering(private val context: JvmBackendContext) : ClassLoweringPass { override fun lower(irClass: IrClass) { - if (irClass.isJvmInterface) return + if (irClass.isJvmInterface || !irClass.isDirectCollectionSubClass()) return val irBuiltIns = context.irBuiltIns - if (!irClass.isCollectionSubClass()) return - - if (irClass.hasSuperClass { - it != irClass && - it.isClass && - it.origin != IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB && - it.isCollectionSubClass() - }) return - val toArrayName = Name.identifier("toArray") val genericToArray = irClass.declarations.find { it.isGenericToArray() } val nonGenericToArray = irClass.declarations.find { it.isNonGenericToArray() } @@ -305,15 +296,15 @@ private class ToArrayLowering(private val context: JvmBackendContext) : ClassLow } } -private fun IrClass.hasSuperClass(pred: (IrClass) -> Boolean): Boolean = - DFS.ifAny( - listOf(this), - { irClass -> irClass.superTypes.mapNotNull { ((it as? IrSimpleType)?.classifier as? IrClassSymbol)?.owner } }, - pred - ) +private val IrClass.superClasses + get() = superTypes.mapNotNull { it.getClass() } // Have to check by name, since irBuiltins is unreliable. private fun IrClass.isCollectionSubClass() = - hasSuperClass { - it.defaultType.isCollection() - } \ No newline at end of file + DFS.ifAny(listOf(this), IrClass::superClasses) { it.defaultType.isCollection() } + +// If this class inherits from another Kotlin class that implements Collection, it already has toArray. +private fun IrClass.isDirectCollectionSubClass() = + isCollectionSubClass() && !superClasses.any { + it.isClass && it.origin != IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB && it.isCollectionSubClass() + }