[JVM] Add tests that expose problem with locals collapsing.
The collapsing happens during suspend function state machine transformation.
This commit is contained in:
+1
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.codegen.coroutines
|
package org.jetbrains.kotlin.codegen.coroutines
|
||||||
|
|
||||||
|
import com.sun.org.apache.bcel.internal.generic.StoreInstruction
|
||||||
import org.jetbrains.kotlin.codegen.*
|
import org.jetbrains.kotlin.codegen.*
|
||||||
import org.jetbrains.kotlin.codegen.inline.*
|
import org.jetbrains.kotlin.codegen.inline.*
|
||||||
import org.jetbrains.kotlin.codegen.optimization.common.*
|
import org.jetbrains.kotlin.codegen.optimization.common.*
|
||||||
|
|||||||
+43
@@ -0,0 +1,43 @@
|
|||||||
|
// WITH_COROUTINES
|
||||||
|
// FILE: test.kt
|
||||||
|
inline fun hasLocal(): Int {
|
||||||
|
val x = 41
|
||||||
|
return x + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun h() { }
|
||||||
|
|
||||||
|
suspend fun box() {
|
||||||
|
// Force state machine transformation.
|
||||||
|
h()
|
||||||
|
// Local `x` should be visible in the inlined code.
|
||||||
|
hasLocal()
|
||||||
|
// Local `x` is not visible here.
|
||||||
|
42
|
||||||
|
// Local `x` (different one) is visible in the inlined code.
|
||||||
|
hasLocal()
|
||||||
|
}
|
||||||
|
|
||||||
|
// LOCAL VARIABLES
|
||||||
|
// test.kt:10 box:
|
||||||
|
// CoroutineUtil.kt:28 getContext:
|
||||||
|
|
||||||
|
// LOCAL VARIABLES JVM_IR
|
||||||
|
// test.kt:-1 <init>: $completion:kotlin.coroutines.Continuation=helpers.ResultContinuation
|
||||||
|
|
||||||
|
// LOCAL VARIABLES JVM
|
||||||
|
// test.kt:-1 <init>:
|
||||||
|
|
||||||
|
// LOCAL VARIABLES
|
||||||
|
// test.kt:10 box:
|
||||||
|
// test.kt:12 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null
|
||||||
|
// test.kt:8 h: $completion:kotlin.coroutines.Continuation=TestKt$box$1
|
||||||
|
// test.kt:12 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null
|
||||||
|
// test.kt:14 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null
|
||||||
|
// test.kt:4 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$hasLocal:int=0:int
|
||||||
|
// test.kt:5 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$hasLocal:int=0:int, x$iv:int=41:int
|
||||||
|
// test.kt:16 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, x$iv:int=41:int
|
||||||
|
// test.kt:18 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, x$iv:int=41:int
|
||||||
|
// test.kt:4 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, x$iv:int=41:int, $i$f$hasLocal:int=0:int
|
||||||
|
// test.kt:5 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, x$iv:int=41:int, $i$f$hasLocal:int=0:int
|
||||||
|
// test.kt:19 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
// WITH_COROUTINES
|
||||||
|
// FILE: test.kt
|
||||||
|
suspend fun h() { }
|
||||||
|
|
||||||
|
fun f(x: Int) = x
|
||||||
|
|
||||||
|
suspend fun box() {
|
||||||
|
// Force state machine transformation.
|
||||||
|
h()
|
||||||
|
for (x in 0..1) {
|
||||||
|
f(x)
|
||||||
|
}
|
||||||
|
// Local `x` is NOT visible here.
|
||||||
|
42
|
||||||
|
for (x in 0..1) {
|
||||||
|
f(x)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The current backend does not have `x` visible in the locals table for the for loop at all.
|
||||||
|
// IGNORE_BACKEND: JVM
|
||||||
|
|
||||||
|
// LOCAL VARIABLES
|
||||||
|
// test.kt:7 box:
|
||||||
|
// CoroutineUtil.kt:28 getContext:
|
||||||
|
// test.kt:-1 <init>: $completion:kotlin.coroutines.Continuation=helpers.ResultContinuation
|
||||||
|
// test.kt:7 box:
|
||||||
|
// test.kt:9 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null
|
||||||
|
// test.kt:3 h: $completion:kotlin.coroutines.Continuation=TestKt$box$1
|
||||||
|
// test.kt:9 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null
|
||||||
|
// test.kt:10 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null
|
||||||
|
// test.kt:11 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, x:int=0:int
|
||||||
|
// test.kt:5 f: x:int=0:int
|
||||||
|
// test.kt:11 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, x:int=0:int
|
||||||
|
// test.kt:10 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, x:int=0:int
|
||||||
|
// test.kt:11 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, x:int=1:int
|
||||||
|
// test.kt:5 f: x:int=1:int
|
||||||
|
// test.kt:11 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, x:int=1:int
|
||||||
|
// test.kt:10 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, x:int=1:int
|
||||||
|
// test.kt:14 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, x:int=1:int
|
||||||
|
// test.kt:15 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, x:int=1:int
|
||||||
|
// test.kt:16 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, x:int=0:int
|
||||||
|
// test.kt:5 f: x:int=0:int
|
||||||
|
// test.kt:16 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, x:int=0:int
|
||||||
|
// test.kt:15 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null
|
||||||
|
// test.kt:16 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, x:int=1:int
|
||||||
|
// test.kt:5 f: x:int=1:int
|
||||||
|
// test.kt:16 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, x:int=1:int
|
||||||
|
// test.kt:15 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null
|
||||||
|
// test.kt:18 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null
|
||||||
Generated
+12
@@ -154,6 +154,18 @@ public class IrLocalVariableTestGenerated extends AbstractIrLocalVariableTest {
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/debug/localVariables/suspend"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true);
|
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/debug/localVariables/suspend"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("inlineLocalsStateMachineTransform.kt")
|
||||||
|
public void testInlineLocalsStateMachineTransform() throws Exception {
|
||||||
|
runTest("compiler/testData/debug/localVariables/suspend/inlineLocalsStateMachineTransform.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("localsStateMachineTransform.kt")
|
||||||
|
public void testLocalsStateMachineTransform() throws Exception {
|
||||||
|
runTest("compiler/testData/debug/localVariables/suspend/localsStateMachineTransform.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("simple.kt")
|
@TestMetadata("simple.kt")
|
||||||
public void testSimple() throws Exception {
|
public void testSimple() throws Exception {
|
||||||
|
|||||||
Generated
+12
@@ -154,6 +154,18 @@ public class LocalVariableTestGenerated extends AbstractLocalVariableTest {
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/debug/localVariables/suspend"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM, true);
|
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/debug/localVariables/suspend"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("inlineLocalsStateMachineTransform.kt")
|
||||||
|
public void testInlineLocalsStateMachineTransform() throws Exception {
|
||||||
|
runTest("compiler/testData/debug/localVariables/suspend/inlineLocalsStateMachineTransform.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("localsStateMachineTransform.kt")
|
||||||
|
public void testLocalsStateMachineTransform() throws Exception {
|
||||||
|
runTest("compiler/testData/debug/localVariables/suspend/localsStateMachineTransform.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("simple.kt")
|
@TestMetadata("simple.kt")
|
||||||
public void testSimple() throws Exception {
|
public void testSimple() throws Exception {
|
||||||
|
|||||||
Reference in New Issue
Block a user