diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/TypeOperatorLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/TypeOperatorLowering.kt index a37155c49db..32f8a3ce774 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/TypeOperatorLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/TypeOperatorLowering.kt @@ -264,6 +264,7 @@ private class TypeOperatorLowering(private val context: JvmBackendContext) : Fil val deserializeLambdaFun = context.irFactory.buildFun { name = Name.identifier("\$deserializeLambda\$") visibility = DescriptorVisibilities.PRIVATE + origin = JvmLoweredDeclarationOrigin.DESERIALIZE_LAMBDA_FUN } deserializeLambdaFun.parent = irClass val lambdaParameter = deserializeLambdaFun.addValueParameter("lambda", context.ir.symbols.serializedLambda.irType) 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 dc582fd2944..4a277f2b475 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 @@ -50,4 +50,5 @@ interface JvmLoweredDeclarationOrigin : IrDeclarationOrigin { object INLINE_LAMBDA : IrDeclarationOriginImpl("INLINE_LAMBDA") object PROXY_FUN_FOR_METAFACTORY : IrDeclarationOriginImpl("PROXY_FUN_FOR_METAFACTORY") object SYNTHETIC_PROXY_FUN_FOR_METAFACTORY : IrDeclarationOriginImpl("SYNTHETIC_PROXY_FUN_FOR_METAFACTORY", isSynthetic = true) + object DESERIALIZE_LAMBDA_FUN : IrDeclarationOriginImpl("DESERIALIZE_LAMBDA_FUN", isSynthetic = true) } diff --git a/compiler/testData/codegen/bytecodeListing/deserializeLambdaMethod.kt b/compiler/testData/codegen/bytecodeListing/deserializeLambdaMethod.kt new file mode 100644 index 00000000000..285c178ab27 --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/deserializeLambdaMethod.kt @@ -0,0 +1,17 @@ +// IGNORE_BACKEND: JVM + +// FILE: deserializeLambdaMethod.kt + +fun plusK(s: String) = s + "K" + +// Creating a serializable lambda causes '$deserializeLambda$' method to be generated in the corresponding class. +// Given equivalent code, javac generates +// private static synthetic $deserializeLambda$(Ljava/lang/invoke/SerializedLambda;)Ljava/lang/Object; +val test = Sam(::plusK) + +// FILE: Sam.java +import java.io.*; + +public interface Sam extends Serializable { + String get(String s); +} diff --git a/compiler/testData/codegen/bytecodeListing/deserializeLambdaMethod.txt b/compiler/testData/codegen/bytecodeListing/deserializeLambdaMethod.txt new file mode 100644 index 00000000000..7c3b05f00ce --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/deserializeLambdaMethod.txt @@ -0,0 +1,9 @@ +@kotlin.Metadata +public final class DeserializeLambdaMethodKt { + // source: 'deserializeLambdaMethod.kt' + private final static @org.jetbrains.annotations.NotNull field test: Sam + private synthetic final static method $deserializeLambda$(p0: java.lang.invoke.SerializedLambda): java.lang.Object + static method (): void + public final static @org.jetbrains.annotations.NotNull method getTest(): Sam + public final static @org.jetbrains.annotations.NotNull method plusK(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.String +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BytecodeListingTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BytecodeListingTestGenerated.java index 3589c569455..016e2528b98 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BytecodeListingTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BytecodeListingTestGenerated.java @@ -97,6 +97,12 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest { runTest("compiler/testData/codegen/bytecodeListing/delegationToJavaInterfaceWithWildcardType.kt"); } + @Test + @TestMetadata("deserializeLambdaMethod.kt") + public void testDeserializeLambdaMethod() throws Exception { + runTest("compiler/testData/codegen/bytecodeListing/deserializeLambdaMethod.kt"); + } + @Test @TestMetadata("enum.kt") public void testEnum() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBytecodeListingTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBytecodeListingTestGenerated.java index 8a3dc7beed7..749c32566ca 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBytecodeListingTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBytecodeListingTestGenerated.java @@ -97,6 +97,12 @@ public class IrBytecodeListingTestGenerated extends AbstractIrBytecodeListingTes runTest("compiler/testData/codegen/bytecodeListing/delegationToJavaInterfaceWithWildcardType.kt"); } + @Test + @TestMetadata("deserializeLambdaMethod.kt") + public void testDeserializeLambdaMethod() throws Exception { + runTest("compiler/testData/codegen/bytecodeListing/deserializeLambdaMethod.kt"); + } + @Test @TestMetadata("enum.kt") public void testEnum() throws Exception {