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");
|
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
|
@Test
|
||||||
@TestMetadata("genericInnerConstructorRef.kt")
|
@TestMetadata("genericInnerConstructorRef.kt")
|
||||||
public void testGenericInnerConstructorRef() throws Exception {
|
public void testGenericInnerConstructorRef() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/genericInnerConstructorRef.kt");
|
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
|
@Test
|
||||||
@TestMetadata("innerConstructorRef.kt")
|
@TestMetadata("innerConstructorRef.kt")
|
||||||
public void testInnerConstructorRef() throws Exception {
|
public void testInnerConstructorRef() throws Exception {
|
||||||
|
|||||||
+5
-1
@@ -332,7 +332,7 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext)
|
|||||||
}
|
}
|
||||||
|
|
||||||
val proxyFun = context.irFactory.buildFun {
|
val proxyFun = context.irFactory.buildFun {
|
||||||
name = Name.identifier("\$proxy")
|
name = Name.identifier("${targetFun.name.asString()}__proxy")
|
||||||
returnType = targetFun.returnType
|
returnType = targetFun.returnType
|
||||||
visibility = DescriptorVisibilities.LOCAL
|
visibility = DescriptorVisibilities.LOCAL
|
||||||
modality = Modality.FINAL
|
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 }
|
val proxyFunBody = IrBlockBodyImpl(startOffset, endOffset).also { proxyFun.body = it }
|
||||||
when {
|
when {
|
||||||
targetFun.isArrayOf() -> {
|
targetFun.isArrayOf() -> {
|
||||||
|
|||||||
+1
-2
@@ -132,8 +132,7 @@ internal class LambdaMetafactoryArgumentsBuilder(
|
|||||||
val implFun = reference.symbol.owner
|
val implFun = reference.symbol.owner
|
||||||
|
|
||||||
if (implFun.typeParameters.any { it.isReified }) {
|
if (implFun.typeParameters.any { it.isReified }) {
|
||||||
// TODO support reified type parameters in proxy wrappers somehow?
|
functionHazard = true
|
||||||
abiHazard = true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't generate references to intrinsic functions as invokedynamic (no such method exists at run-time).
|
// 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
|
// CHECK_BYTECODE_TEXT
|
||||||
// JVM_IR_TEMPLATES
|
// JVM_IR_TEMPLATES
|
||||||
// 0 java/lang/invoke/LambdaMetafactory
|
// 1 java/lang/invoke/LambdaMetafactory
|
||||||
|
|
||||||
// FILE: arrayOf.kt
|
// FILE: arrayOf.kt
|
||||||
fun box() =
|
fun box() =
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
// CHECK_BYTECODE_TEXT
|
// CHECK_BYTECODE_TEXT
|
||||||
// JVM_IR_TEMPLATES
|
// JVM_IR_TEMPLATES
|
||||||
// 0 java/lang/invoke/LambdaMetafactory
|
// 1 java/lang/invoke/LambdaMetafactory
|
||||||
|
|
||||||
// FILE: enumValues.kt
|
// FILE: enumValues.kt
|
||||||
enum class ABC(val x: String = "") {
|
enum class ABC(val x: String = "") {
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
// CHECK_BYTECODE_TEXT
|
// CHECK_BYTECODE_TEXT
|
||||||
// JVM_IR_TEMPLATES
|
// JVM_IR_TEMPLATES
|
||||||
// 0 java/lang/invoke/LambdaMetafactory
|
// 1 java/lang/invoke/LambdaMetafactory
|
||||||
|
|
||||||
// FILE: enumValues.kt
|
// FILE: enumValues.kt
|
||||||
enum class ABC(val x: String = "") {
|
enum class ABC(val x: String = "") {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
// CHECK_BYTECODE_TEXT
|
// CHECK_BYTECODE_TEXT
|
||||||
// JVM_IR_TEMPLATES
|
// JVM_IR_TEMPLATES
|
||||||
// 0 java/lang/invoke/LambdaMetafactory
|
// 1 java/lang/invoke/LambdaMetafactory
|
||||||
|
|
||||||
// FILE: reifiedTypeParameter.kt
|
// FILE: reifiedTypeParameter.kt
|
||||||
|
|
||||||
|
|||||||
+30
@@ -22360,12 +22360,42 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/genericBoundInnerConstructorRef.kt");
|
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
|
@Test
|
||||||
@TestMetadata("genericInnerConstructorRef.kt")
|
@TestMetadata("genericInnerConstructorRef.kt")
|
||||||
public void testGenericInnerConstructorRef() throws Exception {
|
public void testGenericInnerConstructorRef() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/genericInnerConstructorRef.kt");
|
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
|
@Test
|
||||||
@TestMetadata("innerConstructorRef.kt")
|
@TestMetadata("innerConstructorRef.kt")
|
||||||
public void testInnerConstructorRef() throws Exception {
|
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");
|
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
|
@Test
|
||||||
@TestMetadata("genericInnerConstructorRef.kt")
|
@TestMetadata("genericInnerConstructorRef.kt")
|
||||||
public void testGenericInnerConstructorRef() throws Exception {
|
public void testGenericInnerConstructorRef() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/genericInnerConstructorRef.kt");
|
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
|
@Test
|
||||||
@TestMetadata("innerConstructorRef.kt")
|
@TestMetadata("innerConstructorRef.kt")
|
||||||
public void testInnerConstructorRef() throws Exception {
|
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");
|
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")
|
@TestMetadata("genericInnerConstructorRef.kt")
|
||||||
public void testGenericInnerConstructorRef() throws Exception {
|
public void testGenericInnerConstructorRef() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/genericInnerConstructorRef.kt");
|
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")
|
@TestMetadata("innerConstructorRef.kt")
|
||||||
public void testInnerConstructorRef() throws Exception {
|
public void testInnerConstructorRef() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/innerConstructorRef.kt");
|
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/innerConstructorRef.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user