Introduce local variable type checker.
CheckLocalVariablesTableTests will now check the validity of the locals table against types of locals computed based on the bytecode. These checks and the new destructuringInFor test act as a regression test for the changes in https://github.com/JetBrains/kotlin/pull/2613 These checks also caught a similar issue for destructuring lambda parameters, where the local is introduced before the value has been written to the local slot. This change also fixes that. Finally, this change fixes the asmLike tests to correctly look up the name of parameters in the locals table.
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
// WITH_RUNTIME
|
||||
|
||||
fun box() {
|
||||
val map: Map<String, String> = mapOf()
|
||||
for ((a, b) in map) {
|
||||
a + b
|
||||
}
|
||||
}
|
||||
|
||||
// METHOD : DestructuringInForKt.box()V
|
||||
|
||||
// VARIABLE : NAME=b TYPE=Ljava/lang/String; INDEX=4
|
||||
// VARIABLE : NAME=a TYPE=Ljava/lang/String; INDEX=3
|
||||
// VARIABLE : NAME=map TYPE=Ljava/util/Map; INDEX=0
|
||||
@@ -8,7 +8,7 @@ fun box() {
|
||||
}
|
||||
|
||||
// METHOD : DestructuringInLambdasKt$box$1.invoke(LA;)Ljava/lang/String;
|
||||
// VARIABLE : NAME=this TYPE=LDestructuringInLambdasKt$box$1; INDEX=0
|
||||
// VARIABLE : NAME=$dstr$x$y TYPE=LA; INDEX=1
|
||||
// VARIABLE : NAME=x TYPE=Ljava/lang/String; INDEX=2
|
||||
// VARIABLE : NAME=y TYPE=I INDEX=3
|
||||
// VARIABLE : NAME=this TYPE=LDestructuringInLambdasKt$box$1; INDEX=0
|
||||
// VARIABLE : NAME=$dstr$x$y TYPE=LA; INDEX=1
|
||||
@@ -14,10 +14,10 @@ fun box(): String {
|
||||
}
|
||||
|
||||
// METHOD : DestructuringInlineLambdaKt.box()Ljava/lang/String;
|
||||
// VARIABLE : NAME=i TYPE=I INDEX=2
|
||||
// VARIABLE : NAME=$dstr$a1$a2$a3 TYPE=LStation; INDEX=1
|
||||
// VARIABLE : NAME=a1 TYPE=Ljava/lang/String; INDEX=4
|
||||
// VARIABLE : NAME=a2 TYPE=Ljava/lang/String; INDEX=5
|
||||
// VARIABLE : NAME=a3 TYPE=I INDEX=6
|
||||
// VARIABLE : NAME=i TYPE=I INDEX=2
|
||||
// VARIABLE : NAME=$dstr$a1$a2$a3 TYPE=LStation; INDEX=1
|
||||
// VARIABLE : NAME=$i$a$-foo-DestructuringInlineLambdaKt$box$1 TYPE=I INDEX=3
|
||||
// VARIABLE : NAME=$i$f$foo TYPE=I INDEX=0
|
||||
|
||||
+2
-2
@@ -7,10 +7,10 @@ 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/Continuation;)Ljava/lang/Object;
|
||||
// VARIABLE : NAME=$dstr$x_param$y_param TYPE=LA; INDEX=4
|
||||
// VARIABLE : NAME=continuation TYPE=Lkotlin/coroutines/Continuation; INDEX=3
|
||||
// VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=6
|
||||
// VARIABLE : NAME=y_param TYPE=Ljava/lang/String; INDEX=7
|
||||
// VARIABLE : NAME=$dstr$x_param$y_param TYPE=LA; INDEX=4
|
||||
// VARIABLE : NAME=continuation TYPE=Lkotlin/coroutines/Continuation; INDEX=3
|
||||
// VARIABLE : NAME=$i$a$-foo-InlineKt$test$2 TYPE=I INDEX=5
|
||||
// VARIABLE : NAME=a$iv TYPE=LA; INDEX=1
|
||||
// VARIABLE : NAME=$i$f$foo TYPE=I INDEX=2
|
||||
|
||||
@@ -22,6 +22,8 @@ fun box() {
|
||||
}
|
||||
|
||||
// METHOD : UnderscoreNamesKt$box$1.invoke(LA;Ljava/lang/String;I)Ljava/lang/String;
|
||||
// VARIABLE : NAME=x TYPE=D INDEX=4
|
||||
// VARIABLE : NAME=y TYPE=C INDEX=6
|
||||
// VARIABLE : NAME=q TYPE=Ljava/lang/String; INDEX=16
|
||||
// VARIABLE : NAME=d TYPE=C INDEX=11
|
||||
// VARIABLE : NAME=_ TYPE=Ljava/lang/String; INDEX=10
|
||||
@@ -30,6 +32,4 @@ fun box() {
|
||||
// VARIABLE : NAME=this TYPE=LUnderscoreNamesKt$box$1; INDEX=0
|
||||
// VARIABLE : NAME=$dstr$x$_u24__u24$y TYPE=LA; INDEX=1
|
||||
// VARIABLE : NAME=$noName_1 TYPE=Ljava/lang/String; INDEX=2
|
||||
// VARIABLE : NAME=w TYPE=I INDEX=3
|
||||
// VARIABLE : NAME=x TYPE=D INDEX=4
|
||||
// VARIABLE : NAME=y TYPE=C INDEX=6
|
||||
// VARIABLE : NAME=w TYPE=I INDEX=3
|
||||
Reference in New Issue
Block a user