JVM_IR KT-45581 generate H_INVOKEINTERFACE for interface method handles
This commit is contained in:
+13
-1
@@ -143,7 +143,7 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("javaAnnotatestInferenceWithTypeVariableInsideCapturedType tionArrayValueDefault.kt")
|
@TestMetadata("javaAnnotationArrayValueDefault.kt")
|
||||||
public void testJavaAnnotationArrayValueDefault() throws Exception {
|
public void testJavaAnnotationArrayValueDefault() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/annotations/javaAnnotationArrayValueDefault.kt");
|
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");
|
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
|
@Test
|
||||||
@TestMetadata("localFunction1.kt")
|
@TestMetadata("localFunction1.kt")
|
||||||
public void testLocalFunction1() throws Exception {
|
public void testLocalFunction1() throws Exception {
|
||||||
|
|||||||
+2
@@ -111,6 +111,8 @@ object JvmInvokeDynamic : IntrinsicMethod() {
|
|||||||
Opcodes.H_NEWINVOKESPECIAL
|
Opcodes.H_NEWINVOKESPECIAL
|
||||||
irFun.dispatchReceiverParameter == null ->
|
irFun.dispatchReceiverParameter == null ->
|
||||||
Opcodes.H_INVOKESTATIC
|
Opcodes.H_INVOKESTATIC
|
||||||
|
irParentClass.isJvmInterface ->
|
||||||
|
Opcodes.H_INVOKEINTERFACE
|
||||||
else ->
|
else ->
|
||||||
Opcodes.H_INVOKEVIRTUAL
|
Opcodes.H_INVOKEVIRTUAL
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+18
@@ -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);
|
||||||
|
}
|
||||||
+20
@@ -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<String>()::contains)
|
||||||
|
|
||||||
|
// FILE: J.java
|
||||||
|
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
public class J {
|
||||||
|
public static String bar(Predicate<String> predicate) {
|
||||||
|
return "OK";
|
||||||
|
}
|
||||||
|
}
|
||||||
+12
@@ -20504,6 +20504,18 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/intReturnTypeAsNumber.kt");
|
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
|
@Test
|
||||||
@TestMetadata("localFunction1.kt")
|
@TestMetadata("localFunction1.kt")
|
||||||
public void testLocalFunction1() throws Exception {
|
public void testLocalFunction1() throws Exception {
|
||||||
|
|||||||
+12
@@ -20504,6 +20504,18 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/intReturnTypeAsNumber.kt");
|
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
|
@Test
|
||||||
@TestMetadata("localFunction1.kt")
|
@TestMetadata("localFunction1.kt")
|
||||||
public void testLocalFunction1() throws Exception {
|
public void testLocalFunction1() throws Exception {
|
||||||
|
|||||||
+10
@@ -17179,6 +17179,16 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/intReturnTypeAsNumber.kt");
|
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")
|
@TestMetadata("localFunction1.kt")
|
||||||
public void testLocalFunction1() throws Exception {
|
public void testLocalFunction1() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/localFunction1.kt");
|
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/localFunction1.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user