JVM: Remove inplace arguments before state-machine building
#KT-56258 Fixed
This commit is contained in:
committed by
Space Team
parent
3e99807436
commit
6be734c27e
+3
@@ -76,6 +76,9 @@ class CoroutineTransformerMethodVisitor(
|
|||||||
if (isForNamedFunction) getLastParameterIndex(methodNode.desc, methodNode.access) else 0
|
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)
|
FixStackMethodTransformer().transform(containingClassInternalName, methodNode)
|
||||||
val suspensionPoints = collectSuspensionPoints(methodNode)
|
val suspensionPoints = collectSuspensionPoints(methodNode)
|
||||||
RedundantLocalsEliminationMethodTransformer(suspensionPoints)
|
RedundantLocalsEliminationMethodTransformer(suspensionPoints)
|
||||||
|
|||||||
+6
@@ -13565,6 +13565,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
|||||||
runTest("compiler/testData/codegen/box/coroutines/varSpilling/debugMode/if.kt");
|
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
|
@Test
|
||||||
@TestMetadata("nullCleanup.kt")
|
@TestMetadata("nullCleanup.kt")
|
||||||
public void testNullCleanup() throws Exception {
|
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
|
||||||
|
}
|
||||||
+6
@@ -13565,6 +13565,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/coroutines/varSpilling/debugMode/if.kt");
|
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
|
@Test
|
||||||
@TestMetadata("nullCleanup.kt")
|
@TestMetadata("nullCleanup.kt")
|
||||||
public void testNullCleanup() throws Exception {
|
public void testNullCleanup() throws Exception {
|
||||||
|
|||||||
Reference in New Issue
Block a user