KT-53090 Support -Xlambdas=indy for anonymous functions

This commit is contained in:
Pavel Mikhailovskii
2022-07-11 11:09:49 +02:00
committed by teamcity
parent 2693a29ab6
commit fd5800e8b5
8 changed files with 158 additions and 8 deletions
@@ -0,0 +1,22 @@
// LAMBDAS: INDY
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_STDLIB
// CHECK_BYTECODE_TEXT
// JVM_IR_TEMPLATES
// 0 java/lang/invoke/LambdaMetafactory
import kotlin.jvm.internal.Lambda
@Target(AnnotationTarget.EXPRESSION)
@Retention(AnnotationRetention.SOURCE)
public annotation class SomeAnnotation
fun box(): String {
assert((@SomeAnnotation {}) is Lambda<*>)
assert((@SomeAnnotation fun () {}) is Lambda<*>)
assert((@SomeAnnotation fun Any.() {}) is Lambda<*>)
return "OK"
}
@@ -0,0 +1,31 @@
// LAMBDAS: INDY
// TARGET_BACKEND: JVM_IR
// JVM_TARGET: 1.8
// WITH_STDLIB
// CHECK_BYTECODE_TEXT
// JVM_IR_TEMPLATES
// 0 java/lang/invoke/LambdaMetafactory
fun box(): String {
suspend {}
fun (a: Any, b: Any, c: Any, d: Any, e: Any, f: Any, g: Any, h: Any, i: Any, j: Any, k: Any, l: Any, m: Any, n: Any, o: Any,
p: Any, q: Any, r: Any, s: Any, t: Any, u: Any, v: Any, w: Any) = "one too many"
fun Any.(a: Any, b: Any, c: Any, d: Any, e: Any, f: Any, g: Any, h: Any, i: Any, j: Any, k: Any, l: Any, m: Any, n: Any, o: Any,
p: Any, q: Any, r: Any, s: Any, t: Any, u: Any, v: Any) = "one too many"
{ a: Any, b: Any, c: Any, d: Any, e: Any, f: Any, g: Any, h: Any, i: Any, j: Any, k: Any, l: Any, m: Any, n: Any, o: Any,
p: Any, q: Any, r: Any, s: Any, t: Any, u: Any, v: Any, w: Any -> "one too many" }
fun local(a: Any, b: Any, c: Any, d: Any, e: Any, f: Any, g: Any, h: Any, i: Any, j: Any, k: Any, l: Any, m: Any, n: Any, o: Any,
p: Any, q: Any, r: Any, s: Any, t: Any, u: Any, v: Any, w: Any) = "one too many"
{ a: Any, b: Any, c: Any, d: Any, e: Any, f: Any, g: Any, h: Any, i: Any, j: Any, k: Any, l: Any, m: Any, n: Any, o: Any,
p: Any, q: Any, r: Any, s: Any, t: Any, u: Any, v: Any, w: Any ->
local(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w)
}
return "OK"
}
@@ -0,0 +1,47 @@
// LAMBDAS: INDY
// TARGET_BACKEND: JVM_IR
// JVM_TARGET: 1.8
// WITH_STDLIB
// CHECK_BYTECODE_TEXT
// JVM_IR_TEMPLATES
// 14 java/lang/invoke/LambdaMetafactory
fun box(): String {
var captureMe = 0
fun () {} // 1
fun (a: Any, b: Any, c: Any, d: Any, e: Any, f: Any, g: Any, h: Any, i: Any, j: Any, k: Any, l: Any, m: Any, n: Any, o: Any,
p: Any, q: Any, r: Any, s: Any, t: Any, u: Any, v: Any) = "just enough" // 2
fun () = ++captureMe // 3
fun (vararg x: Int) = x // 4
fun Any.() {} // 5
fun Any.(a: Any, b: Any, c: Any, d: Any, e: Any, f: Any, g: Any, h: Any, i: Any, j: Any, k: Any, l: Any, m: Any, n: Any, o: Any,
p: Any, q: Any, r: Any, s: Any, t: Any, u: Any) = "just enough" // 6
fun () = ++captureMe // 7
fun Any.(vararg x: Int) = x // 8
{} // 9
{ a: Any, b: Any, c: Any, d: Any, e: Any, f: Any, g: Any, h: Any, i: Any, j: Any, k: Any, l: Any, m: Any, n: Any, o: Any,
p: Any, q: Any, r: Any, s: Any, t: Any, u: Any, v: Any -> "just enough" } // 10
{ ++captureMe } // 11
fun local1() {}
{ local1() } // 12
fun local2(a: Any, b: Any, c: Any, d: Any, e: Any, f: Any, g: Any, h: Any, i: Any, j: Any, k: Any, l: Any, m: Any, n: Any, o: Any,
p: Any, q: Any, r: Any, s: Any, t: Any, u: Any, v: Any) = "just enough"
{ a: Any, b: Any, c: Any, d: Any, e: Any, f: Any, g: Any, h: Any, i: Any, j: Any, k: Any, l: Any, m: Any, n: Any, o: Any,
p: Any, q: Any, r: Any, s: Any, t: Any, u: Any, v: Any ->
local2(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v)
} // 13
fun local3() = ++captureMe
{ local3() } // 14
return "OK"
}