KT-52027 Encapsulate and fix calculation of parameter indices
This commit is contained in:
committed by
Space Team
parent
a297240870
commit
2d69fd5a8a
@@ -230,7 +230,10 @@ abstract class InlineCodegen<out T : BaseExpressionCodegen>(
|
|||||||
return processDefaultMaskOrMethodHandler(stackValue, kind)
|
return processDefaultMaskOrMethodHandler(stackValue, kind)
|
||||||
}
|
}
|
||||||
|
|
||||||
val info = invocationParamBuilder.addNextValueParameter(jvmKotlinType.type, false, null, parameterIndex)
|
val info = when (parameterIndex) {
|
||||||
|
-1 -> invocationParamBuilder.addNextParameter(jvmKotlinType.type, false)
|
||||||
|
else -> invocationParamBuilder.addNextValueParameter(jvmKotlinType.type, false, null, parameterIndex)
|
||||||
|
}
|
||||||
info.functionalArgument = when (kind) {
|
info.functionalArgument = when (kind) {
|
||||||
ValueKind.READ_OF_INLINE_LAMBDA_FOR_INLINE_SUSPEND_PARAMETER ->
|
ValueKind.READ_OF_INLINE_LAMBDA_FOR_INLINE_SUSPEND_PARAMETER ->
|
||||||
NonInlineArgumentForInlineSuspendParameter.INLINE_LAMBDA_AS_VARIABLE
|
NonInlineArgumentForInlineSuspendParameter.INLINE_LAMBDA_AS_VARIABLE
|
||||||
|
|||||||
@@ -20,19 +20,17 @@ class ParametersBuilder private constructor() {
|
|||||||
private var nextValueParameterIndex = 0
|
private var nextValueParameterIndex = 0
|
||||||
|
|
||||||
fun addThis(type: Type, skipped: Boolean): ParameterInfo {
|
fun addThis(type: Type, skipped: Boolean): ParameterInfo {
|
||||||
return addParameter(ParameterInfo(type, skipped, nextParameterOffset, -1, nextValueParameterIndex))
|
return addParameter(ParameterInfo(type, skipped, nextParameterOffset, -1, nextValueParameterIndex), false)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addNextParameter(type: Type, skipped: Boolean, typeOnStack: Type = type): ParameterInfo {
|
fun addNextParameter(type: Type, skipped: Boolean, typeOnStack: Type = type): ParameterInfo {
|
||||||
return addParameter(ParameterInfo(type, skipped, nextParameterOffset, null, nextValueParameterIndex, typeOnStack))
|
return addParameter(ParameterInfo(type, skipped, nextParameterOffset, null, nextValueParameterIndex, typeOnStack), false)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addNextValueParameter(type: Type, skipped: Boolean, remapValue: StackValue?, parameterIndex: Int): ParameterInfo {
|
fun addNextValueParameter(type: Type, skipped: Boolean, remapValue: StackValue?, parameterIndex: Int): ParameterInfo {
|
||||||
return addParameter(
|
return addParameter(
|
||||||
ParameterInfo(
|
ParameterInfo(type, skipped, nextParameterOffset, remapValue, parameterIndex + valueParamFirstIndex),
|
||||||
type, skipped, nextParameterOffset, remapValue,
|
true
|
||||||
if (parameterIndex == -1) nextValueParameterIndex else parameterIndex + valueParamFirstIndex
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,15 +39,15 @@ class ParametersBuilder private constructor() {
|
|||||||
original.desc, newFieldName, original.isSkipped, nextParameterOffset, original.index, original.isSkipInConstructor
|
original.desc, newFieldName, original.isSkipped, nextParameterOffset, original.index, original.isSkipInConstructor
|
||||||
)
|
)
|
||||||
info.functionalArgument = original.functionalArgument
|
info.functionalArgument = original.functionalArgument
|
||||||
return addParameter(info)
|
return addParameter(info, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addCapturedParam(desc: CapturedParamDesc, newFieldName: String, skipInConstructor: Boolean): CapturedParamInfo {
|
fun addCapturedParam(desc: CapturedParamDesc, newFieldName: String, skipInConstructor: Boolean): CapturedParamInfo {
|
||||||
return addParameter(CapturedParamInfo(desc, newFieldName, false, nextParameterOffset, -1, skipInConstructor))
|
return addParameter(CapturedParamInfo(desc, newFieldName, false, nextParameterOffset, -1, skipInConstructor), false)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addCapturedParamCopy(copyFrom: CapturedParamInfo): CapturedParamInfo {
|
fun addCapturedParamCopy(copyFrom: CapturedParamInfo): CapturedParamInfo {
|
||||||
return addParameter(copyFrom.cloneWithNewDeclarationIndex(-1))
|
return addParameter(copyFrom.cloneWithNewDeclarationIndex(-1), false)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addCapturedParam(
|
fun addCapturedParam(
|
||||||
@@ -66,23 +64,21 @@ class ParametersBuilder private constructor() {
|
|||||||
if (original != null) {
|
if (original != null) {
|
||||||
info.functionalArgument = original.functionalArgument
|
info.functionalArgument = original.functionalArgument
|
||||||
}
|
}
|
||||||
return addParameter(info)
|
return addParameter(info, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun <T : ParameterInfo> addParameter(info: T): T {
|
private fun <T : ParameterInfo> addParameter(info: T, isValueParameter: Boolean): T {
|
||||||
params.add(info)
|
params.add(info)
|
||||||
nextParameterOffset += info.type.size
|
nextParameterOffset += info.type.size
|
||||||
if (info !is CapturedParamInfo) {
|
if (info !is CapturedParamInfo) {
|
||||||
nextValueParameterIndex++
|
nextValueParameterIndex++
|
||||||
|
if (!isValueParameter) {
|
||||||
|
valueParamFirstIndex++
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return info
|
return info
|
||||||
}
|
}
|
||||||
|
|
||||||
fun markValueParametersStart(contextReceiversCount: Int) {
|
|
||||||
this.valueParamFirstIndex = params.size - contextReceiversCount
|
|
||||||
this.nextValueParameterIndex = valueParamFirstIndex
|
|
||||||
}
|
|
||||||
|
|
||||||
fun listCaptured(): List<CapturedParamInfo> {
|
fun listCaptured(): List<CapturedParamInfo> {
|
||||||
return params.filterIsInstance<CapturedParamInfo>()
|
return params.filterIsInstance<CapturedParamInfo>()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -97,8 +97,7 @@ class PsiInlineCodegen(
|
|||||||
hiddenParameters += invocationParamBuilder.addNextParameter(param.asmType, false) to
|
hiddenParameters += invocationParamBuilder.addNextParameter(param.asmType, false) to
|
||||||
codegen.frameMap.enterTemp(param.asmType)
|
codegen.frameMap.enterTemp(param.asmType)
|
||||||
}
|
}
|
||||||
// TODO: Add context receivers as hiddenParameters and pass their count
|
// TODO: Add context receivers as hiddenParameters
|
||||||
invocationParamBuilder.markValueParametersStart(0)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun putHiddenParamsIntoLocals() {
|
override fun putHiddenParamsIntoLocals() {
|
||||||
|
|||||||
+6
@@ -17462,6 +17462,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
|||||||
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt51863.kt");
|
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt51863.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt52207.kt")
|
||||||
|
public void testKt52207() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt52207.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("overload.kt")
|
@TestMetadata("overload.kt")
|
||||||
public void testOverload() throws Exception {
|
public void testOverload() throws Exception {
|
||||||
|
|||||||
-1
@@ -509,7 +509,6 @@ class ExpressionCodegen(
|
|||||||
callGenerator.genValueAndPut(callee.extensionReceiverParameter!!, receiver, type, this, data)
|
callGenerator.genValueAndPut(callee.extensionReceiverParameter!!, receiver, type, this, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
callGenerator.beforeValueParametersStart(callee.contextReceiverParametersCount)
|
|
||||||
callee.valueParameters.subList(callee.contextReceiverParametersCount, callee.valueParameters.size)
|
callee.valueParameters.subList(callee.contextReceiverParametersCount, callee.valueParameters.size)
|
||||||
.forEachIndexed { i, valueParameter -> handleValueParameter(i + contextReceivers.size, valueParameter) }
|
.forEachIndexed { i, valueParameter -> handleValueParameter(i + contextReceivers.size, valueParameter) }
|
||||||
|
|
||||||
|
|||||||
-2
@@ -36,8 +36,6 @@ interface IrCallGenerator {
|
|||||||
|
|
||||||
fun beforeCallStart() {}
|
fun beforeCallStart() {}
|
||||||
|
|
||||||
fun beforeValueParametersStart(contextReceiversCount: Int) {}
|
|
||||||
|
|
||||||
fun afterCallEnd() {}
|
fun afterCallEnd() {}
|
||||||
|
|
||||||
fun genValueAndPut(
|
fun genValueAndPut(
|
||||||
|
|||||||
-4
@@ -150,10 +150,6 @@ class IrInlineCodegen(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun beforeValueParametersStart(contextReceiversCount: Int) {
|
|
||||||
invocationParamBuilder.markValueParametersStart(contextReceiversCount)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun genInlineCall(
|
override fun genInlineCall(
|
||||||
callableMethod: IrCallableMethod,
|
callableMethod: IrCallableMethod,
|
||||||
codegen: ExpressionCodegen,
|
codegen: ExpressionCodegen,
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
// !LANGUAGE: +ContextReceivers
|
||||||
|
// TARGET_BACKEND: JVM_IR
|
||||||
|
|
||||||
|
class A
|
||||||
|
|
||||||
|
class Example {
|
||||||
|
context(A)
|
||||||
|
inline fun fn(x: Int) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
with(A()) {
|
||||||
|
Example().fn(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
test()
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+6
@@ -17462,6 +17462,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt51863.kt");
|
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt51863.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt52207.kt")
|
||||||
|
public void testKt52207() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt52207.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("overload.kt")
|
@TestMetadata("overload.kt")
|
||||||
public void testOverload() throws Exception {
|
public void testOverload() throws Exception {
|
||||||
|
|||||||
Reference in New Issue
Block a user