JVM_IR KT-45779 don't generate intrinsic method refs via invokedynamic

This commit is contained in:
Dmitry Petrov
2021-04-29 13:17:49 +03:00
committed by TeamCityServer
parent f3a935adb9
commit 72804d2e8c
6 changed files with 41 additions and 0 deletions
@@ -21028,6 +21028,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/innerConstructorRef.kt");
}
@Test
@TestMetadata("intPlus.kt")
public void testIntPlus() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/intPlus.kt");
}
@Test
@TestMetadata("intReturnTypeAsNumber.kt")
public void testIntReturnTypeAsNumber() throws Exception {
@@ -72,6 +72,10 @@ internal class LambdaMetafactoryArgumentsBuilder(
val implFun = reference.symbol.owner
// Don't generate references to intrinsic functions as invokedynamic (no such method exists at run-time).
if (context.irIntrinsics.getIntrinsic(implFun.symbol) != null)
return null
if (implFun is IrConstructor && implFun.visibility.isPrivate) {
// Kotlin generates constructor accessors differently from Java.
// TODO more precise accessibility check (see SyntheticAccessorLowering::isAccessible)
@@ -0,0 +1,14 @@
// TARGET_BACKEND: JVM
// IGNORE_BACKEND: ANDROID
// ^ uses API not implemented on minSdkVersion 19
// WITH_RUNTIME
// JVM_TARGET: 1.8
// FULL_JDK
fun box(): String {
val map = HashMap<String, Int>()
map["a"] = 1
map.merge("a", 2, Int::plus)
val t = map["a"]
return if (t == 3) "OK" else "failed: t=$t"
}
@@ -21004,6 +21004,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/innerConstructorRef.kt");
}
@Test
@TestMetadata("intPlus.kt")
public void testIntPlus() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/intPlus.kt");
}
@Test
@TestMetadata("intReturnTypeAsNumber.kt")
public void testIntReturnTypeAsNumber() throws Exception {
@@ -21028,6 +21028,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/innerConstructorRef.kt");
}
@Test
@TestMetadata("intPlus.kt")
public void testIntPlus() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/intPlus.kt");
}
@Test
@TestMetadata("intReturnTypeAsNumber.kt")
public void testIntReturnTypeAsNumber() throws Exception {
@@ -17563,6 +17563,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/innerConstructorRef.kt");
}
@TestMetadata("intPlus.kt")
public void testIntPlus() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/intPlus.kt");
}
@TestMetadata("intReturnTypeAsNumber.kt")
public void testIntReturnTypeAsNumber() throws Exception {
runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/intReturnTypeAsNumber.kt");