From b57b81afa89650f366c2e8a9ce8dce3784225497 Mon Sep 17 00:00:00 2001 From: Elena Lepilkina Date: Fri, 7 Aug 2020 11:36:31 +0300 Subject: [PATCH] Optimize vtable building [KT-40652] --- .../konan/descriptors/ClassLayoutBuilder.kt | 34 ++++++++++++------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassLayoutBuilder.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassLayoutBuilder.kt index f8fb6db6419..f3db758996a 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassLayoutBuilder.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassLayoutBuilder.kt @@ -286,6 +286,7 @@ internal class ClassLayoutBuilder(val irClass: IrClass, val context: Context, va val methods = irClass.sortedOverridableOrOverridingMethods val newVtableSlots = mutableListOf() + val overridenVtableSlots = mutableMapOf() DEBUG_OUTPUT(0) { println() @@ -300,19 +301,28 @@ internal class ClassLayoutBuilder(val irClass: IrClass, val context: Context, va println("BUILDING INHERITED vTable") } + val superVtableMap = superVtableEntries.groupBy { it.function } + methods.forEach { overridingMethod -> + overridingMethod.allOverriddenFunctions.forEach { + val superMethods = superVtableMap[it] + if (superMethods?.isNotEmpty() == true) { + newVtableSlots.add(OverriddenFunctionInfo(overridingMethod, it)) + superMethods.forEach { superMethod -> + overridenVtableSlots[superMethod.overriddenFunction] = + OverriddenFunctionInfo(overridingMethod, superMethod.overriddenFunction) + } + } + } + } val inheritedVtableSlots = superVtableEntries.map { superMethod -> - val overridingMethod = methods.singleOrNull { it.overrides(superMethod.function) } - if (overridingMethod == null) { - - DEBUG_OUTPUT(0) { println("Taking super ${superMethod.overriddenFunction.render()} -> ${superMethod.function.render()}") } - - superMethod - } else { - newVtableSlots.add(OverriddenFunctionInfo(overridingMethod, superMethod.function)) - - DEBUG_OUTPUT(0) { println("Taking overridden ${superMethod.overriddenFunction.render()} -> ${overridingMethod.render()}") } - - OverriddenFunctionInfo(overridingMethod, superMethod.overriddenFunction) + overridenVtableSlots[superMethod.overriddenFunction]?.also { + DEBUG_OUTPUT(0) { + println("Taking overridden ${superMethod.overriddenFunction.render()} -> ${it.function.render()}") + } + } ?: superMethod.also { + DEBUG_OUTPUT(0) { + println("Taking super ${superMethod.overriddenFunction.render()} -> ${superMethod.function.render()}") + } } }