[IR] Avoid extra lists creation during getting explicit/all parameters (#3769)

This commit is contained in:
LepilkinaElena
2020-10-01 21:19:40 +03:00
committed by GitHub
parent 6d7744a921
commit dc2845df10
3 changed files with 29 additions and 9 deletions
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.descriptors.DescriptorVisibility import org.jetbrains.kotlin.descriptors.DescriptorVisibility
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.builders.Scope import org.jetbrains.kotlin.ir.builders.Scope
@@ -432,14 +431,20 @@ fun IrFunction.createDispatchReceiverParameter(origin: IrDeclarationOrigin? = nu
val IrFunction.allParameters: List<IrValueParameter> val IrFunction.allParameters: List<IrValueParameter>
get() = if (this is IrConstructor) { get() = if (this is IrConstructor) {
listOf( ArrayList<IrValueParameter>(allParametersCount).also {
this.constructedClass.thisReceiver it.add(
?: error(this.render()) this.constructedClass.thisReceiver
) + explicitParameters ?: error(this.render())
)
addExplicitParametersTo(it)
}
} else { } else {
explicitParameters explicitParameters
} }
val IrFunction.allParametersCount: Int
get() = if (this is IrConstructor) explicitParametersCount + 1 else explicitParametersCount
private object FakeOverrideBuilder : FakeOverrideBuilderStrategy() { private object FakeOverrideBuilder : FakeOverrideBuilderStrategy() {
override fun linkFakeOverride(fakeOverride: IrOverridableMember) { override fun linkFakeOverride(fakeOverride: IrOverridableMember) {
when (fakeOverride) { when (fakeOverride) {
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.backend.jvm.codegen package org.jetbrains.kotlin.backend.jvm.codegen
import org.jetbrains.kotlin.backend.common.ir.allParameters import org.jetbrains.kotlin.backend.common.ir.allParametersCount
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
import org.jetbrains.kotlin.backend.jvm.intrinsics.SignatureString import org.jetbrains.kotlin.backend.jvm.intrinsics.SignatureString
import org.jetbrains.kotlin.backend.jvm.lower.FunctionReferenceLowering import org.jetbrains.kotlin.backend.jvm.lower.FunctionReferenceLowering
@@ -64,7 +64,7 @@ class IrInlineIntrinsicsSupport(
// thus cannot have a backing field, and is required to have a getter. // thus cannot have a backing field, and is required to have a getter.
val getter = property.getter val getter = property.getter
?: error("Property without getter: ${property.render()}") ?: error("Property without getter: ${property.render()}")
val arity = getter.allParameters.size val arity = getter.allParametersCount
val implClass = (if (property.isVar) MUTABLE_PROPERTY_REFERENCE_IMPL else PROPERTY_REFERENCE_IMPL).getOrNull(arity) val implClass = (if (property.isVar) MUTABLE_PROPERTY_REFERENCE_IMPL else PROPERTY_REFERENCE_IMPL).getOrNull(arity)
?: error("No property reference impl class with arity $arity (${property.render()}") ?: error("No property reference impl class with arity $arity (${property.render()}")
@@ -77,7 +77,7 @@ class IrInlineIntrinsicsSupport(
v.anew(implClass) v.anew(implClass)
v.dup() v.dup()
if (withArity) { if (withArity) {
v.aconst(function.allParameters.size) v.aconst(function.allParametersCount)
} }
putClassInstance(v, FunctionReferenceLowering.getOwnerKClassType(declaration.parent, context)) putClassInstance(v, FunctionReferenceLowering.getOwnerKClassType(declaration.parent, context))
v.aconst(declaration.name.asString()) v.aconst(declaration.name.asString())
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.utils.DFS import org.jetbrains.kotlin.utils.DFS
import org.jetbrains.kotlin.utils.addIfNotNull
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
/** /**
@@ -199,8 +200,22 @@ val IrClass.primaryConstructor: IrConstructor?
val IrDeclarationContainer.properties: Sequence<IrProperty> val IrDeclarationContainer.properties: Sequence<IrProperty>
get() = declarations.asSequence().filterIsInstance<IrProperty>() get() = declarations.asSequence().filterIsInstance<IrProperty>()
fun IrFunction.addExplicitParametersTo(parametersList: MutableList<IrValueParameter>) {
parametersList.addIfNotNull(dispatchReceiverParameter)
parametersList.addIfNotNull(extensionReceiverParameter)
parametersList.addAll(valueParameters)
}
private fun Boolean.toInt(): Int = if (this) 1 else 0
val IrFunction.explicitParametersCount: Int
get() = (dispatchReceiverParameter != null).toInt() + (extensionReceiverParameter != null).toInt() +
valueParameters.size
val IrFunction.explicitParameters: List<IrValueParameter> val IrFunction.explicitParameters: List<IrValueParameter>
get() = (listOfNotNull(dispatchReceiverParameter, extensionReceiverParameter) + valueParameters) get() = ArrayList<IrValueParameter>(explicitParametersCount).also {
addExplicitParametersTo(it)
}
val IrBody.statements: List<IrStatement> val IrBody.statements: List<IrStatement>
get() = when (this) { get() = when (this) {