JVM_IR pass reified type parameters in indy SAM conversion proxy

This commit is contained in:
Dmitry Petrov
2021-10-07 12:37:08 +03:00
committed by teamcityserver
parent 40fe67880b
commit 005d3b1f6f
15 changed files with 221 additions and 7 deletions
@@ -22498,12 +22498,42 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/genericBoundInnerConstructorRef.kt");
}
@Test
@TestMetadata("genericFunRef.kt")
public void testGenericFunRef() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/genericFunRef.kt");
}
@Test
@TestMetadata("genericInnerConstructorRef.kt")
public void testGenericInnerConstructorRef() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/genericInnerConstructorRef.kt");
}
@Test
@TestMetadata("highOrderFunRef.kt")
public void testHighOrderFunRef() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/highOrderFunRef.kt");
}
@Test
@TestMetadata("inlineFunRef.kt")
public void testInlineFunRef() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/inlineFunRef.kt");
}
@Test
@TestMetadata("inlineFunWithReifiedTypeParameterRef.kt")
public void testInlineFunWithReifiedTypeParameterRef() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/inlineFunWithReifiedTypeParameterRef.kt");
}
@Test
@TestMetadata("inlineHighOrderFunRef.kt")
public void testInlineHighOrderFunRef() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/inlineHighOrderFunRef.kt");
}
@Test
@TestMetadata("innerConstructorRef.kt")
public void testInnerConstructorRef() throws Exception {
@@ -332,7 +332,7 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext)
}
val proxyFun = context.irFactory.buildFun {
name = Name.identifier("\$proxy")
name = Name.identifier("${targetFun.name.asString()}__proxy")
returnType = targetFun.returnType
visibility = DescriptorVisibilities.LOCAL
modality = Modality.FINAL
@@ -395,6 +395,10 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext)
)
}
for (typeParameterIndex in targetFun.typeParameters.indices) {
targetCall.putTypeArgument(typeParameterIndex, reference.getTypeArgument(typeParameterIndex))
}
val proxyFunBody = IrBlockBodyImpl(startOffset, endOffset).also { proxyFun.body = it }
when {
targetFun.isArrayOf() -> {
@@ -132,8 +132,7 @@ internal class LambdaMetafactoryArgumentsBuilder(
val implFun = reference.symbol.owner
if (implFun.typeParameters.any { it.isReified }) {
// TODO support reified type parameters in proxy wrappers somehow?
abiHazard = true
functionHazard = true
}
// Don't generate references to intrinsic functions as invokedynamic (no such method exists at run-time).
@@ -0,0 +1,18 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: INDY
// CHECK_BYTECODE_TEXT
// JVM_IR_TEMPLATES
// 1 java/lang/invoke/LambdaMetafactory
// FILE: genericFunRef.kt
fun <T> plusK(x: T) = x.toString() + "K"
fun box() = J(::plusK).apply("O")
// FILE: J.java
public interface J {
public String apply(String x);
}
@@ -0,0 +1,19 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: INDY
// WITH_RUNTIME
// CHECK_BYTECODE_TEXT
// JVM_IR_TEMPLATES
// 1 java/lang/invoke/LambdaMetafactory
// FILE: highOrderFunRef.kt
fun applyO(fn: (String) -> String) = fn("O")
fun box() = J(::applyO).invoke { it + "K" }
// FILE: J.java
public interface J {
String invoke(kotlin.jvm.functions.Function1<String, String> fn);
}
@@ -0,0 +1,18 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: INDY
// CHECK_BYTECODE_TEXT
// JVM_IR_TEMPLATES
// 1 java/lang/invoke/LambdaMetafactory
// FILE: inlineFunRef.kt
inline fun plusK(x: String) = x.toString() + "K"
fun box() = J(::plusK).apply("O")
// FILE: J.java
public interface J {
public String apply(String x);
}
@@ -0,0 +1,22 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: INDY
// WITH_RUNTIME
// FULL_JDK
// CHECK_BYTECODE_TEXT
// JVM_IR_TEMPLATES
// 1 java/lang/invoke/LambdaMetafactory
// FILE: inlineFunWithReifiedTypeParameterRef.kt
inline fun <reified T> oPlus(x: T) = "O" + T::class.java.simpleName
class K
fun box() = J(::oPlus).apply(K())
// FILE: J.java
public interface J {
public String apply(K x);
}
@@ -0,0 +1,19 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: INDY
// WITH_RUNTIME
// CHECK_BYTECODE_TEXT
// JVM_IR_TEMPLATES
// 1 java/lang/invoke/LambdaMetafactory
// FILE: inlineHighOrderFunRef.kt
inline fun applyO(fn: (String) -> String) = fn("O")
fun box() = J(::applyO).invoke { it + "K" }
// FILE: J.java
public interface J {
String invoke(kotlin.jvm.functions.Function1<String, String> fn);
}
@@ -4,7 +4,7 @@
// CHECK_BYTECODE_TEXT
// JVM_IR_TEMPLATES
// 0 java/lang/invoke/LambdaMetafactory
// 1 java/lang/invoke/LambdaMetafactory
// FILE: arrayOf.kt
fun box() =
@@ -4,7 +4,7 @@
// CHECK_BYTECODE_TEXT
// JVM_IR_TEMPLATES
// 0 java/lang/invoke/LambdaMetafactory
// 1 java/lang/invoke/LambdaMetafactory
// FILE: enumValues.kt
enum class ABC(val x: String = "") {
@@ -4,7 +4,7 @@
// CHECK_BYTECODE_TEXT
// JVM_IR_TEMPLATES
// 0 java/lang/invoke/LambdaMetafactory
// 1 java/lang/invoke/LambdaMetafactory
// FILE: enumValues.kt
enum class ABC(val x: String = "") {
@@ -6,7 +6,7 @@
// CHECK_BYTECODE_TEXT
// JVM_IR_TEMPLATES
// 0 java/lang/invoke/LambdaMetafactory
// 1 java/lang/invoke/LambdaMetafactory
// FILE: reifiedTypeParameter.kt
@@ -22360,12 +22360,42 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/genericBoundInnerConstructorRef.kt");
}
@Test
@TestMetadata("genericFunRef.kt")
public void testGenericFunRef() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/genericFunRef.kt");
}
@Test
@TestMetadata("genericInnerConstructorRef.kt")
public void testGenericInnerConstructorRef() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/genericInnerConstructorRef.kt");
}
@Test
@TestMetadata("highOrderFunRef.kt")
public void testHighOrderFunRef() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/highOrderFunRef.kt");
}
@Test
@TestMetadata("inlineFunRef.kt")
public void testInlineFunRef() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/inlineFunRef.kt");
}
@Test
@TestMetadata("inlineFunWithReifiedTypeParameterRef.kt")
public void testInlineFunWithReifiedTypeParameterRef() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/inlineFunWithReifiedTypeParameterRef.kt");
}
@Test
@TestMetadata("inlineHighOrderFunRef.kt")
public void testInlineHighOrderFunRef() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/inlineHighOrderFunRef.kt");
}
@Test
@TestMetadata("innerConstructorRef.kt")
public void testInnerConstructorRef() throws Exception {
@@ -22498,12 +22498,42 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/genericBoundInnerConstructorRef.kt");
}
@Test
@TestMetadata("genericFunRef.kt")
public void testGenericFunRef() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/genericFunRef.kt");
}
@Test
@TestMetadata("genericInnerConstructorRef.kt")
public void testGenericInnerConstructorRef() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/genericInnerConstructorRef.kt");
}
@Test
@TestMetadata("highOrderFunRef.kt")
public void testHighOrderFunRef() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/highOrderFunRef.kt");
}
@Test
@TestMetadata("inlineFunRef.kt")
public void testInlineFunRef() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/inlineFunRef.kt");
}
@Test
@TestMetadata("inlineFunWithReifiedTypeParameterRef.kt")
public void testInlineFunWithReifiedTypeParameterRef() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/inlineFunWithReifiedTypeParameterRef.kt");
}
@Test
@TestMetadata("inlineHighOrderFunRef.kt")
public void testInlineHighOrderFunRef() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/inlineHighOrderFunRef.kt");
}
@Test
@TestMetadata("innerConstructorRef.kt")
public void testInnerConstructorRef() throws Exception {
@@ -18720,11 +18720,36 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/genericBoundInnerConstructorRef.kt");
}
@TestMetadata("genericFunRef.kt")
public void testGenericFunRef() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/genericFunRef.kt");
}
@TestMetadata("genericInnerConstructorRef.kt")
public void testGenericInnerConstructorRef() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/genericInnerConstructorRef.kt");
}
@TestMetadata("highOrderFunRef.kt")
public void testHighOrderFunRef() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/highOrderFunRef.kt");
}
@TestMetadata("inlineFunRef.kt")
public void testInlineFunRef() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/inlineFunRef.kt");
}
@TestMetadata("inlineFunWithReifiedTypeParameterRef.kt")
public void testInlineFunWithReifiedTypeParameterRef() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/inlineFunWithReifiedTypeParameterRef.kt");
}
@TestMetadata("inlineHighOrderFunRef.kt")
public void testInlineHighOrderFunRef() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/inlineHighOrderFunRef.kt");
}
@TestMetadata("innerConstructorRef.kt")
public void testInnerConstructorRef() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/innerConstructorRef.kt");