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()}") + } } }