JVM_IR pass reified type parameters in indy SAM conversion proxy
This commit is contained in:
committed by
teamcityserver
parent
40fe67880b
commit
005d3b1f6f
+30
@@ -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 {
|
||||
|
||||
+5
-1
@@ -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() -> {
|
||||
|
||||
+1
-2
@@ -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).
|
||||
|
||||
Vendored
+18
@@ -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);
|
||||
}
|
||||
Vendored
+19
@@ -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);
|
||||
}
|
||||
+18
@@ -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);
|
||||
}
|
||||
+22
@@ -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);
|
||||
}
|
||||
Vendored
+19
@@ -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);
|
||||
}
|
||||
+1
-1
@@ -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() =
|
||||
|
||||
+1
-1
@@ -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 = "") {
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
|
||||
+30
@@ -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 {
|
||||
|
||||
+30
@@ -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 {
|
||||
|
||||
+25
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user