diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/DefaultArgumentStubGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/DefaultArgumentStubGenerator.kt index 48be11799a1..befafe270e4 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/DefaultArgumentStubGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/DefaultArgumentStubGenerator.kt @@ -65,19 +65,10 @@ class DefaultArgumentStubGenerator internal constructor(val context: Context): D val builder = context.createIrBuilder(descriptor) val body = builder.irBlockBody(irFunction) { val params = mutableListOf() - val variables = mutableMapOf() - - val newExtensionReceiver = - if (descriptor.extensionReceiverParameter == null) { - null - } else { - IrGetValueImpl( - startOffset = irFunction.startOffset, - endOffset = irFunction.endOffset, - descriptor = descriptor.extensionReceiverParameter!!, - origin = null - ) - } + val variables = mutableMapOf() + if (descriptor.extensionReceiverParameter != null) { + variables[functionDescriptor.extensionReceiverParameter!!] = descriptor.extensionReceiverParameter!! + } for (valueParameter in functionDescriptor.valueParameters) { val parameterDescriptor = descriptor.valueParameters[valueParameter.index] @@ -93,14 +84,19 @@ class DefaultArgumentStubGenerator internal constructor(val context: Context): D putValueArgument(0, irInt(1 shl valueParameter.index)) }, irInt(0)) val expressionBody = getDefaultParameterExpressionBody(irFunction, valueParameter) + /* Use previously calculated values in next expression. */ - expressionBody.expression.transformChildrenVoid(object:IrElementTransformerVoid() { + expressionBody.transformChildrenVoid(object:IrElementTransformerVoid() { override fun visitGetValue(expression: IrGetValue): IrExpression { - if (expression.descriptor == functionDescriptor.extensionReceiverParameter) - return newExtensionReceiver!! - if (!variables.containsKey(expression.descriptor)) - return expression - return irGet(variables[expression.descriptor] as VariableDescriptor) + log("GetValue: ${expression.descriptor}") + val valueDescriptor = variables[expression.descriptor] + return when (valueDescriptor) { + is VariableDescriptor -> irGet(valueDescriptor) + is ReceiverParameterDescriptor -> irGet(valueDescriptor) + null -> expression + else -> TODO("$valueDescriptor") + } + } }) /* Mapping calculated values with its origin variables. */ @@ -133,7 +129,7 @@ class DefaultArgumentStubGenerator internal constructor(val context: Context): D dispatchReceiver = irThis() } if (functionDescriptor.extensionReceiverParameter != null) { - extensionReceiver = newExtensionReceiver + extensionReceiver = irGet(variables[functionDescriptor.extensionReceiverParameter!!] as ReceiverParameterDescriptor) } params.forEachIndexed { i, variable -> putValueArgument(i, irGet(variable)) @@ -388,4 +384,6 @@ internal object Helper { val kConstructorMarkerName = Name.identifier("__\$marker\$__") val kDefaultArgumentMarkerClassDescriptor = DescriptorUtils.getAllDescriptors(kKonanInternalPackageDescriptor.memberScope) .first{ it is ClassDescriptor && it.name == kDefaultArgumentMarkerName} as ClassDescriptor -} \ No newline at end of file +} + +internal fun IrBuilderWithScope.irGet(descriptor: ReceiverParameterDescriptor):IrGetValue = IrGetValueImpl(startOffset, endOffset, descriptor) \ No newline at end of file