mirror of
https://github.com/jlengrand/kotlin.git
synced 2026-05-08 15:53:19 +00:00
Do not treat var as alive just because current instruction belongs to an item range in local variables table, but the item has different sort of type As liveness analysis is mostly used in coroutines spilling, not applying this change may lead that to problems on Android (see tests)
43 lines
1.0 KiB
Kotlin
Vendored
43 lines
1.0 KiB
Kotlin
Vendored
class Controller {
|
|
suspend fun suspendHere(x: Continuation<String>) {
|
|
x.resume("OK")
|
|
}
|
|
}
|
|
|
|
fun builder(coroutine c: Controller.() -> Continuation<Unit>) {
|
|
c(Controller()).resume(Unit)
|
|
}
|
|
|
|
fun box(): String {
|
|
var result = "fail 1"
|
|
builder {
|
|
// Initialize var with Int value
|
|
for (i in 1..1) {
|
|
if ("".length > 0) continue
|
|
}
|
|
|
|
// This variable should take the same slot as 'i' had
|
|
var s: String
|
|
|
|
// We should not spill 's' to continuation field because it's not initialized
|
|
// More precisely it contains a value of wrong type (it conflicts with contents of local var table),
|
|
// so an attempt of spilling may lead to problems on Android
|
|
if (suspendHere() == "OK") {
|
|
s = "OK"
|
|
}
|
|
else {
|
|
s = "fail 2"
|
|
}
|
|
|
|
result = s
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
// 1 LOCALVARIABLE i I L.* 3
|
|
// 1 LOCALVARIABLE s Ljava/lang/String; L.* 3
|
|
// 0 PUTFIELD VarValueConflictsWithTableKt\$box\$1.I\$0 : I
|
|
/* 2 loads in cycle */
|
|
// 2 ILOAD 3
|