From ab472793ed2ec10c28471f72bc61f931aa67d181 Mon Sep 17 00:00:00 2001 From: Ilmir Usmanov Date: Wed, 12 Dec 2018 19:09:34 +0300 Subject: [PATCH] Add continuation parameter of suspend lambda's `invoke` to frame map thus it will not overlap with $i$a and $i$f fake variables. #KT-28309 --- .../src/org/jetbrains/kotlin/codegen/FunctionCodegen.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java index ce0d8442c28..8a5465b06c9 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java @@ -649,6 +649,12 @@ public class FunctionCodegen { parentCodegen.state, signature, functionDescriptor.getExtensionReceiverParameter(), functionDescriptor.getValueParameters(), isStaticMethod(context.getContextKind(), functionDescriptor) ); + // Manually add `continuation` parameter to frame map, thus it will not overlap with fake indices + if (functionDescriptor.isSuspend() && CoroutineCodegenUtilKt.isSuspendFunctionNotSuspensionView(functionDescriptor)) { + FunctionDescriptor view = CoroutineCodegenUtilKt.getOrCreateJvmSuspendFunctionView(functionDescriptor, parentCodegen.state); + ValueParameterDescriptor continuationValueDescriptor = view.getValueParameters().get(view.getValueParameters().size() - 1); + frameMap.enter(continuationValueDescriptor, typeMapper.mapType(continuationValueDescriptor)); + } if (context.isInlineMethodContext()) { functionFakeIndex = newFakeTempIndex(mv, frameMap); }