Generate decomposed lambda params in suspend lambda's local variables
Unlike ordinary lambdas, suspend lambdas do the computation in doResume(Ljava/lang/Object;Ljava/lang/Throwable;)Ljava/lang/Object; method. As you can see, there are no decomposed parameters. As a result, they used not to be generated. To fix the issue, I add decomposed parameters to value parameters while generating local variables table. In addition, when generating suspend lambda for inline, the codegen does not take this kind of parameters into account. This is also fixed. #KT-18576: Fixed
This commit is contained in:
+19
@@ -0,0 +1,19 @@
|
||||
data class Data(val x: String, val y: Int)
|
||||
|
||||
suspend fun test() {
|
||||
foo(Data("A", 1)) { (x_param, y_param) ->
|
||||
"$x_param / $y_param"
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun foo(data: Data, body: suspend (Data) -> Unit) {
|
||||
body(data)
|
||||
}
|
||||
|
||||
// METHOD : DataClassKt$test$2.doResume(Ljava/lang/Object;Ljava/lang/Throwable;)Ljava/lang/Object;
|
||||
// VARIABLE : NAME=this TYPE=LDataClassKt$test$2; INDEX=0
|
||||
// VARIABLE : NAME=data TYPE=Ljava/lang/Object; INDEX=1
|
||||
// VARIABLE : NAME=throwable TYPE=Ljava/lang/Throwable; INDEX=2
|
||||
// VARIABLE : NAME=$x_param_y_param TYPE=LData; INDEX=3
|
||||
// VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=4
|
||||
// VARIABLE : NAME=y_param TYPE=I INDEX=5
|
||||
Vendored
+26
@@ -0,0 +1,26 @@
|
||||
class A<T>(val x: String, val y: String, val z: T)
|
||||
|
||||
suspend fun <T> foo(a: A<T>, block: suspend (A<T>) -> String): String = block(a)
|
||||
|
||||
operator fun A<*>.component1() = x
|
||||
|
||||
object B {
|
||||
operator fun A<*>.component2() = y
|
||||
}
|
||||
|
||||
suspend fun B.bar(): String {
|
||||
operator fun <R> A<R>.component3() = z
|
||||
|
||||
return foo(A("O", "K", 123)) { (x_param, y_param, z_param) -> x_param + y_param + z_param.toString() }
|
||||
}
|
||||
|
||||
suspend fun test() = B.bar()
|
||||
|
||||
// METHOD : ExtensionComponentsKt$bar$3.doResume(Ljava/lang/Object;Ljava/lang/Throwable;)Ljava/lang/Object;
|
||||
// VARIABLE : NAME=this TYPE=LExtensionComponentsKt$bar$3; INDEX=0
|
||||
// VARIABLE : NAME=data TYPE=Ljava/lang/Object; INDEX=1
|
||||
// VARIABLE : NAME=throwable TYPE=Ljava/lang/Throwable; INDEX=2
|
||||
// VARIABLE : NAME=$x_param_y_param_z_param TYPE=LA; INDEX=3
|
||||
// VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=4
|
||||
// VARIABLE : NAME=y_param TYPE=Ljava/lang/String; INDEX=5
|
||||
// VARIABLE : NAME=z_param TYPE=I INDEX=6
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
data class A<T, F>(val x: T, val y: F)
|
||||
|
||||
suspend fun <X, Y> foo(a: A<X, Y>, block: suspend (A<X, Y>) -> String) = block(a)
|
||||
|
||||
suspend fun test() = foo(A("OK", 1)) { (x_param, y_param) -> x_param + (y_param.toString()) }
|
||||
|
||||
// METHOD : GenericKt$test$2.doResume(Ljava/lang/Object;Ljava/lang/Throwable;)Ljava/lang/Object;
|
||||
// VARIABLE : NAME=this TYPE=LGenericKt$test$2; INDEX=0
|
||||
// VARIABLE : NAME=data TYPE=Ljava/lang/Object; INDEX=1
|
||||
// VARIABLE : NAME=throwable TYPE=Ljava/lang/Throwable; INDEX=2
|
||||
// VARIABLE : NAME=$x_param_y_param TYPE=LA; INDEX=3
|
||||
// VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=4
|
||||
// VARIABLE : NAME=y_param TYPE=I INDEX=5
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
data class A(val x: String, val y: String)
|
||||
|
||||
suspend inline fun foo(a: A, block: suspend (A) -> String): String = block(a)
|
||||
|
||||
suspend fun test() = foo(A("O", "K")) { (x_param, y_param) -> x_param + y_param }
|
||||
|
||||
// METHOD : InlineKt.test(Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
|
||||
// VARIABLE : NAME=<name for destructuring parameter 0> TYPE=LA; INDEX=3
|
||||
// VARIABLE : NAME=continuation TYPE=Lkotlin/coroutines/experimental/Continuation; INDEX=2
|
||||
// VARIABLE : NAME=$x_param_y_param TYPE=LA; INDEX=5
|
||||
// VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=6
|
||||
// VARIABLE : NAME=y_param TYPE=Ljava/lang/String; INDEX=7
|
||||
// VARIABLE : NAME=$i$a$2$foo TYPE=I INDEX=2
|
||||
// VARIABLE : NAME=a$iv TYPE=LA; INDEX=1
|
||||
// VARIABLE : NAME=$i$f$foo TYPE=I INDEX=8
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
data class A(val x: String, val y: String)
|
||||
|
||||
suspend fun foo(a: A, block: suspend (Int, A, String) -> String): String = block(1, a, "#")
|
||||
|
||||
suspend fun test() = foo(A("O", "K")) { i_param, (x_param, y_param), v_param -> i_param.toString() + x_param + y_param + v_param }
|
||||
|
||||
// METHOD : OtherParametersKt$test$2.doResume(Ljava/lang/Object;Ljava/lang/Throwable;)Ljava/lang/Object;
|
||||
// VARIABLE : NAME=this TYPE=LOtherParametersKt$test$2; INDEX=0
|
||||
// VARIABLE : NAME=data TYPE=Ljava/lang/Object; INDEX=1
|
||||
// VARIABLE : NAME=throwable TYPE=Ljava/lang/Throwable; INDEX=2
|
||||
// VARIABLE : NAME=$x_param_y_param TYPE=LA; INDEX=3
|
||||
// VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=4
|
||||
// VARIABLE : NAME=y_param TYPE=Ljava/lang/String; INDEX=5
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
class A {
|
||||
operator fun component1() = "O"
|
||||
operator fun component2(): String = throw RuntimeException("fail 0")
|
||||
operator fun component3() = "K"
|
||||
}
|
||||
|
||||
suspend fun foo(a: A, block: suspend (A) -> String): String = block(a)
|
||||
|
||||
suspend fun test() = foo(A()) { (x_param, _, y_param) -> x_param + y_param }
|
||||
|
||||
// METHOD : UnderscoreNamesKt$test$2.doResume(Ljava/lang/Object;Ljava/lang/Throwable;)Ljava/lang/Object;
|
||||
// VARIABLE : NAME=this TYPE=LUnderscoreNamesKt$test$2; INDEX=0
|
||||
// VARIABLE : NAME=data TYPE=Ljava/lang/Object; INDEX=1
|
||||
// VARIABLE : NAME=throwable TYPE=Ljava/lang/Throwable; INDEX=2
|
||||
// VARIABLE : NAME=$x_param_$_$_y_param TYPE=LA; INDEX=3
|
||||
// VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=4
|
||||
// VARIABLE : NAME=y_param TYPE=Ljava/lang/String; INDEX=5
|
||||
Reference in New Issue
Block a user