[IR] Avoid extra lists creation during getting explicit/all parameters (#3769)
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
+3
-3
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user