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:
@@ -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()
|
||||
}
|
||||
|
||||
+13
-18
@@ -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()
|
||||
}
|
||||
|
||||
Vendored
+14
-21
@@ -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
@@ -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"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user