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.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);
|
||||||
|
|||||||
Generated
+5
@@ -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
@@ -1,3 +1,4 @@
|
|||||||
|
// !LANGUAGE: +ProperArrayConventionSetterWithDefaultCalls
|
||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
// IGNORE_BACKEND_FIR: JVM_IR
|
||||||
var inc: String = ""
|
var inc: String = ""
|
||||||
|
|
||||||
|
|||||||
+5
@@ -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");
|
||||||
|
|||||||
+5
@@ -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");
|
||||||
|
|||||||
+5
@@ -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),
|
||||||
|
|||||||
Reference in New Issue
Block a user