[Commonizer] Intern duplicated CirFunctionModifiers instances

This commit is contained in:
Dmitriy Dolovov
2020-06-19 16:00:42 +07:00
parent 68e1acd2cb
commit 63d549dfa1
7 changed files with 116 additions and 42 deletions
@@ -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
}
@@ -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),
)
}
@@ -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<CirFunctionModifiers>()
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
)
)
}
}
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.descriptors.commonizer.utils.intern
import org.jetbrains.kotlin.name.Name
object CirValueParameterFactory {
private val interner = Interner<CirValueParameterImpl>()
private val interner = Interner<CirValueParameter>()
fun create(source: ValueParameterDescriptor): CirValueParameter = create(
annotations = source.annotations.map(CirAnnotationFactory::create),
@@ -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
@@ -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<CirFunctionModifiers, CirFunctionModifiers> {
private var modifiers: CirFunctionModifiers? = null
private var error = false
class FunctionModifiersCommonizer : AbstractStandardCommonizer<CirFunctionModifiers, CirFunctionModifiers>() {
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
}
}
@@ -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<CirFunctionModifiers, CirFunctionModifiers>() {
@@ -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,