From 737fbe271f9bf9493b7feef55400620608925de3 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Wed, 10 Mar 2021 09:45:34 +0300 Subject: [PATCH] JVM_IR Do not generate generic signatures for lifted lambda methods --- .../FirBlackBoxCodegenTestGenerated.java | 12 +++++++ .../backend/jvm/codegen/FunctionCodegen.kt | 8 +++-- .../funInterface/primitive.kt | 36 ++++++++----------- .../lambdas/genericLambdaSignature.kt | 14 ++++++++ .../lambdas/genericLambdaSignature.txt | 0 .../lambdas/genericLambdaSignature_ir.txt | 8 +++++ .../sam/genericLambdaSignature.kt | 18 ++++++++++ .../sam/genericLambdaSignature.txt | 0 .../sam/genericLambdaSignature_ir.txt | 14 ++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 12 +++++++ .../IrBlackBoxCodegenTestGenerated.java | 12 +++++++ .../handlers/BytecodeListingHandler.kt | 5 +-- .../test/directives/CodegenTestDirectives.kt | 7 +++- .../LightAnalysisModeTestGenerated.java | 10 ++++++ 14 files changed, 129 insertions(+), 27 deletions(-) create mode 100644 compiler/testData/codegen/box/invokedynamic/lambdas/genericLambdaSignature.kt create mode 100644 compiler/testData/codegen/box/invokedynamic/lambdas/genericLambdaSignature.txt create mode 100644 compiler/testData/codegen/box/invokedynamic/lambdas/genericLambdaSignature_ir.txt create mode 100644 compiler/testData/codegen/box/invokedynamic/sam/genericLambdaSignature.kt create mode 100644 compiler/testData/codegen/box/invokedynamic/sam/genericLambdaSignature.txt create mode 100644 compiler/testData/codegen/box/invokedynamic/sam/genericLambdaSignature_ir.txt 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 c070cb51c3d..38dcb2ad7b9 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 @@ -19945,6 +19945,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/invokedynamic/lambdas/extensionLambda.kt"); } + @Test + @TestMetadata("genericLambdaSignature.kt") + public void testGenericLambdaSignature() throws Exception { + runTest("compiler/testData/codegen/box/invokedynamic/lambdas/genericLambdaSignature.kt"); + } + @Test @TestMetadata("lambdaSerializable.kt") public void testLambdaSerializable() throws Exception { @@ -20127,6 +20133,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/invokedynamic/sam/genericFunInterfaceWithPrimitive.kt"); } + @Test + @TestMetadata("genericLambdaSignature.kt") + public void testGenericLambdaSignature() throws Exception { + runTest("compiler/testData/codegen/box/invokedynamic/sam/genericLambdaSignature.kt"); + } + @Test @TestMetadata("intReturnTypeAsNumber.kt") public void testIntReturnTypeAsNumber() throws Exception { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt index 556252873d7..63535a038f3 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt @@ -57,17 +57,21 @@ class FunctionCodegen( private fun doGenerate(): SMAPAndMethodNode { val signature = context.methodSignatureMapper.mapSignatureWithGeneric(irFunction) val flags = irFunction.calculateMethodFlags() + val isSynthetic = flags.and(Opcodes.ACC_SYNTHETIC) != 0 val methodNode = MethodNode( Opcodes.API_VERSION, flags, signature.asmMethod.name, signature.asmMethod.descriptor, - signature.genericsSignature.takeIf { flags.and(Opcodes.ACC_SYNTHETIC) == 0 }, + signature.genericsSignature + .takeIf { + !isSynthetic && irFunction.origin != IrDeclarationOrigin.LOCAL_FUNCTION_FOR_LAMBDA + }, getThrownExceptions(irFunction)?.toTypedArray() ) val methodVisitor: MethodVisitor = wrapWithMaxLocalCalc(methodNode) - if (context.state.generateParametersMetadata && flags.and(Opcodes.ACC_SYNTHETIC) == 0) { + if (context.state.generateParametersMetadata && !isSynthetic) { generateParameterNames(irFunction, methodVisitor, signature, context.state) } diff --git a/compiler/testData/codegen/box/inlineClasses/unboxGenericParameter/funInterface/primitive.kt b/compiler/testData/codegen/box/inlineClasses/unboxGenericParameter/funInterface/primitive.kt index bb0666f4444..54362c1ca34 100644 --- a/compiler/testData/codegen/box/inlineClasses/unboxGenericParameter/funInterface/primitive.kt +++ b/compiler/testData/codegen/box/inlineClasses/unboxGenericParameter/funInterface/primitive.kt @@ -2,36 +2,28 @@ // WASM_MUTE_REASON: SAM_CONVERSIONS // !LANGUAGE: +InlineClasses -fun underlying(a: IC): T = bar(a) { - it.value as T +fun underlying(a: IC): T1 = bar(a) { it.value as T1 } + +fun extension(a: IC): T2 = bar(a) { it.extensionValue() } + +fun dispatch(a: IC): T3 = bar(a) { it.dispatchValue() } + +fun normal(a: IC): T4 = bar(a) { normalValue(it) } + +fun interface FunIFace { + fun call(ic: T0): R } -fun extension(a: IC): T = bar(a) { - it.extensionValue() -} - -fun dispatch(a: IC): T = bar(a) { - it.dispatchValue() -} - -fun normal(a: IC): T = bar(a) { - normalValue(it) -} - -fun interface FunIFace { - fun call(ic: T): R -} - -fun bar(value: T, f: FunIFace): R { +fun bar(value: T5, f: FunIFace): R { return f.call(value) } -fun IC.extensionValue(): T = value as T +fun IC.extensionValue(): T6 = value as T6 -fun normalValue(ic: IC): T = ic.value as T +fun normalValue(ic: IC): T7 = ic.value as T7 inline class IC(val value: Int) { - fun dispatchValue(): T = value as T + fun dispatchValue(): T8 = value as T8 } fun box(): String { diff --git a/compiler/testData/codegen/box/invokedynamic/lambdas/genericLambdaSignature.kt b/compiler/testData/codegen/box/invokedynamic/lambdas/genericLambdaSignature.kt new file mode 100644 index 00000000000..c5d94ebba3e --- /dev/null +++ b/compiler/testData/codegen/box/invokedynamic/lambdas/genericLambdaSignature.kt @@ -0,0 +1,14 @@ +// TARGET_BACKEND: JVM +// IGNORE_BACKEND: JVM +// JVM_TARGET: 1.8 +// LAMBDAS: INDY +// CHECK_BYTECODE_LISTING +// WITH_SIGNATURES + +fun call(value: T1, f: (T1) -> R): R { + return f(value) +} + +fun test(x: T2) = call(x) { it } + +fun box() = test("OK") diff --git a/compiler/testData/codegen/box/invokedynamic/lambdas/genericLambdaSignature.txt b/compiler/testData/codegen/box/invokedynamic/lambdas/genericLambdaSignature.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/compiler/testData/codegen/box/invokedynamic/lambdas/genericLambdaSignature_ir.txt b/compiler/testData/codegen/box/invokedynamic/lambdas/genericLambdaSignature_ir.txt new file mode 100644 index 00000000000..4aab92b8a36 --- /dev/null +++ b/compiler/testData/codegen/box/invokedynamic/lambdas/genericLambdaSignature_ir.txt @@ -0,0 +1,8 @@ +@kotlin.Metadata +public final class GenericLambdaSignatureKt { + // source: 'genericLambdaSignature.kt' + public final static <(TT1;Lkotlin/jvm/functions/Function1<-TT1;+TR;>;)TR;> method call(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.jvm.functions.Function1): java.lang.Object + public final static <(TT2;)TT2;> method test(p0: java.lang.Object): java.lang.Object + public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String + private final static method test$lambda-0(p0: java.lang.Object): java.lang.Object +} diff --git a/compiler/testData/codegen/box/invokedynamic/sam/genericLambdaSignature.kt b/compiler/testData/codegen/box/invokedynamic/sam/genericLambdaSignature.kt new file mode 100644 index 00000000000..15931a8964b --- /dev/null +++ b/compiler/testData/codegen/box/invokedynamic/sam/genericLambdaSignature.kt @@ -0,0 +1,18 @@ +// TARGET_BACKEND: JVM +// IGNORE_BACKEND: JVM +// JVM_TARGET: 1.8 +// SAM_CONVERSIONS: INDY +// CHECK_BYTECODE_LISTING +// WITH_SIGNATURES + +fun interface FunIFace { + fun call(arg: T0): R +} + +fun call(value: T1, f: FunIFace): R { + return f.call(value) +} + +fun test(x: T2) = call(x) { it } + +fun box() = test("OK") diff --git a/compiler/testData/codegen/box/invokedynamic/sam/genericLambdaSignature.txt b/compiler/testData/codegen/box/invokedynamic/sam/genericLambdaSignature.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/compiler/testData/codegen/box/invokedynamic/sam/genericLambdaSignature_ir.txt b/compiler/testData/codegen/box/invokedynamic/sam/genericLambdaSignature_ir.txt new file mode 100644 index 00000000000..e1352cb859d --- /dev/null +++ b/compiler/testData/codegen/box/invokedynamic/sam/genericLambdaSignature_ir.txt @@ -0,0 +1,14 @@ +@kotlin.Metadata +public interface<Ljava/lang/Object;> FunIFace { + // source: 'genericLambdaSignature.kt' + public abstract <(TT0;)TR;> method call(p0: java.lang.Object): java.lang.Object +} + +@kotlin.Metadata +public final class GenericLambdaSignatureKt { + // source: 'genericLambdaSignature.kt' + public final static <(TT1;LFunIFace;)TR;> method call(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: FunIFace): java.lang.Object + public final static <(TT2;)TT2;> method test(p0: java.lang.Object): java.lang.Object + public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String + private final static method test$lambda-0(p0: java.lang.Object): java.lang.Object +} 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 686883c69bf..329cfa8af6f 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 @@ -19945,6 +19945,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/invokedynamic/lambdas/extensionLambda.kt"); } + @Test + @TestMetadata("genericLambdaSignature.kt") + public void testGenericLambdaSignature() throws Exception { + runTest("compiler/testData/codegen/box/invokedynamic/lambdas/genericLambdaSignature.kt"); + } + @Test @TestMetadata("lambdaSerializable.kt") public void testLambdaSerializable() throws Exception { @@ -20127,6 +20133,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/invokedynamic/sam/genericFunInterfaceWithPrimitive.kt"); } + @Test + @TestMetadata("genericLambdaSignature.kt") + public void testGenericLambdaSignature() throws Exception { + runTest("compiler/testData/codegen/box/invokedynamic/sam/genericLambdaSignature.kt"); + } + @Test @TestMetadata("intReturnTypeAsNumber.kt") public void testIntReturnTypeAsNumber() 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 f10817d1740..417a28f0aa2 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 @@ -19945,6 +19945,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/invokedynamic/lambdas/extensionLambda.kt"); } + @Test + @TestMetadata("genericLambdaSignature.kt") + public void testGenericLambdaSignature() throws Exception { + runTest("compiler/testData/codegen/box/invokedynamic/lambdas/genericLambdaSignature.kt"); + } + @Test @TestMetadata("lambdaSerializable.kt") public void testLambdaSerializable() throws Exception { @@ -20127,6 +20133,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/invokedynamic/sam/genericFunInterfaceWithPrimitive.kt"); } + @Test + @TestMetadata("genericLambdaSignature.kt") + public void testGenericLambdaSignature() throws Exception { + runTest("compiler/testData/codegen/box/invokedynamic/sam/genericLambdaSignature.kt"); + } + @Test @TestMetadata("intReturnTypeAsNumber.kt") public void testIntReturnTypeAsNumber() throws Exception { diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/BytecodeListingHandler.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/BytecodeListingHandler.kt index 490820dd83e..ccfbab841ab 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/BytecodeListingHandler.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/BytecodeListingHandler.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.test.backend.handlers import org.jetbrains.kotlin.codegen.BytecodeListingTextCollectingVisitor import org.jetbrains.kotlin.test.directives.CodegenTestDirectives import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.CHECK_BYTECODE_LISTING +import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.WITH_SIGNATURES import org.jetbrains.kotlin.test.directives.model.DirectivesContainer import org.jetbrains.kotlin.test.model.BinaryArtifacts import org.jetbrains.kotlin.test.model.TestModule @@ -27,10 +28,10 @@ class BytecodeListingHandler(testServices: TestServices) : JvmBinaryArtifactHand if (CHECK_BYTECODE_LISTING !in module.directives) return val dump = BytecodeListingTextCollectingVisitor.getText( info.classFileFactory, - BytecodeListingTextCollectingVisitor.Filter.ForCodegenTests + BytecodeListingTextCollectingVisitor.Filter.ForCodegenTests, + withSignatures = WITH_SIGNATURES in module.directives ) multiModuleInfoDumper.builderForModule(module).append(dump) - } override fun processAfterAllModules(someAssertionWasFailed: Boolean) { diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/directives/CodegenTestDirectives.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/directives/CodegenTestDirectives.kt index fe6f06a271e..1af3dad97de 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/directives/CodegenTestDirectives.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/directives/CodegenTestDirectives.kt @@ -48,7 +48,12 @@ object CodegenTestDirectives : SimpleDirectivesContainer() { ) val CHECK_BYTECODE_LISTING by directive( - description = "Dump resulting bytecode to .txt or _ir.txt file", + description = "Dump generated classes to .txt or _ir.txt file", + applicability = Global + ) + + val WITH_SIGNATURES by directive( + description = "Include generic signatures in generated classes dump", applicability = Global ) diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index efc2204c4f3..2f230375ec4 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -16652,6 +16652,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/invokedynamic/lambdas/bigArityExtLambda.kt"); } + @TestMetadata("genericLambdaSignature.kt") + public void ignoreGenericLambdaSignature() throws Exception { + runTest("compiler/testData/codegen/box/invokedynamic/lambdas/genericLambdaSignature.kt"); + } + @TestMetadata("lambdaSerializable.kt") public void ignoreLambdaSerializable() throws Exception { runTest("compiler/testData/codegen/box/invokedynamic/lambdas/lambdaSerializable.kt"); @@ -16778,6 +16783,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) public static class Sam extends AbstractLightAnalysisModeTest { + @TestMetadata("genericLambdaSignature.kt") + public void ignoreGenericLambdaSignature() throws Exception { + runTest("compiler/testData/codegen/box/invokedynamic/sam/genericLambdaSignature.kt"); + } + @TestMetadata("suspendFunInterface.kt") public void ignoreSuspendFunInterface() throws Exception { runTest("compiler/testData/codegen/box/invokedynamic/sam/suspendFunInterface.kt");