[Commonizer] Apply interner to avoid duplicated CirValueParameterImpl objects

This commit is contained in:
Dmitriy Dolovov
2020-02-18 13:33:59 +07:00
parent 5663dfb772
commit f2b940ffd4
2 changed files with 45 additions and 3 deletions
@@ -90,7 +90,7 @@ class CirClassConstructorImpl(original: ClassConstructorDescriptor) : CirClassCo
// save only type parameters that are contributed by the constructor itself // save only type parameters that are contributed by the constructor itself
typeParameter.takeIf { it.containingDeclaration == original }?.let(::CirTypeParameterImpl) typeParameter.takeIf { it.containingDeclaration == original }?.let(::CirTypeParameterImpl)
} }
override val valueParameters = original.valueParameters.map(::CirValueParameterImpl) override val valueParameters = original.valueParameters.map(CirValueParameterImpl.Companion::create)
override val hasStableParameterNames = original.hasStableParameterNames() override val hasStableParameterNames = original.hasStableParameterNames()
override val hasSynthesizedParameterNames = original.hasSynthesizedParameterNames() override val hasSynthesizedParameterNames = original.hasSynthesizedParameterNames()
} }
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir package org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.commonizer.utils.NonThreadSafeInterner
import org.jetbrains.kotlin.descriptors.commonizer.utils.intern import org.jetbrains.kotlin.descriptors.commonizer.utils.intern
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@@ -46,7 +47,7 @@ class CirFunctionImpl(original: SimpleFunctionDescriptor) : CirFunctionOrPropert
override val isInline = original.isInline override val isInline = original.isInline
override val isTailrec = original.isTailrec override val isTailrec = original.isTailrec
override val isSuspend = original.isSuspend override val isSuspend = original.isSuspend
override val valueParameters = original.valueParameters.map(::CirValueParameterImpl) override val valueParameters = original.valueParameters.map(CirValueParameterImpl.Companion::create)
override val hasStableParameterNames = original.hasStableParameterNames() override val hasStableParameterNames = original.hasStableParameterNames()
override val hasSynthesizedParameterNames = original.hasSynthesizedParameterNames() override val hasSynthesizedParameterNames = original.hasSynthesizedParameterNames()
} }
@@ -72,7 +73,7 @@ data class CirCommonValueParameter(
override val declaresDefaultValue get() = false override val declaresDefaultValue get() = false
} }
class CirValueParameterImpl(original: ValueParameterDescriptor) : CirValueParameter { class CirValueParameterImpl private constructor(original: ValueParameterDescriptor) : CirValueParameter {
override val name = original.name.intern() override val name = original.name.intern()
override val annotations = original.annotations.map(CirAnnotation.Companion::create) override val annotations = original.annotations.map(CirAnnotation.Companion::create)
override val returnType = CirType.create(original.returnType!!) override val returnType = CirType.create(original.returnType!!)
@@ -80,4 +81,45 @@ class CirValueParameterImpl(original: ValueParameterDescriptor) : CirValueParame
override val declaresDefaultValue = original.declaresDefaultValue() override val declaresDefaultValue = original.declaresDefaultValue()
override val isCrossinline = original.isCrossinline override val isCrossinline = original.isCrossinline
override val isNoinline = original.isNoinline override val isNoinline = original.isNoinline
// See also org.jetbrains.kotlin.types.KotlinType.cachedHashCode
private var cachedHashCode = 0
private fun computeHashCode(): Int {
var result = name.hashCode()
result += 31 * result + annotations.hashCode()
result += 31 * result + returnType.hashCode()
result += 31 * result + varargElementType.hashCode()
result += 31 * result + declaresDefaultValue.hashCode()
result += 31 * result + isCrossinline.hashCode()
result += 31 * result + isNoinline.hashCode()
return result
}
override fun hashCode(): Int {
var currentHashCode = cachedHashCode
if (currentHashCode != 0) return currentHashCode
currentHashCode = computeHashCode()
cachedHashCode = currentHashCode
return currentHashCode
}
override fun equals(other: Any?): Boolean =
if (other is CirValueParameterImpl) {
name == other.name
&& returnType == other.returnType
&& annotations == other.annotations
&& varargElementType == other.varargElementType
&& declaresDefaultValue == other.declaresDefaultValue
&& isCrossinline == other.isCrossinline
&& isNoinline == other.isNoinline
} else
false
companion object {
private val interner = NonThreadSafeInterner<CirValueParameterImpl>()
fun create(original: ValueParameterDescriptor): CirValueParameterImpl = interner.intern(CirValueParameterImpl(original))
}
} }