From f1bc542d74436250f2c6e85e3cc0da56c536a5bc Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Wed, 7 Feb 2024 19:14:02 +0100 Subject: [PATCH] [IR] Change the return type of `getFunctionDeclaration` to be nullable #KT-64807 --- .../lower/inline/SaveInlineFunctionsBeforeInlining.kt | 4 ++-- .../jetbrains/kotlin/ir/inline/FunctionInlining.kt | 11 +++++++---- .../konan/lower/NativeInlineFunctionResolver.kt | 4 ++-- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/SaveInlineFunctionsBeforeInlining.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/SaveInlineFunctionsBeforeInlining.kt index cbc6ba5f4d3..1fe2d44638b 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/SaveInlineFunctionsBeforeInlining.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/SaveInlineFunctionsBeforeInlining.kt @@ -37,8 +37,8 @@ internal class JsInlineFunctionResolver(context: JsIrBackendContext) : InlineFun return symbol == enumEntriesIntrinsic || super.shouldExcludeFunctionFromInlining(symbol) } - override fun getFunctionDeclaration(symbol: IrFunctionSymbol): IrFunction { - val function = super.getFunctionDeclaration(symbol) + override fun getFunctionDeclaration(symbol: IrFunctionSymbol): IrFunction? { + val function = super.getFunctionDeclaration(symbol) ?: return null return inlineFunctionsBeforeInlining[function] ?: return function } } diff --git a/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/FunctionInlining.kt b/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/FunctionInlining.kt index 27255fde392..96654c813ff 100644 --- a/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/FunctionInlining.kt +++ b/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/FunctionInlining.kt @@ -39,7 +39,10 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.util.OperatorNameConventions abstract class InlineFunctionResolver { - open fun getFunctionDeclaration(symbol: IrFunctionSymbol): IrFunction = symbol.owner + open fun getFunctionDeclaration(symbol: IrFunctionSymbol): IrFunction? { + return symbol.owner + } + open fun shouldExcludeFunctionFromInlining(symbol: IrFunctionSymbol): Boolean { return Symbols.isLateinitIsInitializedPropertyGetter(symbol) || Symbols.isTypeOfIntrinsic(symbol) } @@ -56,7 +59,7 @@ fun IrFunction.isBuiltInSuspendCoroutineUninterceptedOrReturn(): Boolean = ) open class InlineFunctionResolverReplacingCoroutineIntrinsics(open val context: CommonBackendContext) : InlineFunctionResolver() { - override fun getFunctionDeclaration(symbol: IrFunctionSymbol): IrFunction { + override fun getFunctionDeclaration(symbol: IrFunctionSymbol): IrFunction? { val function = symbol.owner // TODO: Remove these hacks when coroutine intrinsics are fixed. return when { @@ -106,7 +109,7 @@ class FunctionInlining( val target = (callee as? IrSimpleFunction)?.resolveFakeOverride() ?: callee val actualCallee = inlineFunctionResolver.getFunctionDeclaration(target.symbol) - if (actualCallee.body == null) { + if (actualCallee?.body == null) { return expression } @@ -382,7 +385,7 @@ class FunctionInlining( return inlineFunctionReference( irCall, irFunctionReference, if (inlinedFunction.needsInlining) - inlineFunctionResolver.getFunctionDeclaration(inlinedFunction.symbol) + inlineFunctionResolver.getFunctionDeclaration(inlinedFunction.symbol) ?: inlinedFunction else inlinedFunction ) } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/NativeInlineFunctionResolver.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/NativeInlineFunctionResolver.kt index a97e917c748..c969fae2d02 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/NativeInlineFunctionResolver.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/NativeInlineFunctionResolver.kt @@ -32,8 +32,8 @@ internal class InlineFunctionsSupport(mapping: NativeMapping) { // TODO: This is a bit hacky. Think about adopting persistent IR ideas. internal class NativeInlineFunctionResolver(override val context: Context, val generationState: NativeGenerationState) : InlineFunctionResolverReplacingCoroutineIntrinsics(context) { - override fun getFunctionDeclaration(symbol: IrFunctionSymbol): IrFunction { - val function = super.getFunctionDeclaration(symbol) + override fun getFunctionDeclaration(symbol: IrFunctionSymbol): IrFunction? { + val function = super.getFunctionDeclaration(symbol) ?: return null generationState.inlineFunctionOrigins[function]?.let { return it.irFunction }