From 47d091702b17f9ea39840ad58b33e4c28894a19c Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Sun, 16 Feb 2020 20:25:48 +0700 Subject: [PATCH] [Commonizer] Apply interner to avoid duplicated FqName objects --- .../commonizer/mergedtree/ir/CirAnnotation.kt | 3 ++- .../descriptors/commonizer/mergedtree/ir/CirClass.kt | 3 ++- .../descriptors/commonizer/mergedtree/ir/CirType.kt | 5 +++-- .../commonizer/mergedtree/ir/nodeBuilders.kt | 5 +++-- .../descriptors/commonizer/mergedtree/modules.kt | 2 +- .../utils/{Interner.kt => NonThreadSafeInterner.kt} | 2 +- .../kotlin/descriptors/commonizer/utils/type.kt | 12 ++++++++---- .../commonizer/utils/ComparingDeclarationsVisitor.kt | 4 ++-- 8 files changed, 22 insertions(+), 14 deletions(-) rename native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/{Interner.kt => NonThreadSafeInterner.kt} (89%) diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirAnnotation.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirAnnotation.kt index 80bb9079a08..4bd09de5aa6 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirAnnotation.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirAnnotation.kt @@ -6,12 +6,13 @@ package org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor +import org.jetbrains.kotlin.descriptors.commonizer.utils.intern import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.constants.* class CirAnnotation(original: AnnotationDescriptor) { - val fqName: FqName = original.fqName ?: error("Annotation with no FQ name: ${original::class.java}, $original") + val fqName: FqName = original.fqName?.intern() ?: error("Annotation with no FQ name: ${original::class.java}, $original") val allValueArguments: Map> = original.allValueArguments init { diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirClass.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirClass.kt index 5dde6ee026b..71d3a8aa1ac 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirClass.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirClass.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.commonizer.utils.intern import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe @@ -65,7 +66,7 @@ class CirClassImpl(original: ClassDescriptor) : CirClass { override val annotations = original.annotations.map(::CirAnnotation) override val name = original.name override val typeParameters = original.declaredTypeParameters.map(::CirTypeParameterImpl) - override val companion = original.companionObjectDescriptor?.fqNameSafe + override val companion = original.companionObjectDescriptor?.fqNameSafe?.intern() override val kind = original.kind override val modality = original.modality override val visibility = original.visibility diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirType.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirType.kt index 8963ef9633f..f796295e694 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirType.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirType.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirSimpleTypeKi import org.jetbrains.kotlin.descriptors.commonizer.utils.declarationDescriptor import org.jetbrains.kotlin.descriptors.commonizer.utils.fqName import org.jetbrains.kotlin.descriptors.commonizer.utils.fqNameWithTypeParameters +import org.jetbrains.kotlin.descriptors.commonizer.utils.intern import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.types.* @@ -52,7 +53,7 @@ class CirSimpleType(original: SimpleType) : CirType() { annotations = abbreviation.annotations.map(::CirAnnotation) kind = CirSimpleTypeKind.determineKind(abbreviation.declarationDescriptor) - fqName = abbreviation.fqName + fqName = abbreviation.fqNameInterned arguments = abbreviation.arguments.map(::CirTypeProjection) isMarkedNullable = abbreviation.isMarkedNullable isDefinitelyNotNullType = abbreviation.isDefinitelyNotNullType @@ -85,7 +86,7 @@ enum class CirSimpleTypeKind { } data class CirTypeConstructorId(val fqName: FqName, val numberOfTypeParameters: Int) { - constructor(type: SimpleType) : this(type.fqName, type.constructor.parameters.size) + constructor(type: SimpleType) : this(type.fqNameInterned, type.constructor.parameters.size) } class CirTypeProjection(original: TypeProjection) { diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/nodeBuilders.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/nodeBuilders.kt index 6ecb41aad4a..cd6d825d851 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/nodeBuilders.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/nodeBuilders.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.descriptors.commonizer.core.* import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirRootNode.ClassifiersCacheImpl import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroup import org.jetbrains.kotlin.descriptors.commonizer.utils.firstNonNull +import org.jetbrains.kotlin.descriptors.commonizer.utils.intern import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe @@ -100,7 +101,7 @@ internal fun buildClassNode( recursionMarker = CirClassRecursionMarker, nodeProducer = ::CirClassNode ).also { node -> - classes.firstNonNull().fqNameSafe.let { fqName -> + classes.firstNonNull().fqNameSafe.intern().let { fqName -> node.fqName = fqName cacheRW.classes.putSafe(fqName, node) } @@ -132,7 +133,7 @@ internal fun buildTypeAliasNode( recursionMarker = CirClassRecursionMarker, nodeProducer = ::CirTypeAliasNode ).also { node -> - typeAliases.firstNonNull().fqNameSafe.let { fqName -> + typeAliases.firstNonNull().fqNameSafe.intern().let { fqName -> node.fqName = fqName cacheRW.typeAliases.putSafe(fqName, node) } diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/modules.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/modules.kt index 202647352af..b7090a5cc42 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/modules.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/modules.kt @@ -28,7 +28,7 @@ internal fun mergeModules( modules.forEachIndexed { index, module -> module?.collectNonEmptyPackageMemberScopes { packageFqName, memberScope -> - packageMemberScopesMap[packageFqName][index] = memberScope + packageMemberScopesMap[packageFqName.intern()][index] = memberScope } } diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/Interner.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/NonThreadSafeInterner.kt similarity index 89% rename from native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/Interner.kt rename to native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/NonThreadSafeInterner.kt index 127193bc19d..111a7a81fe0 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/Interner.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/NonThreadSafeInterner.kt @@ -7,7 +7,7 @@ package org.jetbrains.kotlin.descriptors.commonizer.utils import java.util.WeakHashMap -internal class Interner { +internal class NonThreadSafeInterner { private val pool = WeakHashMap() fun intern(value: T): T = pool.computeIfAbsent(value) { value } diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/type.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/type.kt index 759a6ff56ea..264dece1e16 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/type.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/type.kt @@ -17,8 +17,10 @@ import kotlin.collections.HashSet internal inline val KotlinType.declarationDescriptor: ClassifierDescriptor get() = (constructor.declarationDescriptor ?: error("No declaration descriptor found for $constructor")) -internal inline val KotlinType.fqName: FqName - get() = declarationDescriptor.fqNameSafe +internal inline val KotlinType.fqNameInterned: FqName + get() = declarationDescriptor.fqNameSafe.intern() + +internal fun FqName.intern(): FqName = fqNameInterner.intern(this) internal val KotlinType.fqNameWithTypeParameters: String get() { @@ -27,7 +29,7 @@ internal val KotlinType.fqNameWithTypeParameters: String } private fun StringBuilder.buildFqNameWithTypeParameters(type: KotlinType, exploredTypeParameters: MutableSet) { - append(type.fqName) + append(type.fqNameInterned) val typeParameterDescriptor = TypeUtils.getTypeParameterDescriptorOrNull(type) if (typeParameterDescriptor != null) { @@ -70,4 +72,6 @@ private fun StringBuilder.buildFqNameWithTypeParameters(type: KotlinType, explor } // dedicated to hold unique entries of "fqNameWithTypeParameters" -private val stringInterner = Interner() +private val stringInterner = NonThreadSafeInterner() + +private val fqNameInterner = NonThreadSafeInterner() diff --git a/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/utils/ComparingDeclarationsVisitor.kt b/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/utils/ComparingDeclarationsVisitor.kt index cf3e98153a8..50d579f6e27 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/utils/ComparingDeclarationsVisitor.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/utils/ComparingDeclarationsVisitor.kt @@ -426,8 +426,8 @@ internal class ComparingDeclarationsVisitor( context.nextLevel("Unwrapped/unabbreviated type annotations") ) - val expectedFqName = expectedUnwrapped.fqName - val actualFqName = actualUnwrapped.fqName + val expectedFqName = expectedUnwrapped.fqNameInterned + val actualFqName = actualUnwrapped.fqNameInterned context.assertEquals(expectedFqName, actualFqName, "type FQN")