JVM_IR KT-45103 optimize direct invoke for lambdas and callable refs

This commit is contained in:
Dmitry Petrov
2021-04-26 17:17:25 +03:00
committed by teamcityserver
parent bfb1a06f3d
commit 851980e36f
124 changed files with 1340 additions and 324 deletions
@@ -1,6 +1,8 @@
fun <T> eval(fn: () -> T) = fn()
class My {
val my: String = "O"
get() = { field }() + "K"
get() = eval { field } + "K"
}
fun box() = My().my
@@ -1,6 +1,8 @@
fun <T> eval(fn: () -> T) = fn()
class My {
var my: String = "U"
get() = { field }()
get() = eval { field }
set(arg) {
class Local {
fun foo() {
@@ -1,6 +1,8 @@
fun <T> eval(fn: () -> T) = fn()
class My {
val my: String = "O"
get() = { { field }() }() + "K"
get() = eval { eval { field } } + "K"
}
fun box() = My().my
@@ -1,6 +1,8 @@
fun <T> eval(fn: () -> T) = fn()
class My {
val my: String = "O"
get() = { { { field }() }() }() + "K"
get() = eval { eval { eval { field } } } + "K"
}
fun box() = My().my
@@ -1,7 +1,9 @@
fun <T> eval(fn: () -> T) = fn()
class My {
companion object {
val my: String = "O"
get() = { field }() + "K"
get() = eval { field } + "K"
}
}
@@ -1,7 +1,9 @@
fun <T> eval(fn: () -> T) = fn()
class My {
companion object {
private val my: String = "O"
get() = { field }() + "K"
get() = eval { field } + "K"
fun getValue() = my
}
@@ -1,4 +1,6 @@
fun <T> eval(fn: () -> T) = fn()
val my: String = "O"
get() = { field }() + "K"
get() = eval { field } + "K"
fun box() = my
+3 -1
View File
@@ -1,3 +1,5 @@
fun <T> eval(fn: () -> T) = fn()
class IntentionsBundle {
companion object {
fun message(key: String): String {
@@ -5,7 +7,7 @@ class IntentionsBundle {
}
fun message2(key: String): String {
return { key + BUNDLE }()
return eval { key + BUNDLE }
}
private const val BUNDLE = "K"
+4 -6
View File
@@ -1,3 +1,5 @@
fun <T> eval(fn: () -> T) = fn()
class A {
var result: Int = 0;
@@ -12,15 +14,11 @@ class A {
}
fun test(p: Int):Int {
return {
p.times3
}()
return eval { p.times3 }
}
fun test2(p: Int, s: Int):Int {
{
p.times = s
}()
eval { p.times = s }
return result
}
}
+3 -1
View File
@@ -1,10 +1,12 @@
fun <T> eval(fn: () -> T) = fn()
class A {
public var prop = "OK"
private set
fun test(): String {
return { prop }()
return eval { prop }
}
}
@@ -1,5 +1,7 @@
// DONT_TARGET_EXACT_BACKEND: WASM
// WASM_MUTE_REASON: EXCEPTIONS_NOT_IMPLEMENTED
fun <T> eval(fn: () -> T) = fn()
public class A {
fun getFromClass(): Boolean {
try {
@@ -12,7 +14,7 @@ public class A {
fun getFromLambda(): Boolean {
try {
val a = { str }()
val a = eval { str }
return false
} catch (e: RuntimeException) {
return true
@@ -1,10 +1,12 @@
// WITH_RUNTIME
fun <T> eval(fn: () -> T) = fn()
class Foo {
private lateinit var foo: String
fun test(): Boolean {
val result = { ::foo.isInitialized }()
val result = eval { ::foo.isInitialized }
foo = ""
return result
}
@@ -13,9 +13,11 @@ public class D {
import test.D
fun <T> eval(fn: () -> T) = fn()
class A : D() {
fun a(): String {
return {field!!}()
return eval { field!! }
}
}