JVM: Remove inplace arguments before state-machine building

#KT-56258 Fixed
This commit is contained in:
Ilmir Usmanov
2023-02-17 14:45:04 +01:00
committed by Space Team
parent 3e99807436
commit 6be734c27e
4 changed files with 38 additions and 0 deletions
@@ -76,6 +76,9 @@ class CoroutineTransformerMethodVisitor(
if (isForNamedFunction) getLastParameterIndex(methodNode.desc, methodNode.access) else 0
)
// If there are in-place argument and call markers around suspend call, they end up in separate
// states of state-machine, leading to AnalyzerError.
InplaceArgumentsMethodTransformer().transform(containingClassInternalName, methodNode)
FixStackMethodTransformer().transform(containingClassInternalName, methodNode)
val suspensionPoints = collectSuspensionPoints(methodNode)
RedundantLocalsEliminationMethodTransformer(suspensionPoints)
@@ -13565,6 +13565,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/coroutines/varSpilling/debugMode/if.kt");
}
@Test
@TestMetadata("inlineOnly.kt")
public void testInlineOnly() throws Exception {
runTest("compiler/testData/codegen/box/coroutines/varSpilling/debugMode/inlineOnly.kt");
}
@Test
@TestMetadata("nullCleanup.kt")
public void testNullCleanup() throws Exception {
@@ -0,0 +1,23 @@
// WITH_STDLIB
// FULL_JDK
// TARGET_BACKEND: JVM_IR
// IGNORE_BACKEND: JVM
// IGNORE_BACKEND: ANDROID
import kotlin.coroutines.*
@Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER")
@kotlin.internal.InlineOnly
inline fun f(a: Int): Int = a
fun box(): String {
var res = "FAIL"
suspend {
f(0)
res = "OK"
suspendCoroutine<Unit> {}
}.startCoroutine(Continuation(EmptyCoroutineContext) {
it.getOrThrow()
})
return res
}
@@ -13565,6 +13565,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/coroutines/varSpilling/debugMode/if.kt");
}
@Test
@TestMetadata("inlineOnly.kt")
public void testInlineOnly() throws Exception {
runTest("compiler/testData/codegen/box/coroutines/varSpilling/debugMode/inlineOnly.kt");
}
@Test
@TestMetadata("nullCleanup.kt")
public void testNullCleanup() throws Exception {