diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassVtablesBuilder.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassVtablesBuilder.kt index ed0d18753fd..5a12fa3a266 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassVtablesBuilder.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassVtablesBuilder.kt @@ -20,6 +20,8 @@ import org.jetbrains.kotlin.backend.konan.* import org.jetbrains.kotlin.backend.konan.irasdescriptors.* import org.jetbrains.kotlin.backend.konan.llvm.functionName import org.jetbrains.kotlin.backend.konan.llvm.localHash +import org.jetbrains.kotlin.ir.declarations.IrClass +import org.jetbrains.kotlin.ir.util.simpleFunctions internal class OverriddenFunctionDescriptor( val descriptor: SimpleFunctionDescriptor, @@ -91,7 +93,7 @@ internal class ClassVtablesBuilder(val classDescriptor: ClassDescriptor, val con context.getVtableBuilder(superClass).vtableEntries } - val methods = classDescriptor.sortedContributedMethods + val methods = classDescriptor.sortedOverridableOrOverridingMethods val newVtableSlots = mutableListOf() val inheritedVtableSlots = superVtableEntries.map { superMethod -> @@ -125,7 +127,7 @@ internal class ClassVtablesBuilder(val classDescriptor: ClassDescriptor, val con } val methodTableEntries: List by lazy { - classDescriptor.sortedContributedMethods + classDescriptor.sortedOverridableOrOverridingMethods .flatMap { method -> method.allOverriddenDescriptors.map { OverriddenFunctionDescriptor(method, it) } } .filter { it.canBeCalledVirtually } .distinctBy { Triple(it.overriddenDescriptor.functionName, it.descriptor, it.needBridge) } @@ -134,3 +136,9 @@ internal class ClassVtablesBuilder(val classDescriptor: ClassDescriptor, val con } } + +private val IrClass.sortedOverridableOrOverridingMethods: List + get() = + this.simpleFunctions() + .filter { it.isOverridable || it.overriddenSymbols.isNotEmpty() } + .sortedBy { it.functionName.localHash.value } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/DescriptorUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/DescriptorUtils.kt index e85e0eab0bb..0a148dc945b 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/DescriptorUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/DescriptorUtils.kt @@ -122,14 +122,6 @@ internal val ClassDescriptor.isArray: Boolean internal val ClassDescriptor.isInterface: Boolean get() = (this.kind == ClassKind.INTERFACE) -internal val IrClass.sortedContributedMethods: List - get () = contributedMethods.sortedBy { - it.functionName.localHash.value - } - -internal val IrClass.contributedMethods: List - get () = this.simpleFunctions() - fun ClassDescriptor.isAbstract() = this.modality == Modality.SEALED || this.modality == Modality.ABSTRACT || this.kind == ClassKind.ENUM_CLASS