JVM_IR KT-45103 optimize direct invoke for lambdas and callable refs
This commit is contained in:
committed by
teamcityserver
parent
bfb1a06f3d
commit
851980e36f
@@ -4,16 +4,18 @@
|
||||
|
||||
fun box(): String {
|
||||
|
||||
val classInLambda = {
|
||||
val lambda = {
|
||||
class Z {}
|
||||
Z()
|
||||
}()
|
||||
}
|
||||
|
||||
val classInLambda = lambda()
|
||||
|
||||
val enclosingMethod = classInLambda.javaClass.getEnclosingMethod()
|
||||
if (enclosingMethod?.getName() != "invoke") return "method: $enclosingMethod"
|
||||
|
||||
val enclosingClass = classInLambda.javaClass.getEnclosingClass()!!.getName()
|
||||
if (enclosingClass != "ClassInLambdaKt\$box\$classInLambda\$1") return "enclosing class: $enclosingClass"
|
||||
if (enclosingClass != "ClassInLambdaKt\$box\$lambda\$1") return "enclosing class: $enclosingClass"
|
||||
|
||||
val declaringClass = classInLambda.javaClass.getDeclaringClass()
|
||||
if (declaringClass != null) return "class has a declaring class"
|
||||
|
||||
@@ -3,16 +3,17 @@
|
||||
// WITH_REFLECT
|
||||
|
||||
fun box(): String {
|
||||
|
||||
val objectInLambda = {
|
||||
val lambda = {
|
||||
object : Any () {}
|
||||
}()
|
||||
}
|
||||
|
||||
val objectInLambda = lambda()
|
||||
|
||||
val enclosingMethod = objectInLambda.javaClass.getEnclosingMethod()
|
||||
if (enclosingMethod?.getName() != "invoke") return "method: $enclosingMethod"
|
||||
|
||||
val enclosingClass = objectInLambda.javaClass.getEnclosingClass()!!.getName()
|
||||
if (enclosingClass != "ObjectInLambdaKt\$box\$objectInLambda\$1") return "enclosing class: $enclosingClass"
|
||||
if (enclosingClass != "ObjectInLambdaKt\$box\$lambda\$1") return "enclosing class: $enclosingClass"
|
||||
|
||||
val declaringClass = objectInLambda.javaClass.getDeclaringClass()
|
||||
if (declaringClass != null) return "anonymous object has a declaring class"
|
||||
|
||||
+4
-2
@@ -2,10 +2,12 @@
|
||||
// WITH_REFLECT
|
||||
import kotlin.reflect.*
|
||||
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
inline operator fun String.getValue(t:Any?, p: KProperty<*>): String =
|
||||
if (p.returnType.classifier == String::class) this else "fail"
|
||||
|
||||
fun box() = {
|
||||
fun box() = eval {
|
||||
val x by "OK"
|
||||
x
|
||||
}()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user