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
-1
@@ -4,7 +4,10 @@ fun Array<String>.test1(): Array<String> {
|
||||
}
|
||||
|
||||
fun Array<String>.test1Nested(): Array<String> {
|
||||
val func = { i: Int -> { this }()}
|
||||
val func = { i: Int ->
|
||||
val lam = { this }
|
||||
lam()
|
||||
}
|
||||
return func(1)
|
||||
}
|
||||
|
||||
|
||||
@@ -3,10 +3,12 @@ class C(val i: Int) {
|
||||
operator fun component2() = i + 2
|
||||
}
|
||||
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
fun doTest(l : Array<C>): String {
|
||||
var s = ""
|
||||
for ((a, b) in l) {
|
||||
s += {"$a:$b;"}()
|
||||
s += eval {"$a:$b;"}
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
Vendored
+3
-1
@@ -1,10 +1,12 @@
|
||||
operator fun Int.component1() = this + 1
|
||||
operator fun Int.component2() = this + 2
|
||||
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
fun doTest(l : Array<Int>): String {
|
||||
var s = ""
|
||||
for ((a, b) in l) {
|
||||
s += {"$a:$b;"}()
|
||||
s += eval {"$a:$b;"}
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
Vendored
+3
-1
@@ -1,10 +1,12 @@
|
||||
operator fun Long.component1() = this + 1
|
||||
operator fun Long.component2() = this + 2
|
||||
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
fun doTest(l : Array<Long>): String {
|
||||
var s = ""
|
||||
for ((a, b) in l) {
|
||||
s += {"$a:$b;"}()
|
||||
s += eval { "$a:$b;" }
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
@@ -15,10 +15,11 @@ interface Checker {
|
||||
class Checker1 : Checker {
|
||||
override fun check(): Boolean {
|
||||
var result = true
|
||||
assert(true, {
|
||||
val lam = {
|
||||
result = false
|
||||
{ "Assertion failure" }
|
||||
}())
|
||||
}
|
||||
assert(true, lam())
|
||||
return result
|
||||
}
|
||||
}
|
||||
@@ -26,10 +27,11 @@ class Checker1 : Checker {
|
||||
class Checker2 : Checker {
|
||||
override fun check(): Boolean {
|
||||
var result = true
|
||||
assert(true, {
|
||||
val lam = {
|
||||
result = false
|
||||
{ "Assertion failure" }
|
||||
}())
|
||||
}
|
||||
assert(true, lam())
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
+2
-3
@@ -1,8 +1,7 @@
|
||||
fun box() : String {
|
||||
var i = 0
|
||||
{
|
||||
i++
|
||||
}()
|
||||
val lambda = { i++ }
|
||||
lambda()
|
||||
i++ //the problem is here
|
||||
// i = i + 1 //this way it works
|
||||
return if (i == 2) "OK" else "fail"
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
fun String.f(x: String): String {
|
||||
fun String.g() = { this@f + this@g }()
|
||||
fun String.g() = eval { this@f + this@g }
|
||||
return x.g()
|
||||
}
|
||||
|
||||
|
||||
Vendored
+6
-1
@@ -3,7 +3,12 @@ open class Base(val callback: () -> String)
|
||||
class Outer {
|
||||
val ok = "OK"
|
||||
|
||||
inner class Inner : Base({ { ok }() })
|
||||
inner class Inner : Base(
|
||||
{
|
||||
val lambda = { ok }
|
||||
lambda()
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
fun box(): String =
|
||||
|
||||
@@ -7,12 +7,14 @@
|
||||
|
||||
package test
|
||||
|
||||
val p = { "OK" }()
|
||||
fun <T> eval(lambda: () -> T) = lambda()
|
||||
|
||||
val p = eval { "OK" }
|
||||
|
||||
val getter: String
|
||||
get() = { "OK" }()
|
||||
get() = eval { "OK" }
|
||||
|
||||
fun f() = { "OK" }()
|
||||
fun f() = eval { "OK" }
|
||||
|
||||
val obj = object : Function0<String> {
|
||||
override fun invoke() = "OK"
|
||||
|
||||
@@ -5,12 +5,14 @@
|
||||
// TODO: muted automatically, investigate should it be ran for JS or not
|
||||
// IGNORE_BACKEND: JS
|
||||
|
||||
val p = { "OK" }()
|
||||
fun <T> eval(lambda: () -> T) = lambda()
|
||||
|
||||
val p = eval { "OK" }
|
||||
|
||||
val getter: String
|
||||
get() = { "OK" }()
|
||||
get() = eval { "OK" }
|
||||
|
||||
fun f() = { "OK" }()
|
||||
fun f() = eval { "OK" }
|
||||
|
||||
val obj = object : Function0<String> {
|
||||
override fun invoke() = "OK"
|
||||
|
||||
+4
-6
@@ -12,9 +12,8 @@ class Example : JClass {
|
||||
var result: String? = null
|
||||
|
||||
init {
|
||||
{
|
||||
result = obj?.test()
|
||||
}()
|
||||
val lambda = { result = obj?.test() }
|
||||
lambda()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,9 +25,8 @@ class Example2 : JClass {
|
||||
var result: String? = null
|
||||
|
||||
init {
|
||||
{
|
||||
result = obj?.test()
|
||||
}()
|
||||
val lambda = { result = obj?.test() }
|
||||
lambda()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+4
-2
@@ -1,8 +1,10 @@
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
class Foo(private val s: String) {
|
||||
inner class Inner {
|
||||
private val x = {
|
||||
private val x = eval {
|
||||
this@Foo.s
|
||||
}()
|
||||
}
|
||||
}
|
||||
|
||||
val f = Inner()
|
||||
|
||||
+3
-3
@@ -1,7 +1,7 @@
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
private const val z = "OK";
|
||||
|
||||
fun box(): String {
|
||||
return {
|
||||
z
|
||||
}()
|
||||
return eval { z }
|
||||
}
|
||||
+4
-2
@@ -3,12 +3,14 @@
|
||||
|
||||
import kotlin.reflect.*
|
||||
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
object E
|
||||
|
||||
operator fun E.getValue(receiver: Any?, property: KProperty<*>): String =
|
||||
if (property.returnType.classifier == String::class) "OK" else "Fail"
|
||||
|
||||
fun box(): String = {
|
||||
fun box(): String = eval {
|
||||
val x: String by E
|
||||
x
|
||||
}()
|
||||
}
|
||||
|
||||
+5
-7
@@ -3,10 +3,8 @@ import kotlin.reflect.KProperty
|
||||
operator fun Int.provideDelegate(thiz: Any?, property: KProperty<*>): String = property.name
|
||||
inline operator fun String.getValue(thiz: Any?, property: KProperty<*>): String = property.name
|
||||
|
||||
fun box(): String = with(42) {
|
||||
val O by this
|
||||
O
|
||||
} + {
|
||||
val K by ""
|
||||
K
|
||||
}()
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
fun box(): String =
|
||||
with(42) { val O by this; O } + eval { val K by ""; K }
|
||||
|
||||
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
// IGNORE_BACKEND: WASM
|
||||
// CHECK_BYTECODE_TEXT
|
||||
// JVM_IR_TEMPLATES
|
||||
// 0 Function(^.)*.invoke
|
||||
|
||||
class Outer (val x: String) {
|
||||
inner class Inner(val y: String) {
|
||||
val yx = y + x
|
||||
}
|
||||
}
|
||||
|
||||
fun box() =
|
||||
Outer("K")::Inner.invoke("O").yx
|
||||
@@ -0,0 +1,11 @@
|
||||
// IGNORE_BACKEND: WASM
|
||||
// CHECK_BYTECODE_TEXT
|
||||
// JVM_IR_TEMPLATES
|
||||
// 0 Function(^.)*.invoke
|
||||
|
||||
class C(val x: String) {
|
||||
fun foo(s: String) = x + s
|
||||
}
|
||||
|
||||
fun box() =
|
||||
C("O")::foo.invoke("K")
|
||||
@@ -0,0 +1,11 @@
|
||||
// CHECK_BYTECODE_TEXT
|
||||
// JVM_IR_TEMPLATES
|
||||
// 0 invoke
|
||||
|
||||
fun box(): String {
|
||||
var ok = "FAILED"
|
||||
{ s: String ->
|
||||
ok = s
|
||||
}("OK")
|
||||
return ok
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
// CHECK_BYTECODE_TEXT
|
||||
// JVM_IR_TEMPLATES
|
||||
// 0 Function(^.)*.invoke
|
||||
|
||||
class C(x: String, y: String) {
|
||||
val yx = y + x
|
||||
}
|
||||
|
||||
fun box() =
|
||||
::C.invoke("K", "O").yx
|
||||
@@ -0,0 +1,12 @@
|
||||
// CHECK_BYTECODE_TEXT
|
||||
// JVM_IR_TEMPLATES
|
||||
// 0 Function(^.)*.invoke
|
||||
|
||||
fun box() =
|
||||
{ k: String ->
|
||||
{ o: String ->
|
||||
var ok = o
|
||||
ok += k
|
||||
ok
|
||||
}("O")
|
||||
}("K")
|
||||
@@ -0,0 +1,10 @@
|
||||
// CHECK_BYTECODE_TEXT
|
||||
// JVM_IR_TEMPLATES
|
||||
// 0 Function(^.)*.invoke
|
||||
|
||||
fun box() =
|
||||
(fun (s: String): String {
|
||||
var ok = "O"
|
||||
ok += s
|
||||
return ok
|
||||
}).invoke("K")
|
||||
@@ -0,0 +1,8 @@
|
||||
// CHECK_BYTECODE_TEXT
|
||||
// JVM_IR_TEMPLATES
|
||||
// 0 Function(^.)*.invoke
|
||||
|
||||
fun ok(s: String) = "O" + s
|
||||
|
||||
fun box() =
|
||||
::ok.invoke("K")
|
||||
@@ -0,0 +1,10 @@
|
||||
// CHECK_BYTECODE_TEXT
|
||||
// JVM_IR_TEMPLATES
|
||||
// 0 Function(^.)*.invoke
|
||||
|
||||
fun box() =
|
||||
{ s: String ->
|
||||
var ok = "O"
|
||||
ok += s
|
||||
ok
|
||||
}.invoke("K")
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
// CHECK_BYTECODE_TEXT
|
||||
// JVM_IR_TEMPLATES
|
||||
// 0 Function(^.)*.invoke
|
||||
|
||||
class Outer (val x: String) {
|
||||
inner class Inner(val y: String) {
|
||||
val yx = y + x
|
||||
}
|
||||
}
|
||||
|
||||
fun box() =
|
||||
(Outer::Inner).invoke(Outer("K"), "O").yx
|
||||
@@ -0,0 +1,2 @@
|
||||
fun box(): String =
|
||||
(String::plus)("O", "K")
|
||||
+4
-2
@@ -1,3 +1,5 @@
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
fun box(): String {
|
||||
var s = ""
|
||||
var foo = "K"
|
||||
@@ -11,10 +13,10 @@ fun box(): String {
|
||||
s += x
|
||||
}
|
||||
|
||||
{
|
||||
eval {
|
||||
foo("O")
|
||||
foo(foo, 1)
|
||||
}()
|
||||
}
|
||||
}
|
||||
|
||||
test()
|
||||
|
||||
+3
-1
@@ -1,7 +1,9 @@
|
||||
// !LANGUAGE: +InlineClasses
|
||||
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
inline class R(private val r: Int) {
|
||||
fun test() = { ok() }()
|
||||
fun test() = eval { ok() }
|
||||
|
||||
private fun ok() = "OK"
|
||||
}
|
||||
|
||||
+3
-1
@@ -1,7 +1,9 @@
|
||||
// !LANGUAGE: +InlineClasses
|
||||
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
inline class R(private val r: Int) {
|
||||
fun test() = { "OK" }()
|
||||
fun test() = eval { "OK" }
|
||||
}
|
||||
|
||||
fun box() = R(0).test()
|
||||
+4
-2
@@ -4,17 +4,19 @@
|
||||
// !LANGUAGE: +InlineClasses
|
||||
// WITH_RUNTIME
|
||||
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
fun box(): String {
|
||||
var uint1 = 1u
|
||||
var uint2 = 2u
|
||||
var uint3 = 3u
|
||||
val uintSet = mutableSetOf(uint1)
|
||||
uintSet.add(uint2);
|
||||
{
|
||||
eval {
|
||||
uintSet.add(uint3)
|
||||
if (!uintSet.contains(1u)) throw AssertionError()
|
||||
if (!uintSet.contains(2u)) throw AssertionError()
|
||||
if (!uintSet.contains(3u)) throw AssertionError()
|
||||
}()
|
||||
}
|
||||
return "OK"
|
||||
}
|
||||
+6
-4
@@ -1,13 +1,15 @@
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
class A {
|
||||
fun bar(): Any {
|
||||
return {
|
||||
{
|
||||
return eval {
|
||||
eval {
|
||||
class Local : Inner() {
|
||||
override fun toString() = foo()
|
||||
}
|
||||
Local()
|
||||
}()
|
||||
}()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
open inner class Inner
|
||||
|
||||
Vendored
+6
-4
@@ -1,12 +1,14 @@
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
class A {
|
||||
fun bar(): Any {
|
||||
return {
|
||||
{
|
||||
return eval {
|
||||
eval {
|
||||
object : Inner() {
|
||||
override fun toString() = foo()
|
||||
}
|
||||
}()
|
||||
}()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
open inner class Inner
|
||||
|
||||
@@ -5,13 +5,13 @@
|
||||
// CHECK_BYTECODE_TEXT
|
||||
// JVM_IR_TEMPLATES
|
||||
// 0 java/lang/invoke/LambdaMetafactory\.metafactory
|
||||
// 1 final class BigArityLambdaKt\$box\$1
|
||||
// 1 final class BigArityLambdaKt\$box\$lam\$1
|
||||
|
||||
fun box() =
|
||||
{ p0: String, p1: String, p2: Int, p3: Int, p4: Int, p5: Int, p6: Int, p7: Int, p8: Int, p9: Int,
|
||||
p10: Int, p11: Int, p12: Int, p13: Int, p14: Int, p15: Int, p16: Int, p17: Int, p18: Int, p19: Int,
|
||||
p20: Int, p21: Int, p22: Int, p23: Int, p24: Int, p25: Int, p26: Int, p27: Int, p28: Int, p29: Int
|
||||
fun box(): String {
|
||||
val lam = { p0: String, p1: String, p2: Int, p3: Int, p4: Int, p5: Int, p6: Int, p7: Int, p8: Int, p9: Int,
|
||||
p10: Int, p11: Int, p12: Int, p13: Int, p14: Int, p15: Int, p16: Int, p17: Int, p18: Int, p19: Int,
|
||||
p20: Int, p21: Int, p22: Int, p23: Int, p24: Int, p25: Int, p26: Int, p27: Int, p28: Int, p29: Int
|
||||
-> p0 + p1
|
||||
}(
|
||||
"O", "K", 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29
|
||||
)
|
||||
}
|
||||
return lam("O", "K", 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29)
|
||||
}
|
||||
@@ -8,5 +8,6 @@
|
||||
|
||||
fun box(): String {
|
||||
val ok = "OK"
|
||||
return { ok }()
|
||||
val lam = { ok }
|
||||
return lam()
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
fun box(): String {
|
||||
var ok = "Failed"
|
||||
{ ok = "OK" }()
|
||||
val lam = { ok = "OK" }
|
||||
lam()
|
||||
return ok
|
||||
}
|
||||
|
||||
@@ -6,4 +6,11 @@
|
||||
// JVM_IR_TEMPLATES
|
||||
// 3 java/lang/invoke/LambdaMetafactory
|
||||
|
||||
fun box() = { { "O" }() + { "K" }() }()
|
||||
fun box(): String {
|
||||
val lam1 = {
|
||||
val lamO = { "O" }
|
||||
val lamK = { "K" }
|
||||
lamO() + lamK()
|
||||
}
|
||||
return lam1()
|
||||
}
|
||||
|
||||
+2
-1
@@ -7,7 +7,8 @@
|
||||
// 1 java/lang/invoke/LambdaMetafactory
|
||||
|
||||
fun box(): String {
|
||||
val test = { i: Int -> i + 40 }(2)
|
||||
val lam = { i: Int -> i + 40 }
|
||||
val test = lam(2)
|
||||
if (test != 42) return "Failed: test=$test"
|
||||
|
||||
return "OK"
|
||||
|
||||
@@ -6,4 +6,7 @@
|
||||
// JVM_IR_TEMPLATES
|
||||
// 1 java/lang/invoke/LambdaMetafactory
|
||||
|
||||
fun box() = { "OK" }()
|
||||
fun box(): String {
|
||||
val lam = { "OK" }
|
||||
return lam()
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
var ok = "Failed"
|
||||
|
||||
fun box(): String {
|
||||
{ ok = "OK" }()
|
||||
val lam = { ok = "OK" }
|
||||
lam()
|
||||
return ok
|
||||
}
|
||||
|
||||
@@ -5,12 +5,13 @@
|
||||
@JvmField public val publicField = "1";
|
||||
@JvmField internal val internalField = "23";
|
||||
|
||||
fun test(): String {
|
||||
return {
|
||||
publicField + internalField
|
||||
}()
|
||||
}
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
fun test(): String {
|
||||
return eval {
|
||||
publicField + internalField
|
||||
}
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
return if (test() == "123") return "OK" else "fail"
|
||||
|
||||
+5
-5
@@ -1,16 +1,16 @@
|
||||
package a.b
|
||||
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
interface Test {
|
||||
fun invoke(): String {
|
||||
return "OK"
|
||||
}
|
||||
}
|
||||
|
||||
private val a : Test = {
|
||||
object : Test {
|
||||
|
||||
}
|
||||
}()
|
||||
private val a : Test = eval {
|
||||
object : Test {}
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
return a.invoke();
|
||||
|
||||
+4
-2
@@ -1,5 +1,7 @@
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
class A(
|
||||
val a: String = {
|
||||
val a: String = eval {
|
||||
open class B() {
|
||||
open fun s() : String = "O"
|
||||
}
|
||||
@@ -9,7 +11,7 @@ class A(
|
||||
}
|
||||
|
||||
B().s() + o.s()
|
||||
}()
|
||||
}
|
||||
)
|
||||
|
||||
fun box() : String {
|
||||
|
||||
+3
-1
@@ -1,12 +1,14 @@
|
||||
// !LANGUAGE: +ProperVisibilityForCompanionObjectInstanceField
|
||||
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
class Outer {
|
||||
private companion object {
|
||||
val result = "OK"
|
||||
}
|
||||
|
||||
class Nested {
|
||||
fun foo() = { result }()
|
||||
fun foo() = eval { result }
|
||||
}
|
||||
|
||||
fun test() = Nested().foo()
|
||||
|
||||
+4
-2
@@ -1,12 +1,14 @@
|
||||
interface T
|
||||
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
object Foo {
|
||||
private fun foo(p: T) = p
|
||||
|
||||
private val v: Int = {
|
||||
private val v: Int = eval {
|
||||
val x = foo(O)
|
||||
42
|
||||
}()
|
||||
}
|
||||
|
||||
private object O : T
|
||||
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
private var x = "O"
|
||||
private fun f() = "K"
|
||||
|
||||
fun box() = { x + f() }()
|
||||
fun box() = eval { x + f() }
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
public open class Outer private constructor(val s: String) {
|
||||
|
||||
companion object {
|
||||
fun test () = { Outer("OK") }()
|
||||
fun test () = eval { Outer("OK") }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
+3
-1
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+3
-1
@@ -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
@@ -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
@@ -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
@@ -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 }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+3
-1
@@ -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
|
||||
|
||||
Vendored
+3
-1
@@ -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!! }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}()
|
||||
}
|
||||
|
||||
+3
-1
@@ -1,7 +1,9 @@
|
||||
inline fun myRun(x: () -> String) = x()
|
||||
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
class C {
|
||||
val x = myRun { { "OK" }() }
|
||||
val x = myRun { eval { "OK" } }
|
||||
|
||||
constructor(y: Int)
|
||||
constructor(y: String)
|
||||
|
||||
+3
-1
@@ -1,3 +1,5 @@
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
class C {
|
||||
companion object {
|
||||
private val s: String
|
||||
@@ -17,5 +19,5 @@ class C {
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
return C.foo() + {C.bar2(); C.foo2()}()
|
||||
return C.foo() + eval { C.bar2(); C.foo2() }
|
||||
}
|
||||
+12
-11
@@ -32,24 +32,25 @@ package anotherPackage
|
||||
import Base.Derived
|
||||
import Base
|
||||
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
class Kotlin : Base.Derived() {
|
||||
fun doTest(): String {
|
||||
|
||||
if ({ TEST }() != "DERIVED") return "fail 1"
|
||||
if ({ test() }() != "DERIVED") return "fail 2"
|
||||
if (eval { TEST } != "DERIVED") return "fail 1"
|
||||
if (eval { test() } != "DERIVED") return "fail 2"
|
||||
|
||||
if ({ Derived.TEST }() != "DERIVED") return "fail 3"
|
||||
if ({ Derived.test() }() != "DERIVED") return "fail 4"
|
||||
if (eval { Derived.TEST } != "DERIVED") return "fail 3"
|
||||
if (eval { Derived.test() } != "DERIVED") return "fail 4"
|
||||
|
||||
if ({ Base.TEST }() != "BASE") return "fail 5"
|
||||
if ({ Base.test() }() != "BASE") return "fail 6"
|
||||
if (eval { Base.TEST } != "BASE") return "fail 5"
|
||||
if (eval { Base.test() } != "BASE") return "fail 6"
|
||||
|
||||
if (eval { Base.BASE_ONLY } != "BASE") return "fail 7"
|
||||
if (eval { Base.baseOnly() } != "BASE") return "fail 8"
|
||||
|
||||
if ({ Base.BASE_ONLY }() != "BASE") return "fail 7"
|
||||
if ({ Base.baseOnly() }() != "BASE") return "fail 8"
|
||||
|
||||
if ({ BASE_ONLY }() != "BASE") return "fail 9"
|
||||
if ({ baseOnly() }() != "BASE") return "fail 10"
|
||||
if (eval { BASE_ONLY } != "BASE") return "fail 9"
|
||||
if (eval { baseOnly() } != "BASE") return "fail 10"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
|
||||
+5
-11
@@ -1,20 +1,14 @@
|
||||
open class C(s: Int) {
|
||||
fun test() {
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
}
|
||||
open class C(s: Int) {
|
||||
fun test() {}
|
||||
}
|
||||
|
||||
class B(var x: Int) {
|
||||
fun foo() {
|
||||
class A(val a: Int) : C({a}()) {
|
||||
|
||||
}
|
||||
class A(val a: Int) : C(eval { a })
|
||||
A(11).test()
|
||||
|
||||
|
||||
class B(val a: Int) : C(a) {
|
||||
}
|
||||
|
||||
class B(val a: Int) : C(a)
|
||||
B(11).test()
|
||||
}
|
||||
}
|
||||
|
||||
+3
-1
@@ -1,8 +1,10 @@
|
||||
// FILE: 1.kt
|
||||
import a.*
|
||||
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
abstract class B : A() {
|
||||
fun g() = { f() }()
|
||||
fun g() = eval { f() }
|
||||
}
|
||||
|
||||
fun box() = object : B() {
|
||||
|
||||
@@ -5,13 +5,15 @@ package test2
|
||||
import test.Actor
|
||||
import test.O2dScriptAction
|
||||
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
class CompositeActor : Actor()
|
||||
|
||||
public open class O2dDialog : O2dScriptAction<CompositeActor>() {
|
||||
|
||||
fun test() = { owner }()
|
||||
fun test() = eval { owner }
|
||||
|
||||
fun test2() = { calc() }()
|
||||
fun test2() = eval { calc() }
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
class Foo {
|
||||
private val fld: String = "O"
|
||||
get() = { field }() + "K"
|
||||
get() = eval { field } + "K"
|
||||
|
||||
val indirectFldGetter: () -> String = { fld }
|
||||
}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
class Foo {
|
||||
private val fld: String = "O"
|
||||
get() = { field }() + "K"
|
||||
get() = eval { field } + "K"
|
||||
|
||||
val indirectFldGetter: () -> String = { fld }
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
package test
|
||||
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
private val prop = "O"
|
||||
|
||||
private fun test() = "K"
|
||||
|
||||
fun box(): String {
|
||||
return {
|
||||
prop + test()
|
||||
}()
|
||||
return eval { prop + test() }
|
||||
}
|
||||
+3
-3
@@ -5,12 +5,12 @@
|
||||
@file:kotlin.jvm.JvmName("TestKt")
|
||||
package test
|
||||
|
||||
fun <T> eval(fn: () -> T) = fn()
|
||||
|
||||
private val prop = "O"
|
||||
|
||||
private fun test() = "K"
|
||||
|
||||
fun box(): String {
|
||||
return {
|
||||
prop + test()
|
||||
}()
|
||||
return eval { prop + test() }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user