Add flag for proper array convention with default args calls

This commit is contained in:
Mikhael Bogdanov
2020-05-11 10:18:08 +02:00
committed by Mikhail Bogdanov
parent adc770b604
commit 5ef37148ea
10 changed files with 69 additions and 17 deletions
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.codegen.coroutines.CoroutineCodegenUtilKt;
import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicMethods; import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicMethods;
import org.jetbrains.kotlin.codegen.pseudoInsns.PseudoInsnsKt; import org.jetbrains.kotlin.codegen.pseudoInsns.PseudoInsnsKt;
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper; import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper;
import org.jetbrains.kotlin.config.LanguageFeature;
import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor; import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor;
import org.jetbrains.kotlin.load.java.JvmAbi; import org.jetbrains.kotlin.load.java.JvmAbi;
@@ -1534,6 +1535,7 @@ public abstract class StackValue {
CollectionElementReceiver collectionElementReceiver = (CollectionElementReceiver) receiver; CollectionElementReceiver collectionElementReceiver = (CollectionElementReceiver) receiver;
boolean callDefault = false; boolean callDefault = false;
boolean properSetterCalls = codegen.getState().getLanguageVersionSettings().supportsFeature(LanguageFeature.ProperArrayConventionSetterWithDefaultCalls);
if (collectionElementReceiver.isGetter) { if (collectionElementReceiver.isGetter) {
//Convention setter/getter could have default parameters at the end of parameter list (in case of setter before last parameter) //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 //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( if (properSetterCalls) {
CodegenUtilKt.unwrapFrontendVersion(resolvedSetCall.getResultingDescriptor()).getValueParameters().size()); DefaultCallArgs defaultArgs = new DefaultCallArgs(
if (!setterDefaults.isEmpty()) { CodegenUtilKt.unwrapFrontendVersion(resolvedSetCall.getResultingDescriptor()).getValueParameters().size());
ArgumentGenerator setterArgumentGenerator = new CallBasedArgumentGenerator( if (!setterDefaults.isEmpty()) {
codegen, ArgumentGenerator setterArgumentGenerator = new CallBasedArgumentGenerator(
callGenerator, codegen,
resolvedSetCall.getResultingDescriptor().getValueParameters(), setter.getValueParameterTypes() callGenerator,
); resolvedSetCall.getResultingDescriptor().getValueParameters(), setter.getValueParameterTypes()
);
int defaultIndex = CollectionsKt.getLastIndex(setterArguments) - 1/*rhs value*/ - setterDefaults.size(); int defaultIndex = CollectionsKt.getLastIndex(setterArguments) - 1/*rhs value*/ - setterDefaults.size();
for (ResolvedValueArgument aDefault : setterDefaults) { for (ResolvedValueArgument aDefault : setterDefaults) {
defaultArgs.mark(++defaultIndex); defaultArgs.mark(++defaultIndex);
setterArgumentGenerator.generateDefault(defaultIndex, (DefaultValueArgument)aDefault); 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 { } else {
callDefault = genDefaultMaskIfPresent(callGenerator); callDefault = properSetterCalls && genDefaultMaskIfPresent(callGenerator);
} }
callGenerator.genCall(setter, resolvedSetCall, callDefault, codegen); callGenerator.genCall(setter, resolvedSetCall, callDefault, codegen);
@@ -8856,6 +8856,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/defaultArguments/convention/kt16520.kt"); 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") @TestMetadata("kt9140.kt")
public void testKt9140() throws Exception { public void testKt9140() throws Exception {
runTest("compiler/testData/codegen/box/defaultArguments/convention/kt9140.kt"); runTest("compiler/testData/codegen/box/defaultArguments/convention/kt9140.kt");
@@ -1,3 +1,4 @@
// !LANGUAGE: +ProperArrayConventionSetterWithDefaultCalls
// IGNORE_BACKEND_FIR: JVM_IR // IGNORE_BACKEND_FIR: JVM_IR
var inc: String = "" var inc: String = ""
@@ -1,3 +1,4 @@
// !LANGUAGE: +ProperArrayConventionSetterWithDefaultCalls
// IGNORE_BACKEND_FIR: JVM_IR // IGNORE_BACKEND_FIR: JVM_IR
var result = "fail" var result = "fail"
@@ -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"
}
@@ -1,3 +1,4 @@
// !LANGUAGE: +ProperArrayConventionSetterWithDefaultCalls
// IGNORE_BACKEND_FIR: JVM_IR // IGNORE_BACKEND_FIR: JVM_IR
var inc: String = "" var inc: String = ""
@@ -10071,6 +10071,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/defaultArguments/convention/kt16520.kt"); 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") @TestMetadata("kt9140.kt")
public void testKt9140() throws Exception { public void testKt9140() throws Exception {
runTest("compiler/testData/codegen/box/defaultArguments/convention/kt9140.kt"); runTest("compiler/testData/codegen/box/defaultArguments/convention/kt9140.kt");
@@ -10071,6 +10071,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/defaultArguments/convention/kt16520.kt"); 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") @TestMetadata("kt9140.kt")
public void testKt9140() throws Exception { public void testKt9140() throws Exception {
runTest("compiler/testData/codegen/box/defaultArguments/convention/kt9140.kt"); runTest("compiler/testData/codegen/box/defaultArguments/convention/kt9140.kt");
@@ -8856,6 +8856,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/defaultArguments/convention/kt16520.kt"); 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") @TestMetadata("kt9140.kt")
public void testKt9140() throws Exception { public void testKt9140() throws Exception {
runTest("compiler/testData/codegen/box/defaultArguments/convention/kt9140.kt"); runTest("compiler/testData/codegen/box/defaultArguments/convention/kt9140.kt");
@@ -130,6 +130,7 @@ enum class LanguageFeature(
ProhibitNonReifiedArraysAsReifiedTypeArguments(KOTLIN_1_5, kind = BUG_FIX), ProhibitNonReifiedArraysAsReifiedTypeArguments(KOTLIN_1_5, kind = BUG_FIX),
ProhibitVarargAsArrayAfterSamArgument(KOTLIN_1_5, kind = BUG_FIX), ProhibitVarargAsArrayAfterSamArgument(KOTLIN_1_5, kind = BUG_FIX),
CorrectSourceMappingSyntax(KOTLIN_1_5, kind = UNSTABLE_FEATURE), CorrectSourceMappingSyntax(KOTLIN_1_5, kind = UNSTABLE_FEATURE),
ProperArrayConventionSetterWithDefaultCalls(KOTLIN_1_5, kind = OTHER),
// Temporarily disabled, see KT-27084/KT-22379 // Temporarily disabled, see KT-27084/KT-22379
SoundSmartcastFromLoopConditionForLoopAssignedVariables(sinceVersion = null, kind = BUG_FIX), SoundSmartcastFromLoopConditionForLoopAssignedVariables(sinceVersion = null, kind = BUG_FIX),