From 9e30ddd12eee704822644eb15e3534b96d9d6c43 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Fri, 19 Mar 2021 17:20:48 +0300 Subject: [PATCH] JVM_IR KT-45581 generate H_INVOKEINTERFACE for interface method handles --- .../FirBlackBoxCodegenTestGenerated.java | 14 ++++++++++++- .../jvm/intrinsics/JvmInvokeDynamic.kt | 2 ++ .../interfaceMemberRef.kt | 18 +++++++++++++++++ .../sam/functionRefToJavaInterface/kt45581.kt | 20 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 12 +++++++++++ .../IrBlackBoxCodegenTestGenerated.java | 12 +++++++++++ .../LightAnalysisModeTestGenerated.java | 10 ++++++++++ 7 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/interfaceMemberRef.kt create mode 100644 compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/kt45581.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 00b513aa0f0..9a32f259ba8 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -143,7 +143,7 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT } @Test - @TestMetadata("javaAnnotatestInferenceWithTypeVariableInsideCapturedType tionArrayValueDefault.kt") + @TestMetadata("javaAnnotationArrayValueDefault.kt") public void testJavaAnnotationArrayValueDefault() throws Exception { runTest("compiler/testData/codegen/box/annotations/javaAnnotationArrayValueDefault.kt"); } @@ -20504,6 +20504,18 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/intReturnTypeAsNumber.kt"); } + @Test + @TestMetadata("interfaceMemberRef.kt") + public void testInterfaceMemberRef() throws Exception { + runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/interfaceMemberRef.kt"); + } + + @Test + @TestMetadata("kt45581.kt") + public void testKt45581() throws Exception { + runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/kt45581.kt"); + } + @Test @TestMetadata("localFunction1.kt") public void testLocalFunction1() throws Exception { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/JvmInvokeDynamic.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/JvmInvokeDynamic.kt index f7c11bec877..9ba8cac121f 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/JvmInvokeDynamic.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/JvmInvokeDynamic.kt @@ -111,6 +111,8 @@ object JvmInvokeDynamic : IntrinsicMethod() { Opcodes.H_NEWINVOKESPECIAL irFun.dispatchReceiverParameter == null -> Opcodes.H_INVOKESTATIC + irParentClass.isJvmInterface -> + Opcodes.H_INVOKEINTERFACE else -> Opcodes.H_INVOKEVIRTUAL } diff --git a/compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/interfaceMemberRef.kt b/compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/interfaceMemberRef.kt new file mode 100644 index 00000000000..d8c35b093c9 --- /dev/null +++ b/compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/interfaceMemberRef.kt @@ -0,0 +1,18 @@ +// TARGET_BACKEND: JVM +// JVM_TARGET: 1.8 +// SAM_CONVERSIONS: INDY +// FILE: interfaceMemberRef.kt +interface IFoo { + fun foo(): String +} + +class C(val v: String) : IFoo { + override fun foo(): String = v +} + +fun box() = Sam(IFoo::foo).get(C("OK")) + +// FILE: Sam.java +public interface Sam { + String get(IFoo c); +} diff --git a/compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/kt45581.kt b/compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/kt45581.kt new file mode 100644 index 00000000000..191ebba39cc --- /dev/null +++ b/compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/kt45581.kt @@ -0,0 +1,20 @@ +// TARGET_BACKEND: JVM +// WITH_RUNTIME +// JVM_TARGET: 1.8 +// SAM_CONVERSIONS: INDY +// FULL_JDK +// IGNORE_DEXING +// ^ D8 fails with AssertionError, possible reason: only Kotlin output files are passed to D8 +// FILE: kt45581.kt + +fun box(): String = J.bar(emptySet()::contains) + +// FILE: J.java + +import java.util.function.Predicate; + +public class J { + public static String bar(Predicate predicate) { + return "OK"; + } +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 9863970bf21..2b2ef905566 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -20504,6 +20504,18 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/intReturnTypeAsNumber.kt"); } + @Test + @TestMetadata("interfaceMemberRef.kt") + public void testInterfaceMemberRef() throws Exception { + runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/interfaceMemberRef.kt"); + } + + @Test + @TestMetadata("kt45581.kt") + public void testKt45581() throws Exception { + runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/kt45581.kt"); + } + @Test @TestMetadata("localFunction1.kt") public void testLocalFunction1() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 515dd3d90cb..727a2b552ed 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -20504,6 +20504,18 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/intReturnTypeAsNumber.kt"); } + @Test + @TestMetadata("interfaceMemberRef.kt") + public void testInterfaceMemberRef() throws Exception { + runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/interfaceMemberRef.kt"); + } + + @Test + @TestMetadata("kt45581.kt") + public void testKt45581() throws Exception { + runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/kt45581.kt"); + } + @Test @TestMetadata("localFunction1.kt") public void testLocalFunction1() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 13d5b3350cd..fe71e0d5f1f 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -17179,6 +17179,16 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/intReturnTypeAsNumber.kt"); } + @TestMetadata("interfaceMemberRef.kt") + public void testInterfaceMemberRef() throws Exception { + runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/interfaceMemberRef.kt"); + } + + @TestMetadata("kt45581.kt") + public void testKt45581() throws Exception { + runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/kt45581.kt"); + } + @TestMetadata("localFunction1.kt") public void testLocalFunction1() throws Exception { runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/localFunction1.kt");