From 000757c75b1258be1ede8c0210354c992cbcab55 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Fri, 24 Apr 2020 18:39:29 +0300 Subject: [PATCH] JVM: Add suspend conversion bit for function references equals/hashCode --- .../jetbrains/kotlin/codegen/ClosureCodegen.java | 16 ++++++++++++---- .../ir/FirBlackBoxCodegenTestGenerated.java | 5 +++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 +++++ .../codegen/LightAnalysisModeTestGenerated.java | 5 +++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 +++++ .../semantics/IrJsCodegenBoxTestGenerated.java | 5 +++++ .../semantics/JsCodegenBoxTestGenerated.java | 5 +++++ 7 files changed, 42 insertions(+), 4 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java index 97b816b1f5d..cc197008993 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java @@ -12,6 +12,7 @@ import kotlin.Unit; import kotlin.collections.CollectionsKt; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.kotlin.builtins.FunctionTypesKt; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.codegen.binding.CalculatedClosure; import org.jetbrains.kotlin.codegen.binding.CodegenBinding; @@ -527,7 +528,7 @@ public class ClosureCodegen extends MemberCodegen { PropertyReferenceCodegen.generateCallableReferenceSignature(iv, functionReferenceTarget, state); int flags = (isTopLevelCallableReference(functionReferenceTarget) ? 1 : 0) + - (calculateFunctionReferenceFlags(functionReferenceCall, funDescriptor) << 1); + (calculateFunctionReferenceFlags(functionReferenceCall, funDescriptor, classDescriptor) << 1); iv.aconst(flags); superCtorArgTypes.add(JAVA_CLASS_TYPE); superCtorArgTypes.add(JAVA_STRING_TYPE); @@ -551,10 +552,12 @@ public class ClosureCodegen extends MemberCodegen { } private static int calculateFunctionReferenceFlags( - @NotNull ResolvedCall call, @NotNull FunctionDescriptor anonymousAdaptedFunction + @NotNull ResolvedCall call, + @NotNull FunctionDescriptor anonymousAdaptedFunction, + @NotNull ClassDescriptor classDescriptor ) { boolean hasVarargMappedToElement = false; - CallableDescriptor target = call.getResultingDescriptor(); + FunctionDescriptor target = (FunctionDescriptor) call.getResultingDescriptor(); int shift = (call.getDispatchReceiver() instanceof TransientReceiver ? 1 : 0) + (call.getExtensionReceiver() instanceof TransientReceiver ? 1 : 0); @@ -577,8 +580,13 @@ public class ClosureCodegen extends MemberCodegen { boolean hasCoercionToUnit = KotlinBuiltIns.isUnit(anonymousAdaptedFunction.getReturnType()) && !KotlinBuiltIns.isUnit(target.getReturnType()); + boolean hasSuspendConversion = + !target.isSuspend() && + classDescriptor.getTypeConstructor().getSupertypes().stream().anyMatch(FunctionTypesKt::isSuspendFunctionType); + return (hasVarargMappedToElement ? 1 : 0) + - ((hasCoercionToUnit ? 1 : 0) << 1); + (hasSuspendConversion ? 2 : 0) + + ((hasCoercionToUnit ? 1 : 0) << 2); } protected int calculateArity() { diff --git a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index 2c44f5b9121..2caf70fa5c6 100644 --- a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -2432,6 +2432,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/callableReference/equality/simpleEquality.kt"); } + @TestMetadata("suspendConversion.kt") + public void testSuspendConversion() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/equality/suspendConversion.kt"); + } + @TestMetadata("varargAsArrayMemberOrExtension.kt") public void testVarargAsArrayMemberOrExtension() throws Exception { runTest("compiler/testData/codegen/box/callableReference/equality/varargAsArrayMemberOrExtension.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index b743bb6bfdc..98b8c17af24 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -2452,6 +2452,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/callableReference/equality/simpleEquality.kt"); } + @TestMetadata("suspendConversion.kt") + public void testSuspendConversion() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/equality/suspendConversion.kt"); + } + @TestMetadata("varargAsArrayMemberOrExtension.kt") public void testVarargAsArrayMemberOrExtension() throws Exception { runTest("compiler/testData/codegen/box/callableReference/equality/varargAsArrayMemberOrExtension.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index f7c574d67a9..531a3451469 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -2452,6 +2452,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/callableReference/equality/simpleEquality.kt"); } + @TestMetadata("suspendConversion.kt") + public void testSuspendConversion() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/equality/suspendConversion.kt"); + } + @TestMetadata("varargAsArrayMemberOrExtension.kt") public void testVarargAsArrayMemberOrExtension() throws Exception { runTest("compiler/testData/codegen/box/callableReference/equality/varargAsArrayMemberOrExtension.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 148bfea0eca..c630d775d2c 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -2432,6 +2432,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/callableReference/equality/simpleEquality.kt"); } + @TestMetadata("suspendConversion.kt") + public void testSuspendConversion() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/equality/suspendConversion.kt"); + } + @TestMetadata("varargAsArrayMemberOrExtension.kt") public void testVarargAsArrayMemberOrExtension() throws Exception { runTest("compiler/testData/codegen/box/callableReference/equality/varargAsArrayMemberOrExtension.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 0a8f4e744c5..7419ae23236 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -1827,6 +1827,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/callableReference/equality/simpleEquality.kt"); } + @TestMetadata("suspendConversion.kt") + public void testSuspendConversion() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/equality/suspendConversion.kt"); + } + @TestMetadata("varargAsArrayMemberOrExtension.kt") public void testVarargAsArrayMemberOrExtension() throws Exception { runTest("compiler/testData/codegen/box/callableReference/equality/varargAsArrayMemberOrExtension.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 9b8f18c3125..b6d148036ca 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -1827,6 +1827,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/callableReference/equality/simpleEquality.kt"); } + @TestMetadata("suspendConversion.kt") + public void testSuspendConversion() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/equality/suspendConversion.kt"); + } + @TestMetadata("varargAsArrayMemberOrExtension.kt") public void testVarargAsArrayMemberOrExtension() throws Exception { runTest("compiler/testData/codegen/box/callableReference/equality/varargAsArrayMemberOrExtension.kt");