From 45efa2d0a14e7ff060f89ef69c7fff30b8929f20 Mon Sep 17 00:00:00 2001 From: Konstantin Anisimov Date: Tue, 12 Dec 2017 11:43:16 +0300 Subject: [PATCH] Migrate to new lambda detection mechanism --- .../backend/konan/lower/FunctionInlining.kt | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 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 0f1cd14227f..0847bcbb6f1 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 @@ -26,10 +26,7 @@ import org.jetbrains.kotlin.backend.konan.descriptors.isFunctionInvoke import org.jetbrains.kotlin.backend.konan.descriptors.needsInlining import org.jetbrains.kotlin.backend.konan.descriptors.resolveFakeOverride import org.jetbrains.kotlin.backend.konan.ir.DeserializerDriver -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.descriptors.FunctionDescriptor -import org.jetbrains.kotlin.descriptors.ValueDescriptor -import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.declarations.IrFunction @@ -47,6 +44,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue import org.jetbrains.kotlin.types.TypeProjectionImpl import org.jetbrains.kotlin.types.TypeSubstitutor + //-----------------------------------------------------------------------------// internal class FunctionInlining(val context: Context): IrElementTransformerVoidWithContext() { @@ -238,8 +236,8 @@ private class Inliner(val globalSubstituteMap: MutableMap") + } - val statements = this.statements - val irFunction = statements[0] // Lambda function declaration. - val irCallableReference = statements[1] // Lambda callable reference. - if (irFunction !is IrFunction) return false // First statement of the block must be lambda declaration. - if (irCallableReference !is IrCallableReference) return false // Second statement of the block must be CallableReference. - return true + //-------------------------------------------------------------------------// + + fun IrExpression.isInlinableBody(): Boolean { + if (this !is IrBlock) return false // Lambda must be represented with IrBlock. + val lastStatement = statements.last() + if (lastStatement !is IrCallableReference) return false // Second statement of the lambda block must be CallableReference. + return isAnonymousFunction(lastStatement.descriptor) } }