Add flag for proper array convention with default args calls
This commit is contained in:
committed by
Mikhail Bogdanov
parent
adc770b604
commit
5ef37148ea
@@ -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);
|
||||
|
||||
Generated
+5
@@ -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");
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// !LANGUAGE: +ProperArrayConventionSetterWithDefaultCalls
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
var inc: String = ""
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// !LANGUAGE: +ProperArrayConventionSetterWithDefaultCalls
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
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
@@ -1,3 +1,4 @@
|
||||
// !LANGUAGE: +ProperArrayConventionSetterWithDefaultCalls
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
var inc: String = ""
|
||||
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user