diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt index dd85de0d9cc..d71fb8acd94 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.backend.konan.lower import org.jetbrains.kotlin.backend.common.* +import org.jetbrains.kotlin.backend.common.descriptors.explicitParameters import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.backend.konan.descriptors.isFunctionInvoke @@ -35,11 +36,13 @@ import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.getDefault import org.jetbrains.kotlin.ir.expressions.* +import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl import org.jetbrains.kotlin.ir.expressions.impl.IrReturnableBlockImpl import org.jetbrains.kotlin.ir.expressions.impl.IrVarargImpl import org.jetbrains.kotlin.ir.symbols.impl.IrReturnableBlockSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.createValueSymbol +import org.jetbrains.kotlin.ir.util.getArguments import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.name.FqName @@ -83,9 +86,9 @@ internal class FunctionInlining(val context: Context): IrElementTransformerVoidW return irCall } - functionDeclaration.transformChildrenVoid(this) // Process recursive inline. - val inliner = Inliner(globalSubstituteMap, functionDeclaration, currentScope!!, context) // Create inliner for this scope. - return inliner.inline(irCall) // Return newly created IrInlineBody instead of IrCall. + functionDeclaration.transformChildrenVoid(this) // Process recursive inline. + val inliner = Inliner(globalSubstituteMap, functionDeclaration, currentScope!!, context, this) // Create inliner for this scope. + return inliner.inline(irCall) // Return newly created IrInlineBody instead of IrCall. } //-------------------------------------------------------------------------// @@ -116,7 +119,8 @@ private val FunctionDescriptor.isInlineConstructor get() = annotations.hasAnnota private class Inliner(val globalSubstituteMap: MutableMap, val functionDeclaration: IrFunction, // Function to substitute. val currentScope: ScopeWithIr, - val context: Context) { + val context: Context, + val owner: FunctionInlining /*TODO: make inner*/) { val copyIrElement = DeepCopyIrTreeWithDescriptors(functionDeclaration.descriptor, currentScope.scope.scopeOwner, context) // Create DeepCopy for current scope. val substituteMap = mutableMapOf() @@ -206,17 +210,51 @@ private class Inliner(val globalSubstituteMap: MutableMap this.dispatchReceiver = argument + functionDescriptor.extensionReceiverParameter -> this.extensionReceiver = argument + else -> putValueArgument((it as ValueParameterDescriptor).index, argument) + } + } + assert(unboundIndex == valueParameters.size, { "Not all arguments of are used" }) + } + return owner.visitCall(super.visitCall(immediateCall) as IrCall) + } + if (functionArgument !is IrBlock) + return super.visitCall(expression) val functionDeclaration = getLambdaFunction(functionArgument) val newExpression = inlineFunction(expression, functionDeclaration) // Inline the lambda. Lambda parameters will be substituted with lambda arguments. @@ -262,19 +300,22 @@ private class Inliner(val globalSubstituteMap: MutableMap