From b2970ef77107481ceb843c51ee43dc371f877022 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Mon, 15 Jan 2018 13:51:33 +0100 Subject: [PATCH] Skip noinline lambdas during inline --- .../kotlin/backend/jvm/codegen/IrInlineCodegen.kt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt index 2b21a32a5b6..a0368db59f7 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.util.getArguments +import org.jetbrains.kotlin.resolve.inline.InlineUtil.isInlineParameter import org.jetbrains.kotlin.utils.keysToMap import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.commons.Method @@ -49,9 +50,8 @@ class IrInlineCodegen( } override fun genValueAndPut(valueParameterDescriptor: ValueParameterDescriptor?, argumentExpression: IrExpression, parameterType: Type, parameterIndex: Int, codegen: ExpressionCodegen, blockInfo: BlockInfo) { - //if (isInliningParameter(argumentExpression, valueParameterDescriptor)) { - if (argumentExpression is IrBlock && argumentExpression.origin == IrStatementOrigin.LAMBDA) { - val irReference: IrFunctionReference = argumentExpression.statements.filterIsInstance().single() + if (valueParameterDescriptor?.let { isInlineParameter(it) } == true && isInlineIrExpression(argumentExpression)) { + val irReference: IrFunctionReference = (argumentExpression as IrBlock).statements.filterIsInstance().single() rememberClosure(irReference, parameterType, valueParameterDescriptor!!) as IrExpressionLambda } else { @@ -126,4 +126,7 @@ class IrExpressionLambda( override val hasDispatchReceiver: Boolean get() = false -} \ No newline at end of file +} + +fun isInlineIrExpression(argumentExpression: IrExpression) = + argumentExpression is IrBlock && argumentExpression.origin == IrStatementOrigin.LAMBDA \ No newline at end of file