From 5ef37148ea21d67e8626f977c52189d270c1d530 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Mon, 11 May 2020 10:18:08 +0200 Subject: [PATCH] Add flag for proper array convention with default args calls --- .../jetbrains/kotlin/codegen/StackValue.java | 42 +++++++++++-------- .../ir/FirBlackBoxCodegenTestGenerated.java | 5 +++ .../convention/incWithDefaults.kt | 1 + .../defaultArguments/convention/kt16520.kt | 1 + .../convention/kt16520_old.kt | 20 +++++++++ .../convention/plusAssignWithDefaults.kt | 1 + .../codegen/BlackBoxCodegenTestGenerated.java | 5 +++ .../LightAnalysisModeTestGenerated.java | 5 +++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 +++ .../kotlin/config/LanguageVersionSettings.kt | 1 + 10 files changed, 69 insertions(+), 17 deletions(-) create mode 100644 compiler/testData/codegen/box/defaultArguments/convention/kt16520_old.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java index e1c94c4a99c..c530e3574e9 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.codegen.coroutines.CoroutineCodegenUtilKt; import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicMethods; import org.jetbrains.kotlin.codegen.pseudoInsns.PseudoInsnsKt; import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper; +import org.jetbrains.kotlin.config.LanguageFeature; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor; import org.jetbrains.kotlin.load.java.JvmAbi; @@ -1534,6 +1535,7 @@ public abstract class StackValue { CollectionElementReceiver collectionElementReceiver = (CollectionElementReceiver) receiver; boolean callDefault = false; + boolean properSetterCalls = codegen.getState().getLanguageVersionSettings().supportsFeature(LanguageFeature.ProperArrayConventionSetterWithDefaultCalls); if (collectionElementReceiver.isGetter) { //Convention setter/getter could have default parameters at the end of parameter list (in case of setter before last parameter) //We should remove default parameters of getter from stack if they don't match setter ones and regenerate mask for setter @@ -1561,28 +1563,34 @@ public abstract class StackValue { } } - DefaultCallArgs defaultArgs = new DefaultCallArgs( - CodegenUtilKt.unwrapFrontendVersion(resolvedSetCall.getResultingDescriptor()).getValueParameters().size()); - if (!setterDefaults.isEmpty()) { - ArgumentGenerator setterArgumentGenerator = new CallBasedArgumentGenerator( - codegen, - callGenerator, - resolvedSetCall.getResultingDescriptor().getValueParameters(), setter.getValueParameterTypes() - ); + if (properSetterCalls) { + DefaultCallArgs defaultArgs = new DefaultCallArgs( + CodegenUtilKt.unwrapFrontendVersion(resolvedSetCall.getResultingDescriptor()).getValueParameters().size()); + if (!setterDefaults.isEmpty()) { + ArgumentGenerator setterArgumentGenerator = new CallBasedArgumentGenerator( + codegen, + callGenerator, + resolvedSetCall.getResultingDescriptor().getValueParameters(), setter.getValueParameterTypes() + ); - int defaultIndex = CollectionsKt.getLastIndex(setterArguments) - 1/*rhs value*/ - setterDefaults.size(); - for (ResolvedValueArgument aDefault : setterDefaults) { - defaultArgs.mark(++defaultIndex); - setterArgumentGenerator.generateDefault(defaultIndex, (DefaultValueArgument)aDefault); + int defaultIndex = CollectionsKt.getLastIndex(setterArguments) - 1/*rhs value*/ - setterDefaults.size(); + for (ResolvedValueArgument aDefault : setterDefaults) { + defaultArgs.mark(++defaultIndex); + setterArgumentGenerator.generateDefault(defaultIndex, (DefaultValueArgument) aDefault); + } + callDefault = true; } - callDefault = true; + rhsValue.put(v); + codegen.myFrameMap.leaveTemp(lastParameterType); + defaultArgs.generateOnStackIfNeeded(callGenerator, false); + } + else { + rhsValue.put(v); + codegen.myFrameMap.leaveTemp(lastParameterType); } - rhsValue.put(v); - codegen.myFrameMap.leaveTemp(lastParameterType); - defaultArgs.generateOnStackIfNeeded(callGenerator, false); } } else { - callDefault = genDefaultMaskIfPresent(callGenerator); + callDefault = properSetterCalls && genDefaultMaskIfPresent(callGenerator); } callGenerator.genCall(setter, resolvedSetCall, callDefault, codegen); 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 69bac62a7c7..81b47a4b539 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 @@ -8856,6 +8856,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/defaultArguments/convention/kt16520.kt"); } + @TestMetadata("kt16520_old.kt") + public void testKt16520_old() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/convention/kt16520_old.kt"); + } + @TestMetadata("kt9140.kt") public void testKt9140() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/convention/kt9140.kt"); diff --git a/compiler/testData/codegen/box/defaultArguments/convention/incWithDefaults.kt b/compiler/testData/codegen/box/defaultArguments/convention/incWithDefaults.kt index 5c119f6742b..c77dd08fa4e 100644 --- a/compiler/testData/codegen/box/defaultArguments/convention/incWithDefaults.kt +++ b/compiler/testData/codegen/box/defaultArguments/convention/incWithDefaults.kt @@ -1,3 +1,4 @@ +// !LANGUAGE: +ProperArrayConventionSetterWithDefaultCalls // IGNORE_BACKEND_FIR: JVM_IR var inc: String = "" diff --git a/compiler/testData/codegen/box/defaultArguments/convention/kt16520.kt b/compiler/testData/codegen/box/defaultArguments/convention/kt16520.kt index 59dd737fa75..cb403b24030 100644 --- a/compiler/testData/codegen/box/defaultArguments/convention/kt16520.kt +++ b/compiler/testData/codegen/box/defaultArguments/convention/kt16520.kt @@ -1,3 +1,4 @@ +// !LANGUAGE: +ProperArrayConventionSetterWithDefaultCalls // IGNORE_BACKEND_FIR: JVM_IR var result = "fail" diff --git a/compiler/testData/codegen/box/defaultArguments/convention/kt16520_old.kt b/compiler/testData/codegen/box/defaultArguments/convention/kt16520_old.kt new file mode 100644 index 00000000000..484e10ca902 --- /dev/null +++ b/compiler/testData/codegen/box/defaultArguments/convention/kt16520_old.kt @@ -0,0 +1,20 @@ +// !LANGUAGE: -ProperArrayConventionSetterWithDefaultCalls +// IGNORE_BACKEND: JVM_IR +// IGNORE_BACKEND_FIR: JVM_IR +// TARGET_BACKEND: JVM +var result = "fail" + +class A { + operator fun set( + i1: Int, + i2: Int = 1, + v: String + ) { + result = "" + i1 + i2 + v + } +} + +fun box(): String { + A()[1] = "OK" + return if (result != "10OK") "fail: $result" else "OK" +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/defaultArguments/convention/plusAssignWithDefaults.kt b/compiler/testData/codegen/box/defaultArguments/convention/plusAssignWithDefaults.kt index 112fd471af5..1e1e83e0c4b 100644 --- a/compiler/testData/codegen/box/defaultArguments/convention/plusAssignWithDefaults.kt +++ b/compiler/testData/codegen/box/defaultArguments/convention/plusAssignWithDefaults.kt @@ -1,3 +1,4 @@ +// !LANGUAGE: +ProperArrayConventionSetterWithDefaultCalls // IGNORE_BACKEND_FIR: JVM_IR var inc: String = "" diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 47043fc02d3..2657c3c1f65 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -10071,6 +10071,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/defaultArguments/convention/kt16520.kt"); } + @TestMetadata("kt16520_old.kt") + public void testKt16520_old() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/convention/kt16520_old.kt"); + } + @TestMetadata("kt9140.kt") public void testKt9140() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/convention/kt9140.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 20ea728019d..0e641e59fa9 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -10071,6 +10071,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/defaultArguments/convention/kt16520.kt"); } + @TestMetadata("kt16520_old.kt") + public void testKt16520_old() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/convention/kt16520_old.kt"); + } + @TestMetadata("kt9140.kt") public void testKt9140() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/convention/kt9140.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 55524062751..e37f6f5aa21 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -8856,6 +8856,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/defaultArguments/convention/kt16520.kt"); } + @TestMetadata("kt16520_old.kt") + public void testKt16520_old() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/convention/kt16520_old.kt"); + } + @TestMetadata("kt9140.kt") public void testKt9140() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/convention/kt9140.kt"); diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index 1ca8fe707e3..c3c9b5c5a76 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -130,6 +130,7 @@ enum class LanguageFeature( ProhibitNonReifiedArraysAsReifiedTypeArguments(KOTLIN_1_5, kind = BUG_FIX), ProhibitVarargAsArrayAfterSamArgument(KOTLIN_1_5, kind = BUG_FIX), CorrectSourceMappingSyntax(KOTLIN_1_5, kind = UNSTABLE_FEATURE), + ProperArrayConventionSetterWithDefaultCalls(KOTLIN_1_5, kind = OTHER), // Temporarily disabled, see KT-27084/KT-22379 SoundSmartcastFromLoopConditionForLoopAssignedVariables(sinceVersion = null, kind = BUG_FIX),