JVM IR: unmute boxInline tests on enclosing method/class

In box tests, only check that Java reflection does not crash on the
EnclosingMethod attribute generated in these classes. If it doesn't
crash, most likely it returns the value that can be read from the class
file by ASM, which is what the newly added bytecode listing tests are
checking now.
This commit is contained in:
Alexander Udalov
2020-09-01 21:52:58 +02:00
parent 985088a3f1
commit 0dea6b94c6
18 changed files with 719 additions and 63 deletions
@@ -1,8 +1,7 @@
// TARGET_BACKEND: JVM
// IGNORE_BACKEND: JVM_IR
// IGNORE_BACKEND_MULTI_MODULE: JVM_IR
// WITH_RUNTIME
// FILE: 1.kt
// WITH_REFLECT
package test
inline fun <R> call(crossinline s: () -> R) = { s() }()
@@ -18,11 +17,9 @@ fun box(): String {
test { "OK" }
}
var enclosingMethod = res.javaClass.enclosingMethod
if (enclosingMethod?.name != "invoke") return "fail 1: ${enclosingMethod?.name}"
var enclosingClass = res.javaClass.enclosingClass
if (enclosingClass?.name != "_2Kt\$box$\$inlined\$call$1") return "fail 2: ${enclosingClass?.name}"
// Check that Java reflection doesn't crash. Actual values are tested in bytecodeListing/inline/enclosingInfo/.
res.javaClass.enclosingMethod
res.javaClass.enclosingClass
val res2 = call {
call {
@@ -30,11 +27,8 @@ fun box(): String {
}
}
enclosingMethod = res2.javaClass.enclosingMethod
if (enclosingMethod?.name != "invoke") return "fail 1: ${enclosingMethod?.name}"
enclosingClass = res2.javaClass.enclosingClass
if (enclosingClass?.name != "_2Kt\$box$\$inlined\$call$2\$lambda$1") return "fail 2: ${enclosingClass?.name}"
res2.javaClass.enclosingMethod
res2.javaClass.enclosingClass
return res2()
}
@@ -1,44 +1,39 @@
// IGNORE_BACKEND: JVM_IR
// IGNORE_BACKEND_MULTI_MODULE: JVM_IR
// TARGET_BACKEND: JVM
// WITH_RUNTIME
// FILE: 1.kt
// WITH_REFLECT
package test
interface Z {
fun a() : String
fun a(): String
}
inline fun test(crossinline z: () -> String) =
object : Z {
object : Z {
val p = z()
val p = z()
override fun a() = p
}
override fun a() = p
}
// FILE: 2.kt
import test.*
fun box(): String {
/*This captured parameter would be added to object constructor*/
val captured = "OK";
// This captured parameter would be added to object constructor
val captured = "OK"
var z: Any = "fail"
val res = test {
z = {
captured
}
(z as Function0<String>)()
}
val enclosingConstructor = z.javaClass.enclosingConstructor
if (enclosingConstructor?.name != "_2Kt\$box$\$inlined\$test$1") return "fail 1: ${enclosingConstructor?.name}"
val enclosingClass = z.javaClass.enclosingClass
if (enclosingClass?.name != "_2Kt\$box$\$inlined\$test$1") return "fail 2: ${enclosingClass?.name}"
// Check that Java reflection doesn't crash. Actual values are tested in bytecodeListing/inline/enclosingInfo/.
z.javaClass.enclosingConstructor
z.javaClass.enclosingMethod
z.javaClass.enclosingClass
return res.a()
}
@@ -1,50 +1,43 @@
// IGNORE_BACKEND: JVM_IR
// IGNORE_BACKEND_MULTI_MODULE: JVM_IR
// TARGET_BACKEND: JVM
// WITH_RUNTIME
// FILE: 1.kt
// WITH_REFLECT
package test
interface Z {
fun a() : String
fun a(): String
}
inline fun test(crossinline z: () -> String) =
object : Z {
object : Z {
val p = z()
val p = z()
override fun a() = p
}
override fun a() = p
}
inline fun<T> call(crossinline z: () -> T) = z()
inline fun <T> call(crossinline z: () -> T) = z()
// FILE: 2.kt
import test.*
fun box(): String {
/*This captured parameter would be added to object constructor*/
val captured = "OK";
// This captured parameter would be added to object constructor
val captured = "OK"
var z: Any = "fail"
val res = test {
call {
z = {
captured
}
}
(z as Function0<String>)()
}
val enclosingConstructor = z.javaClass.enclosingConstructor
if (enclosingConstructor?.name != "_2Kt\$box$\$inlined\$test$1") return "fail 1: ${enclosingConstructor?.name}"
val enclosingClass = z.javaClass.enclosingClass
if (enclosingClass?.name != "_2Kt\$box$\$inlined\$test$1") return "fail 2: ${enclosingClass?.name}"
// Check that Java reflection doesn't crash. Actual values are tested in bytecodeListing/inline/enclosingInfo/.
z.javaClass.enclosingConstructor
z.javaClass.enclosingMethod
z.javaClass.enclosingClass
return res.a()
}
+7 -11
View File
@@ -1,9 +1,8 @@
// IGNORE_BACKEND: JVM_IR
// IGNORE_BACKEND_MULTI_MODULE: JVM_IR
// TARGET_BACKEND: JVM
// NO_CHECK_LAMBDA_INLINING
// WITH_RUNTIME
// FILE: 1.kt
package test
inline fun test(s: () -> Unit) {
@@ -15,22 +14,19 @@ inline fun test(s: () -> Unit) {
import test.*
fun box(): String {
var encl1 = "fail";
var encl2 = "fail";
var s1 = ""
var s2 = ""
test {
{
val p = object {}
encl1 = p.javaClass.enclosingMethod.declaringClass.name
// Check that Java reflection doesn't crash. Actual values are tested in bytecodeListing/inline/enclosingInfo/.
s1 = p.javaClass.enclosingMethod.declaringClass.toString();
{
val p = object {}
encl2 = p.javaClass.enclosingMethod.declaringClass.name
val q = object {}
s2 = q.javaClass.enclosingMethod.declaringClass.toString()
}()
}()
}
if (encl1 != "_2Kt\$box\$\$inlined\$test\$lambda$1") return "fail 1: $encl1"
if (encl2 != "_2Kt\$box\$\$inlined\$test\$lambda$1$2") return "fail 2: $encl2"
return "OK"
}