diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt index bb49f784027..38d66717c51 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt @@ -338,7 +338,11 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext) modality = Modality.FINAL isSuspend = false isInline = false - origin = JvmLoweredDeclarationOrigin.PROXY_FUN_FOR_INDY_SAM_CONVERSION + origin = + if (targetFun.isInline || targetFun.isArrayOf()) + JvmLoweredDeclarationOrigin.PROXY_FUN_FOR_METAFACTORY + else + JvmLoweredDeclarationOrigin.SYNTHETIC_PROXY_FUN_FOR_METAFACTORY }.also { proxyFun -> proxyFun.parent = currentDeclarationParent ?: throw AssertionError("No declaration parent when processing $reference") diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/indy/LambdaMetafactoryArguments.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/indy/LambdaMetafactoryArguments.kt index e1f1ff611e5..03950c94a70 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/indy/LambdaMetafactoryArguments.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/indy/LambdaMetafactoryArguments.kt @@ -382,7 +382,8 @@ internal class LambdaMetafactoryArgumentsBuilder( private val adaptableFunctionOrigins = setOf( IrDeclarationOrigin.LOCAL_FUNCTION_FOR_LAMBDA, - JvmLoweredDeclarationOrigin.PROXY_FUN_FOR_INDY_SAM_CONVERSION + JvmLoweredDeclarationOrigin.PROXY_FUN_FOR_METAFACTORY, + JvmLoweredDeclarationOrigin.SYNTHETIC_PROXY_FUN_FOR_METAFACTORY ) private fun adaptLambdaSignature( diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLoweredDeclarationOrigin.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLoweredDeclarationOrigin.kt index be43262e717..dc582fd2944 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLoweredDeclarationOrigin.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLoweredDeclarationOrigin.kt @@ -48,5 +48,6 @@ interface JvmLoweredDeclarationOrigin : IrDeclarationOrigin { object ABSTRACT_BRIDGE_STUB : IrDeclarationOriginImpl("ABSTRACT_BRIDGE_STUB") object INVOKEDYNAMIC_CALL_TARGET : IrDeclarationOriginImpl("INVOKEDYNAMIC_CALL_TARGET") object INLINE_LAMBDA : IrDeclarationOriginImpl("INLINE_LAMBDA") - object PROXY_FUN_FOR_INDY_SAM_CONVERSION : IrDeclarationOriginImpl("PROXY_FUN_FOR_INDY_SAM_CONVERSION", isSynthetic = true) + object PROXY_FUN_FOR_METAFACTORY : IrDeclarationOriginImpl("PROXY_FUN_FOR_METAFACTORY") + object SYNTHETIC_PROXY_FUN_FOR_METAFACTORY : IrDeclarationOriginImpl("SYNTHETIC_PROXY_FUN_FOR_METAFACTORY", isSynthetic = true) } diff --git a/compiler/testData/codegen/bytecodeListing/sam/indySamConversionViaProxyFun.kt b/compiler/testData/codegen/bytecodeListing/sam/indySamConversionViaProxyFun.kt index 79993e3bce1..63a9f73e8b5 100644 --- a/compiler/testData/codegen/bytecodeListing/sam/indySamConversionViaProxyFun.kt +++ b/compiler/testData/codegen/bytecodeListing/sam/indySamConversionViaProxyFun.kt @@ -1,15 +1,34 @@ // IGNORE_BACKEND: JVM // FILE: indySamConversionViaProxyFun.kt.kt +inline fun ifn() {} + fun test() { - use(Sam(String?::plus)) - use(Sam(String?::plus)) - use(Sam(String?::plus)) + // Proxy functions shouldn't clash + use(Sam1(String?::plus)) + use(Sam1(String?::plus)) + use(Sam1(String?::plus)) + + // Proxy function for inline fun should be non-synthetic + use(Sam2(::ifn)) + + // Proxy function for arrayOf fun should be non-synthetic + use(Sam3(::intArrayOf)) } -fun use(s: Sam) {} +fun use(x: Any) {} -// FILE: Sam.java -public interface Sam { +// FILE: Sam1.java +public interface Sam1 { String get(String x, Object y); } + +// FILE: Sam2.java +public interface Sam2 { + void run(); +} + +// FILE: Sam3.java +public interface Sam3 { + int[] get(int[] s); +} \ No newline at end of file diff --git a/compiler/testData/codegen/bytecodeListing/sam/indySamConversionViaProxyFun.txt b/compiler/testData/codegen/bytecodeListing/sam/indySamConversionViaProxyFun.txt index 051a4b9344a..18f49f907f7 100644 --- a/compiler/testData/codegen/bytecodeListing/sam/indySamConversionViaProxyFun.txt +++ b/compiler/testData/codegen/bytecodeListing/sam/indySamConversionViaProxyFun.txt @@ -1,9 +1,12 @@ @kotlin.Metadata public final class IndySamConversionViaProxyFun_ktKt { // source: 'indySamConversionViaProxyFun.kt.kt' + public final static method ifn(): void + private final static method test$ifn__proxy(): void + private varargs final static method test$intArrayOf__proxy(p0: int[]): int[] private synthetic final static method test$plus__proxy(p0: java.lang.String, p1: java.lang.Object): java.lang.String private synthetic final static method test$plus__proxy-0(p0: java.lang.String, p1: java.lang.Object): java.lang.String private synthetic final static method test$plus__proxy-1(p0: java.lang.String, p1: java.lang.Object): java.lang.String public final static method test(): void - public final static method use(@org.jetbrains.annotations.NotNull p0: Sam): void + public final static method use(@org.jetbrains.annotations.NotNull p0: java.lang.Object): void }