JVM_IR wrap function into a proxy if indy SAM-conversion becomes valid

This commit is contained in:
Dmitry Petrov
2021-10-06 18:53:29 +03:00
committed by teamcityserver
parent 9ad62eb1fd
commit 40fe67880b
21 changed files with 583 additions and 66 deletions
@@ -0,0 +1,21 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: INDY
// CHECK_BYTECODE_TEXT
// JVM_IR_TEMPLATES
// 1 java/lang/invoke/LambdaMetafactory
// FILE: genericBoundInnerConstructorRef.kt
class Outer<TO>(val s1: TO) {
inner class Inner<TI>(val s2: TI) {
fun t() = s1.toString() + s2.toString()
}
}
fun box() = Sam(Outer("O")::Inner).get("K").t()
// FILE: Sam.java
public interface Sam<TO, TI> {
Outer<TO>.Inner<TI> get(String s);
}
@@ -0,0 +1,24 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: INDY
// CHECK_BYTECODE_TEXT
// JVM_IR_TEMPLATES
// 1 java/lang/invoke/LambdaMetafactory
// FILE: genericInnerConstructorRef.kt
// Can't resolve generic type argument for unbound constructor reference,
// so 'Outer' has no type parameters.
class Outer(val s1: String) {
inner class Inner<TI>(val s2: TI) {
fun t() = s1 + s2.toString()
}
}
fun box() = Sam(Outer::Inner).get(Outer("O"), "K").t()
// FILE: Sam.java
public interface Sam<TI> {
Outer.Inner<TI> get(Outer outer, String s);
}
@@ -5,7 +5,7 @@
// CHECK_BYTECODE_TEXT
// JVM_IR_TEMPLATES
// 0 java/lang/invoke/LambdaMetafactory
// 1 java/lang/invoke/LambdaMetafactory
// IGNORE_BACKEND_FIR: JVM_IR
// ^ OVERLOAD_RESOLUTION_AMBIGUITY: Overload resolution ambiguity between candidates: [kotlin/collections/plus, kotlin/collections/plus]
@@ -0,0 +1,30 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: INDY
// CHECK_BYTECODE_TEXT
// JVM_IR_TEMPLATES
// 4 java/lang/invoke/LambdaMetafactory
// FILE: voidReturnTypeAsObject.kt
var t = "Failed"
fun ok(s: String) { t = s }
fun box(): String {
Sam(::ok).get("1")
Sam(::ok).get("2")
Sam(::ok).get("3")
val r = Sam(::ok).get("OK")
if (r != Unit) {
return "Failed: $r"
}
return t
}
// FILE: Sam.java
public interface Sam {
Object get(String s);
}
@@ -4,7 +4,7 @@
// CHECK_BYTECODE_TEXT
// JVM_IR_TEMPLATES
// 0 java/lang/invoke/LambdaMetafactory
// 1 java/lang/invoke/LambdaMetafactory
// FILE: anyNToString.kt
fun box() =
@@ -4,7 +4,7 @@
// CHECK_BYTECODE_TEXT
// JVM_IR_TEMPLATES
// 0 java/lang/invoke/LambdaMetafactory
// 1 java/lang/invoke/LambdaMetafactory
// FILE: arrayConstructor.kt
fun box(): String {
@@ -4,7 +4,7 @@
// CHECK_BYTECODE_TEXT
// JVM_IR_TEMPLATES
// 0 java/lang/invoke/LambdaMetafactory
// 1 java/lang/invoke/LambdaMetafactory
// FILE: charArrayOf.kt
fun box(): String {
@@ -0,0 +1,19 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: INDY
// CHECK_BYTECODE_TEXT
// JVM_IR_TEMPLATES
// 1 java/lang/invoke/LambdaMetafactory
// FILE: intArrayOf.kt
fun box(): String {
val sam = Sam(::intArrayOf)
val arr = sam.get(intArrayOf('O'.toInt(), 'K'.toInt()))
return "${arr[0].toChar()}${arr[1].toChar()}"
}
// FILE: Sam.java
public interface Sam {
int[] get(int[] s);
}
@@ -4,7 +4,7 @@
// CHECK_BYTECODE_TEXT
// JVM_IR_TEMPLATES
// 0 java/lang/invoke/LambdaMetafactory
// 1 java/lang/invoke/LambdaMetafactory
// FILE: stringNPlus.kt
fun test(x: String?, y: Any?) =
@@ -4,8 +4,7 @@
// CHECK_BYTECODE_TEXT
// JVM_IR_TEMPLATES
// 0 java/lang/invoke/LambdaMetafactory
// 1 final synthetic class VoidReturnTypeAsObjectKt\$box\$r\$[0-9]+
// 1 java/lang/invoke/LambdaMetafactory
// FILE: voidReturnTypeAsObject.kt
var t = "Failed"