Only sort contributed methods for vtable generation.
This commit is contained in:
committed by
alexander-gorshenev
parent
7d111c4d31
commit
5368eb0f2f
+3
-3
@@ -81,7 +81,7 @@ internal class ClassVtablesBuilder(val classDescriptor: ClassDescriptor, val con
|
|||||||
context.getVtableBuilder(classDescriptor.getSuperClassOrAny()).vtableEntries
|
context.getVtableBuilder(classDescriptor.getSuperClassOrAny()).vtableEntries
|
||||||
}
|
}
|
||||||
|
|
||||||
val methods = classDescriptor.contributedMethods
|
val methods = classDescriptor.sortedContributedMethods
|
||||||
val newVtableSlots = mutableListOf<OverriddenFunctionDescriptor>()
|
val newVtableSlots = mutableListOf<OverriddenFunctionDescriptor>()
|
||||||
|
|
||||||
val inheritedVtableSlots = superVtableEntries.map { superMethod ->
|
val inheritedVtableSlots = superVtableEntries.map { superMethod ->
|
||||||
@@ -117,7 +117,7 @@ internal class ClassVtablesBuilder(val classDescriptor: ClassDescriptor, val con
|
|||||||
val methodTableEntries: List<OverriddenFunctionDescriptor> by lazy {
|
val methodTableEntries: List<OverriddenFunctionDescriptor> by lazy {
|
||||||
assert(!classDescriptor.isAbstract())
|
assert(!classDescriptor.isAbstract())
|
||||||
|
|
||||||
classDescriptor.contributedMethods
|
classDescriptor.sortedContributedMethods
|
||||||
.flatMap { method -> method.allOverriddenDescriptors.map { OverriddenFunctionDescriptor(method, it) } }
|
.flatMap { method -> method.allOverriddenDescriptors.map { OverriddenFunctionDescriptor(method, it) } }
|
||||||
.filter { it.canBeCalledVirtually }
|
.filter { it.canBeCalledVirtually }
|
||||||
.distinctBy { Triple(it.overriddenDescriptor.functionName, it.descriptor, it.needBridge) }
|
.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
|
// TODO: probably method table should contain all accessible methods to improve binary compatibility
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-6
@@ -172,9 +172,17 @@ internal val <T : CallableMemberDescriptor> T.allOverriddenDescriptors: List<T>
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal val ClassDescriptor.sortedContributedMethods: List<FunctionDescriptor>
|
||||||
|
get () = unsubstitutedMemberScope.sortedContributedMethods
|
||||||
|
|
||||||
internal val ClassDescriptor.contributedMethods: List<FunctionDescriptor>
|
internal val ClassDescriptor.contributedMethods: List<FunctionDescriptor>
|
||||||
get () = unsubstitutedMemberScope.contributedMethods
|
get () = unsubstitutedMemberScope.contributedMethods
|
||||||
|
|
||||||
|
internal val MemberScope.sortedContributedMethods: List<FunctionDescriptor>
|
||||||
|
get () = contributedMethods.sortedBy {
|
||||||
|
it.functionName.localHash.value
|
||||||
|
}
|
||||||
|
|
||||||
internal val MemberScope.contributedMethods: List<FunctionDescriptor>
|
internal val MemberScope.contributedMethods: List<FunctionDescriptor>
|
||||||
get () {
|
get () {
|
||||||
val contributedDescriptors = this.getContributedDescriptors()
|
val contributedDescriptors = this.getContributedDescriptors()
|
||||||
@@ -185,14 +193,9 @@ internal val MemberScope.contributedMethods: List<FunctionDescriptor>
|
|||||||
val getters = properties.mapNotNull { it.getter }
|
val getters = properties.mapNotNull { it.getter }
|
||||||
val setters = properties.mapNotNull { it.setter }
|
val setters = properties.mapNotNull { it.setter }
|
||||||
|
|
||||||
val allMethods = (functions + getters + setters).sortedBy {
|
return functions + getters + setters
|
||||||
it.functionName.localHash.value
|
|
||||||
}
|
|
||||||
|
|
||||||
return allMethods
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun ClassDescriptor.isAbstract() = this.modality == Modality.SEALED || this.modality == Modality.ABSTRACT
|
fun ClassDescriptor.isAbstract() = this.modality == Modality.SEALED || this.modality == Modality.ABSTRACT
|
||||||
|| this.kind == ClassKind.ENUM_CLASS
|
|| this.kind == ClassKind.ENUM_CLASS
|
||||||
|
|
||||||
|
|||||||
-11
@@ -22,23 +22,14 @@ import org.jetbrains.kotlin.backend.common.lower.SimpleMemberScope
|
|||||||
import org.jetbrains.kotlin.backend.common.runOnFilePostfix
|
import org.jetbrains.kotlin.backend.common.runOnFilePostfix
|
||||||
import org.jetbrains.kotlin.backend.jvm.descriptors.createValueParameter
|
import org.jetbrains.kotlin.backend.jvm.descriptors.createValueParameter
|
||||||
import org.jetbrains.kotlin.backend.konan.Context
|
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.getKonanInternalFunctions
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.konanInternal
|
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.synthesizedName
|
import org.jetbrains.kotlin.backend.konan.descriptors.synthesizedName
|
||||||
import org.jetbrains.kotlin.backend.konan.ir.createArrayOfExpression
|
import org.jetbrains.kotlin.backend.konan.ir.createArrayOfExpression
|
||||||
import org.jetbrains.kotlin.backend.konan.ir.createSimpleDelegatingConstructor
|
import org.jetbrains.kotlin.backend.konan.ir.createSimpleDelegatingConstructor
|
||||||
import org.jetbrains.kotlin.backend.konan.ir.createSimpleDelegatingConstructorDescriptor
|
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.*
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
|
||||||
import org.jetbrains.kotlin.descriptors.impl.ClassConstructorDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.ClassConstructorDescriptorImpl
|
||||||
import org.jetbrains.kotlin.descriptors.impl.ClassDescriptorImpl
|
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.incremental.components.NoLookupLocation
|
||||||
import org.jetbrains.kotlin.ir.IrStatement
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
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.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
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.TypeProjectionImpl
|
||||||
import org.jetbrains.kotlin.types.TypeSubstitutor
|
import org.jetbrains.kotlin.types.TypeSubstitutor
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user