From 6e93006a9424a0319db76003a8f642b8deddc167 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 26 Aug 2021 19:46:01 +0200 Subject: [PATCH] JVM IR: slightly optimize keepTrackOfOverridesForPossiblyClashingFakeOverride Collecting all outer classes into a hash set and looking up classifiers in that set for each type of each fake override is noticeably slow. Instead, check that function types reference any type parameter whose container is a class; if the function is not local, it means such type parameter belongs to one of the outer classes. #KT-42020 --- .../serialization/JvmIdSignatureDescriptor.kt | 35 +++++-------------- 1 file changed, 9 insertions(+), 26 deletions(-) diff --git a/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/backend/jvm/serialization/JvmIdSignatureDescriptor.kt b/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/backend/jvm/serialization/JvmIdSignatureDescriptor.kt index eba778208aa..04c7f1ff2e7 100644 --- a/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/backend/jvm/serialization/JvmIdSignatureDescriptor.kt +++ b/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/backend/jvm/serialization/JvmIdSignatureDescriptor.kt @@ -15,13 +15,13 @@ import org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaPackageFragment import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe import org.jetbrains.kotlin.resolve.descriptorUtil.overriddenTreeAsSequence import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor -import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.typeUtil.contains import org.jetbrains.kotlin.utils.addToStdlib.cast class JvmIdSignatureDescriptor(private val mangler: KotlinMangler.DescriptorMangler) : IdSignatureDescriptor(mangler) { - private inner class JvmDescriptorBasedSignatureBuilder(mangler: KotlinMangler.DescriptorMangler, type: SpecialDeclarationType) : DescriptorBasedSignatureBuilder(mangler, type) { + private inner class JvmDescriptorBasedSignatureBuilder(mangler: KotlinMangler.DescriptorMangler, type: SpecialDeclarationType) : + DescriptorBasedSignatureBuilder(mangler, type) { override fun platformSpecificFunction(descriptor: FunctionDescriptor) { keepTrackOfOverridesForPossiblyClashingFakeOverride(descriptor) } @@ -78,34 +78,17 @@ class JvmIdSignatureDescriptor(private val mangler: KotlinMangler.DescriptorMang } } - private fun isCapturingTypeParameter(member: CallableMemberDescriptor): Boolean { - val containingClasses = collectContainingClasses(member) - return member.extensionReceiverParameter?.isCapturingTypeParameter(containingClasses) == true || - member.valueParameters.any { it.isCapturingTypeParameter(containingClasses) } - } + private fun isCapturingTypeParameter(member: CallableMemberDescriptor): Boolean = + member.extensionReceiverParameter?.isCapturingTypeParameter() == true || + member.valueParameters.any { it.isCapturingTypeParameter() } - private fun collectContainingClasses(member: CallableMemberDescriptor): Set { - val result = HashSet() - var pointer: DeclarationDescriptor = member - while (true) { - val containingClass = pointer.containingDeclaration as? ClassDescriptor ?: break - result.add(containingClass) - if (!containingClass.isInner) break - pointer = containingClass - } - return result - } - - private fun ParameterDescriptor.isCapturingTypeParameter(containingClasses: Set): Boolean = - type.containsTypeParametersOf(containingClasses) - - private fun KotlinType.containsTypeParametersOf(containingClasses: Set): Boolean = - contains { + private fun ParameterDescriptor.isCapturingTypeParameter(): Boolean = + type.contains { val descriptor = it.constructor.declarationDescriptor - descriptor is TypeParameterDescriptor && descriptor.containingDeclaration in containingClasses + descriptor is TypeParameterDescriptor && descriptor.containingDeclaration is ClassDescriptor } } override fun createSignatureBuilder(type: SpecialDeclarationType): DescriptorBasedSignatureBuilder = JvmDescriptorBasedSignatureBuilder(mangler, type) -} \ No newline at end of file +}