From bfc4e1106a97be32b07fb77cd7ec6f8da6e4fd32 Mon Sep 17 00:00:00 2001 From: Konstantin Anisimov Date: Wed, 22 Mar 2017 18:06:00 +0700 Subject: [PATCH] Noinline support Bug fix --- .../kotlin/backend/konan/lower/FunctionInlining.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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 ea623065d2a..83cf44bf5fd 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 @@ -271,14 +271,16 @@ internal class FunctionInlining(val context: Context): IrElementTransformerVoid( if (irCall !is IrCallImpl) return irCall val oldTypeArguments = (irCall as IrMemberAccessExpressionBase).typeArguments + if (typeArgsMap == null) return irCall + if (oldTypeArguments == null) return irCall - val substitutionContext = typeArgsMap!!.entries.associate { + val substitutionContext = typeArgsMap.entries.associate { (typeParameter, typeArgument) -> typeParameter.typeConstructor to TypeProjectionImpl(typeArgument) } val typeSubstitutor = TypeSubstitutor.create(substitutionContext) - val newTypeArguments = oldTypeArguments!!.map { + val newTypeArguments = oldTypeArguments.map { val typeParameterDescriptor = it.key val oldTypeArgument = it.value val newTypeArgument = typeSubstitutor.substitute(oldTypeArgument, Variance.INVARIANT) ?: oldTypeArgument @@ -377,6 +379,10 @@ internal class FunctionInlining(val context: Context): IrElementTransformerVoid( val lambdaArgument = substituteMap[dispatchReceiver.descriptor] // Find expression to replace this parameter. if (lambdaArgument == null) return super.visitCall(irCall) // It is not function parameter - nothing to substitute. + val dispatchDescriptor = dispatchReceiver.descriptor + if (dispatchDescriptor is ValueParameterDescriptor && + dispatchDescriptor.isNoinline) return super.visitCall(irCall) + val lambdaFunction = getLambdaFunction(lambdaArgument) if (lambdaFunction == null) return super.visitCall(irCall) // TODO