From 7afad9a91d169a9d536e48a148f101bc5a5d15b1 Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Mon, 14 Sep 2020 19:00:51 +0300 Subject: [PATCH] Use wrapped descriptors in IrReturnableBlock --- .../kotlin/backend/common/ir/IrInlineUtils.kt | 11 ++++++++++- .../backend/common/lower/inline/FunctionInlining.kt | 7 ++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrInlineUtils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrInlineUtils.kt index 5c75cd37c1b..114cec26844 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrInlineUtils.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrInlineUtils.kt @@ -6,9 +6,12 @@ package org.jetbrains.kotlin.backend.common.ir import org.jetbrains.kotlin.backend.common.lower.VariableRemapper +import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.declarations.* +import org.jetbrains.kotlin.ir.descriptors.WrappedClassConstructorDescriptor +import org.jetbrains.kotlin.ir.descriptors.WrappedSimpleFunctionDescriptor import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrReturnImpl import org.jetbrains.kotlin.ir.expressions.impl.IrReturnableBlockImpl @@ -82,6 +85,12 @@ private fun IrBody.move( // Inline simple function calls without type parameters, default parameters, or varargs. @OptIn(ObsoleteDescriptorBasedAPI::class) fun IrFunction.inline(target: IrDeclarationParent, arguments: List = listOf()): IrReturnableBlock = - IrReturnableBlockImpl(startOffset, endOffset, returnType, IrReturnableBlockSymbolImpl(descriptor), null, symbol).apply { + IrReturnableBlockImpl(startOffset, endOffset, returnType, IrReturnableBlockSymbolImpl(getNewWrappedDescriptor()), null, symbol).apply { statements += body!!.move(this@inline, target, symbol, valueParameters.zip(arguments).toMap()).statements } + +fun IrFunction.getNewWrappedDescriptor(): FunctionDescriptor = when (this) { + is IrConstructor -> WrappedClassConstructorDescriptor().apply { bind(this@getNewWrappedDescriptor) } + is IrSimpleFunction -> WrappedSimpleFunctionDescriptor().apply { bind(this@getNewWrappedDescriptor) } + else -> error("Unknown IrFunction kind: $this") +} diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/FunctionInlining.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/FunctionInlining.kt index 5ebae654906..58afdec327b 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/FunctionInlining.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/FunctionInlining.kt @@ -9,15 +9,12 @@ package org.jetbrains.kotlin.backend.common.lower.inline import org.jetbrains.kotlin.backend.common.* import org.jetbrains.kotlin.backend.common.ir.Symbols import org.jetbrains.kotlin.backend.common.ir.createTemporaryVariableWithWrappedDescriptor +import org.jetbrains.kotlin.backend.common.ir.getNewWrappedDescriptor import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.coroutinesIntrinsicsPackageFqName import org.jetbrains.kotlin.config.languageVersionSettings -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.descriptors.FunctionDescriptor -import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor -import org.jetbrains.kotlin.descriptors.isTopLevelInPackage import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI @@ -178,7 +175,7 @@ class FunctionInlining( val evaluationStatements = evaluateArguments(callSite, copiedCallee) val statements = (copiedCallee.body as IrBlockBody).statements - val irReturnableBlockSymbol = IrReturnableBlockSymbolImpl(copiedCallee.descriptor.original) + val irReturnableBlockSymbol = IrReturnableBlockSymbolImpl(callee.getNewWrappedDescriptor()) val endOffset = callee.endOffset /* creates irBuilder appending to the end of the given returnable block: thus why we initialize * irBuilder with (..., endOffset, endOffset).