From e7f33ac0518d26967343605ecc803aec4e6c623c Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 23 Jun 2020 20:51:48 +0200 Subject: [PATCH] IR: do not inherit IrFunctionReference from IrFunctionAccessExpression To avoid the diamond hierarchy and to allow refactoring the IR element hierarchy from interfaces to classes, improving performance of visitors and transformers. --- .../jetbrains/kotlin/backend/jvm/ir/IrUtils.kt | 13 ++++--------- .../backend/jvm/lower/AddContinuationLowering.kt | 8 ++++++-- .../kotlin/ir/expressions/IrCallableReference.kt | 2 +- .../src/org/jetbrains/kotlin/ir/util/IrUtils.kt | 15 ++++++++------- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt index 50ccde5e74c..a0d2831ff84 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt @@ -14,7 +14,6 @@ import org.jetbrains.kotlin.backend.jvm.codegen.isInlineOnly import org.jetbrains.kotlin.backend.jvm.codegen.isJvmInterface import org.jetbrains.kotlin.backend.jvm.descriptors.JvmDeclarationFactory import org.jetbrains.kotlin.backend.jvm.lower.inlineclasses.unboxInlineClass -import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.codegen.inline.coroutines.FOR_INLINE_SUFFIX import org.jetbrains.kotlin.config.JvmDefaultMode import org.jetbrains.kotlin.descriptors.ClassKind @@ -281,14 +280,10 @@ fun createDelegatingCallWithPlaceholderTypeArguments(existingCall: IrCall, redir copyFromWithPlaceholderTypeArguments(existingCall, irBuiltIns) } -fun IrFunctionAccessExpression.copyFromWithPlaceholderTypeArguments(existingCall: IrFunctionAccessExpression, irBuiltIns: IrBuiltIns) { - copyValueArgumentsFrom( - existingCall, - existingCall.symbol.owner, - this.symbol.owner, - receiversAsArguments = true, - argumentsAsReceivers = false, - ) +fun IrMemberAccessExpression.copyFromWithPlaceholderTypeArguments( + existingCall: IrMemberAccessExpression, irBuiltIns: IrBuiltIns +) { + copyValueArgumentsFrom(existingCall, this.symbol.owner, receiversAsArguments = true, argumentsAsReceivers = false) var offset = 0 existingCall.symbol.owner.parentAsClass.typeParameters.forEach { _ -> putTypeArgument(offset++, createPlaceholderAnyNType(irBuiltIns)) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AddContinuationLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AddContinuationLowering.kt index 1a519db5c88..8471b03c312 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AddContinuationLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AddContinuationLowering.kt @@ -12,7 +12,10 @@ import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin -import org.jetbrains.kotlin.backend.jvm.codegen.* +import org.jetbrains.kotlin.backend.jvm.codegen.continuationParameter +import org.jetbrains.kotlin.backend.jvm.codegen.hasContinuation +import org.jetbrains.kotlin.backend.jvm.codegen.isInvokeSuspendOfContinuation +import org.jetbrains.kotlin.backend.jvm.codegen.isReadOfCrossinline import org.jetbrains.kotlin.backend.jvm.ir.IrInlineReferenceLocator import org.jetbrains.kotlin.backend.jvm.ir.defaultValue import org.jetbrains.kotlin.backend.jvm.ir.isStaticInlineClassReplacement @@ -29,6 +32,7 @@ import org.jetbrains.kotlin.ir.builders.declarations.* import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.* +import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl @@ -692,7 +696,7 @@ private fun IrFunction.continuationType(context: JvmBackendContext): IrType { context.ir.symbols.continuationClass.typeWith(returnType) } -private fun T.retargetToSuspendView( +private fun > T.retargetToSuspendView( context: JvmBackendContext, caller: IrFunction?, copyWithTargetSymbol: T.(IrSimpleFunctionSymbol) -> T diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrCallableReference.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrCallableReference.kt index 612cca571be..27eaa2b9f05 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrCallableReference.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrCallableReference.kt @@ -23,7 +23,7 @@ interface IrCallableReference : IrMemberAccessExpression { val referencedName: Name } -interface IrFunctionReference : IrCallableReference, IrFunctionAccessExpression { +interface IrFunctionReference : IrCallableReference { val reflectionTarget: IrFunctionSymbol? } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt index 98a06248251..ff5493bf10f 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt @@ -7,9 +7,9 @@ package org.jetbrains.kotlin.ir.util import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.impl.DeclarationDescriptorVisitorEmptyBodies -import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns @@ -499,18 +499,17 @@ fun irCall( } } -fun IrFunctionAccessExpression.copyTypeAndValueArgumentsFrom( - src: IrFunctionAccessExpression, +fun IrMemberAccessExpression.copyTypeAndValueArgumentsFrom( + src: IrMemberAccessExpression, receiversAsArguments: Boolean = false, argumentsAsReceivers: Boolean = false ) { copyTypeArgumentsFrom(src) - copyValueArgumentsFrom(src, src.symbol.owner, symbol.owner, receiversAsArguments, argumentsAsReceivers) + copyValueArgumentsFrom(src, symbol.owner, receiversAsArguments, argumentsAsReceivers) } -fun IrMemberAccessExpression<*>.copyValueArgumentsFrom( - src: IrMemberAccessExpression<*>, - srcFunction: IrFunction, +fun IrMemberAccessExpression.copyValueArgumentsFrom( + src: IrMemberAccessExpression, destFunction: IrFunction, receiversAsArguments: Boolean = false, argumentsAsReceivers: Boolean = false @@ -518,6 +517,8 @@ fun IrMemberAccessExpression<*>.copyValueArgumentsFrom( var destValueArgumentIndex = 0 var srcValueArgumentIndex = 0 + val srcFunction = src.symbol.owner + when { receiversAsArguments && srcFunction.dispatchReceiverParameter != null -> { putValueArgument(destValueArgumentIndex++, src.dispatchReceiver)