From 5368eb0f2f0b1ed49b360949026657012143dbe6 Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Thu, 20 Apr 2017 17:29:15 +0300 Subject: [PATCH] Only sort contributed methods for vtable generation. --- .../konan/descriptors/ClassVtablesBuilder.kt | 6 +++--- .../backend/konan/descriptors/DescriptorUtils.kt | 15 +++++++++------ .../backend/konan/lower/EnumClassLowering.kt | 11 ----------- 3 files changed, 12 insertions(+), 20 deletions(-) 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 bbb926db427..b37c24fb8f0 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 @@ -81,7 +81,7 @@ internal class ClassVtablesBuilder(val classDescriptor: ClassDescriptor, val con context.getVtableBuilder(classDescriptor.getSuperClassOrAny()).vtableEntries } - val methods = classDescriptor.contributedMethods + val methods = classDescriptor.sortedContributedMethods val newVtableSlots = mutableListOf() val inheritedVtableSlots = superVtableEntries.map { superMethod -> @@ -117,7 +117,7 @@ internal class ClassVtablesBuilder(val classDescriptor: ClassDescriptor, val con val methodTableEntries: List by lazy { assert(!classDescriptor.isAbstract()) - classDescriptor.contributedMethods + classDescriptor.sortedContributedMethods .flatMap { method -> method.allOverriddenDescriptors.map { OverriddenFunctionDescriptor(method, it) } } .filter { it.canBeCalledVirtually } .distinctBy { Triple(it.overriddenDescriptor.functionName, it.descriptor, it.needBridge) } @@ -125,4 +125,4 @@ internal class ClassVtablesBuilder(val classDescriptor: ClassDescriptor, val con // TODO: probably method table should contain all accessible methods to improve binary compatibility } -} \ No newline at end of file +} 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 1367ff44129..baf0cea2ca0 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 @@ -172,9 +172,17 @@ internal val T.allOverriddenDescriptors: List return result } +internal val ClassDescriptor.sortedContributedMethods: List + get () = unsubstitutedMemberScope.sortedContributedMethods + internal val ClassDescriptor.contributedMethods: List get () = unsubstitutedMemberScope.contributedMethods +internal val MemberScope.sortedContributedMethods: List + get () = contributedMethods.sortedBy { + it.functionName.localHash.value + } + internal val MemberScope.contributedMethods: List get () { val contributedDescriptors = this.getContributedDescriptors() @@ -185,14 +193,9 @@ internal val MemberScope.contributedMethods: List val getters = properties.mapNotNull { it.getter } val setters = properties.mapNotNull { it.setter } - val allMethods = (functions + getters + setters).sortedBy { - it.functionName.localHash.value - } - - return allMethods + return functions + getters + setters } - fun ClassDescriptor.isAbstract() = this.modality == Modality.SEALED || this.modality == Modality.ABSTRACT || this.kind == ClassKind.ENUM_CLASS diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt index 233f30886fd..b093c7142dd 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt @@ -22,23 +22,14 @@ import org.jetbrains.kotlin.backend.common.lower.SimpleMemberScope import org.jetbrains.kotlin.backend.common.runOnFilePostfix import org.jetbrains.kotlin.backend.jvm.descriptors.createValueParameter import org.jetbrains.kotlin.backend.konan.Context -import org.jetbrains.kotlin.backend.konan.KonanBuiltIns -import org.jetbrains.kotlin.backend.konan.LoweredEnum -import org.jetbrains.kotlin.backend.konan.descriptors.contributedMethods import org.jetbrains.kotlin.backend.konan.descriptors.getKonanInternalFunctions -import org.jetbrains.kotlin.backend.konan.descriptors.konanInternal import org.jetbrains.kotlin.backend.konan.descriptors.synthesizedName import org.jetbrains.kotlin.backend.konan.ir.createArrayOfExpression import org.jetbrains.kotlin.backend.konan.ir.createSimpleDelegatingConstructor import org.jetbrains.kotlin.backend.konan.ir.createSimpleDelegatingConstructorDescriptor -import org.jetbrains.kotlin.backend.konan.llvm.functionName import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.impl.ClassConstructorDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ClassDescriptorImpl -import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl -import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl -import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.declarations.* @@ -53,8 +44,6 @@ import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.descriptorUtil.module -import org.jetbrains.kotlin.resolve.scopes.MemberScope -import org.jetbrains.kotlin.script.getFileContents import org.jetbrains.kotlin.types.TypeProjectionImpl import org.jetbrains.kotlin.types.TypeSubstitutor