From 63d549dfa156eb307f47b0787b1c66a81a57b835 Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Fri, 19 Jun 2020 16:00:42 +0700 Subject: [PATCH] [Commonizer] Intern duplicated CirFunctionModifiers instances --- .../commonizer/cir/CirFunctionModifiers.kt | 17 +++-- .../cir/factory/CirFunctionFactory.kt | 10 +-- .../factory/CirFunctionModifiersFactory.kt | 44 +++++++++++++ .../cir/factory/CirValueParameterFactory.kt | 2 +- .../cir/impl/CirFunctionModifiersImpl.kt | 17 +++++ .../core/FunctionModifiersCommonizer.kt | 65 ++++++++++++------- .../core/FunctionModifiersCommonizerTest.kt | 3 +- 7 files changed, 116 insertions(+), 42 deletions(-) create mode 100644 native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirFunctionModifiersFactory.kt create mode 100644 native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/CirFunctionModifiersImpl.kt diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirFunctionModifiers.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirFunctionModifiers.kt index 09dfffcf067..5770a5c5451 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirFunctionModifiers.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirFunctionModifiers.kt @@ -5,12 +5,11 @@ package org.jetbrains.kotlin.descriptors.commonizer.cir -// TODO: inline? -data class CirFunctionModifiers( - var isOperator: Boolean, - var isInfix: Boolean, - var isInline: Boolean, - var isTailrec: Boolean, - var isSuspend: Boolean, - var isExternal: Boolean -) +interface CirFunctionModifiers { + val isOperator: Boolean + val isInfix: Boolean + val isInline: Boolean + val isTailrec: Boolean + val isSuspend: Boolean + val isExternal: Boolean +} diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirFunctionFactory.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirFunctionFactory.kt index db84429cdb0..335bd9e68bc 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirFunctionFactory.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirFunctionFactory.kt @@ -35,15 +35,7 @@ object CirFunctionFactory { extensionReceiver = source.extensionReceiverParameter?.let(CirExtensionReceiverFactory::create), returnType = CirTypeFactory.create(source.returnType!!), kind = source.kind, - // TODO: inline? - modifiers = CirFunctionModifiers( - isOperator = source.isOperator, - isInfix = source.isInfix, - isInline = source.isInline, - isTailrec = source.isTailrec, - isSuspend = source.isSuspend, - isExternal = source.isExternal - ) + modifiers = CirFunctionModifiersFactory.create(source), ) } diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirFunctionModifiersFactory.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirFunctionModifiersFactory.kt new file mode 100644 index 00000000000..af25846e8a2 --- /dev/null +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirFunctionModifiersFactory.kt @@ -0,0 +1,44 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.descriptors.commonizer.cir.factory + +import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor +import org.jetbrains.kotlin.descriptors.commonizer.cir.CirFunctionModifiers +import org.jetbrains.kotlin.descriptors.commonizer.cir.impl.CirFunctionModifiersImpl +import org.jetbrains.kotlin.descriptors.commonizer.utils.Interner + +object CirFunctionModifiersFactory { + private val interner = Interner() + + fun create(source: SimpleFunctionDescriptor): CirFunctionModifiers = create( + isOperator = source.isOperator, + isInfix = source.isInfix, + isInline = source.isInline, + isTailrec = source.isTailrec, + isSuspend = source.isSuspend, + isExternal = source.isExternal + ) + + fun create( + isOperator: Boolean, + isInfix: Boolean, + isInline: Boolean, + isTailrec: Boolean, + isSuspend: Boolean, + isExternal: Boolean + ): CirFunctionModifiers { + return interner.intern( + CirFunctionModifiersImpl( + isOperator = isOperator, + isInfix = isInfix, + isInline = isInline, + isTailrec = isTailrec, + isSuspend = isSuspend, + isExternal = isExternal + ) + ) + } +} diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirValueParameterFactory.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirValueParameterFactory.kt index b3a8835ff7b..11204f98c21 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirValueParameterFactory.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirValueParameterFactory.kt @@ -15,7 +15,7 @@ import org.jetbrains.kotlin.descriptors.commonizer.utils.intern import org.jetbrains.kotlin.name.Name object CirValueParameterFactory { - private val interner = Interner() + private val interner = Interner() fun create(source: ValueParameterDescriptor): CirValueParameter = create( annotations = source.annotations.map(CirAnnotationFactory::create), diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/CirFunctionModifiersImpl.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/CirFunctionModifiersImpl.kt new file mode 100644 index 00000000000..1cbe788b07f --- /dev/null +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/CirFunctionModifiersImpl.kt @@ -0,0 +1,17 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.descriptors.commonizer.cir.impl + +import org.jetbrains.kotlin.descriptors.commonizer.cir.CirFunctionModifiers + +data class CirFunctionModifiersImpl( + override val isOperator: Boolean, + override val isInfix: Boolean, + override val isInline: Boolean, + override val isTailrec: Boolean, + override val isSuspend: Boolean, + override val isExternal: Boolean +) : CirFunctionModifiers diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/FunctionModifiersCommonizer.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/FunctionModifiersCommonizer.kt index 11e065f0323..ed48e9f9a78 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/FunctionModifiersCommonizer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/FunctionModifiersCommonizer.kt @@ -6,33 +6,54 @@ package org.jetbrains.kotlin.descriptors.commonizer.core import org.jetbrains.kotlin.descriptors.commonizer.cir.CirFunctionModifiers +import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirFunctionModifiersFactory -class FunctionModifiersCommonizer : Commonizer { - private var modifiers: CirFunctionModifiers? = null - private var error = false +class FunctionModifiersCommonizer : AbstractStandardCommonizer() { + private class MutableModifiers( + var isOperator: Boolean, + var isInfix: Boolean, + var isInline: Boolean, + var isTailrec: Boolean, + var isSuspend: Boolean, + var isExternal: Boolean + ) { + constructor(immutable: CirFunctionModifiers) : this( + isOperator = immutable.isOperator, + isInfix = immutable.isInfix, + isInline = immutable.isInline, + isTailrec = immutable.isTailrec, + isSuspend = immutable.isSuspend, + isExternal = immutable.isExternal + ) - override val result: CirFunctionModifiers - get() = modifiers?.takeIf { !error } ?: throw IllegalCommonizerStateException() + fun toImmutableModifiers(): CirFunctionModifiers = CirFunctionModifiersFactory.create( + isOperator = isOperator, + isInfix = isInfix, + isInline = isInline, + isTailrec = isTailrec, + isSuspend = isSuspend, + isExternal = isExternal + ) + } - override fun commonizeWith(next: CirFunctionModifiers): Boolean { - if (error) + private lateinit var modifiers: MutableModifiers + + override fun commonizationResult() = modifiers.toImmutableModifiers() + + override fun initialize(first: CirFunctionModifiers) { + modifiers = MutableModifiers(first) + } + + override fun doCommonizeWith(next: CirFunctionModifiers): Boolean { + if (modifiers.isSuspend != next.isSuspend) return false - val modifiers = modifiers - if (modifiers == null) - this.modifiers = next.copy() // TODO: inline? - else { - if (modifiers.isSuspend != next.isSuspend) - error = true - else { - modifiers.isOperator = modifiers.isOperator && next.isOperator - modifiers.isInfix = modifiers.isInfix && next.isInfix - modifiers.isInline = modifiers.isInline && next.isInline - modifiers.isTailrec = modifiers.isTailrec && next.isTailrec - modifiers.isExternal = modifiers.isExternal && next.isExternal - } - } + modifiers.isOperator = modifiers.isOperator && next.isOperator + modifiers.isInfix = modifiers.isInfix && next.isInfix + modifiers.isInline = modifiers.isInline && next.isInline + modifiers.isTailrec = modifiers.isTailrec && next.isTailrec + modifiers.isExternal = modifiers.isExternal && next.isExternal - return !error + return true } } diff --git a/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/FunctionModifiersCommonizerTest.kt b/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/FunctionModifiersCommonizerTest.kt index c4653376ef0..b78433b3f90 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/FunctionModifiersCommonizerTest.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/FunctionModifiersCommonizerTest.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.descriptors.commonizer.core import org.jetbrains.kotlin.descriptors.commonizer.cir.CirFunctionModifiers +import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirFunctionModifiersFactory import org.junit.Test class FunctionModifiersCommonizerTest : AbstractCommonizerTest() { @@ -170,7 +171,7 @@ private fun mockFunctionModifiers( isTailrec: Boolean = false, isSuspend: Boolean = false, isExternal: Boolean = false -) = CirFunctionModifiers( +) = CirFunctionModifiersFactory.create( isOperator = isOperator, isInfix = isInfix, isInline = isInline,