backend: do not rely on parameter.original in autoboxing

`function.parameter.original` sometimes turns out to be
not the same as `function.original.parameter`.
This commit is contained in:
Svyatoslav Scherbina
2017-01-23 13:21:06 +07:00
committed by SvyatoslavScherbina
parent 8ca5d08e8e
commit 3aa48b7e0c
2 changed files with 26 additions and 7 deletions
@@ -37,6 +37,15 @@ abstract class AbstractValueUsageTransformer(val builtIns: KotlinBuiltIns): IrEl
protected open fun IrExpression.useAsArgument(parameter: ParameterDescriptor): IrExpression = protected open fun IrExpression.useAsArgument(parameter: ParameterDescriptor): IrExpression =
this.useAsValue(parameter) this.useAsValue(parameter)
protected open fun IrExpression.useAsDispatchReceiver(function: CallableDescriptor): IrExpression =
this.useAsArgument(function.dispatchReceiverParameter!!)
protected open fun IrExpression.useAsExtensionReceiver(function: CallableDescriptor): IrExpression =
this.useAsArgument(function.extensionReceiverParameter!!)
protected open fun IrExpression.useAsValueArgument(parameter: ValueParameterDescriptor): IrExpression =
this.useAsArgument(parameter)
protected open fun IrExpression.useForVariable(variable: VariableDescriptor): IrExpression = protected open fun IrExpression.useForVariable(variable: VariableDescriptor): IrExpression =
this.useAsValue(variable) this.useAsValue(variable)
@@ -55,12 +64,12 @@ abstract class AbstractValueUsageTransformer(val builtIns: KotlinBuiltIns): IrEl
expression.transformChildrenVoid(this) expression.transformChildrenVoid(this)
with(expression) { with(expression) {
dispatchReceiver = dispatchReceiver?.useAsArgument(descriptor.dispatchReceiverParameter!!) dispatchReceiver = dispatchReceiver?.useAsDispatchReceiver(descriptor)
extensionReceiver = extensionReceiver?.useAsArgument(descriptor.extensionReceiverParameter!!) extensionReceiver = extensionReceiver?.useAsExtensionReceiver(descriptor)
for (index in descriptor.valueParameters.indices) { for (index in descriptor.valueParameters.indices) {
val argument = getValueArgument(index) ?: continue val argument = getValueArgument(index) ?: continue
val parameter = descriptor.valueParameters[index] val parameter = descriptor.valueParameters[index]
putValueArgument(index, argument.useAsArgument(parameter)) putValueArgument(index, argument.useAsValueArgument(parameter))
} }
} }
@@ -214,7 +223,7 @@ abstract class AbstractValueUsageTransformer(val builtIns: KotlinBuiltIns): IrEl
declaration.descriptor.valueParameters.forEach { parameter -> declaration.descriptor.valueParameters.forEach { parameter ->
val defaultValue = declaration.getDefault(parameter) val defaultValue = declaration.getDefault(parameter)
if (defaultValue is IrExpressionBody) { if (defaultValue is IrExpressionBody) {
defaultValue.expression = defaultValue.expression.useAsArgument(parameter) defaultValue.expression = defaultValue.expression.useAsValueArgument(parameter)
} }
} }
@@ -6,8 +6,9 @@ import org.jetbrains.kotlin.backend.konan.Context
import org.jetbrains.kotlin.backend.konan.descriptors.getKonanInternalClass import org.jetbrains.kotlin.backend.konan.descriptors.getKonanInternalClass
import org.jetbrains.kotlin.backend.konan.descriptors.getKonanInternalFunctions import org.jetbrains.kotlin.backend.konan.descriptors.getKonanInternalFunctions
import org.jetbrains.kotlin.backend.konan.descriptors.unboundCallableReferenceTypeOrNull import org.jetbrains.kotlin.backend.konan.descriptors.unboundCallableReferenceTypeOrNull
import org.jetbrains.kotlin.descriptors.ParameterDescriptor import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
@@ -128,8 +129,17 @@ private class AutoboxingTransformer(val context: Context) : AbstractValueUsageTr
return this.adaptIfNecessary(actualType, type) return this.adaptIfNecessary(actualType, type)
} }
override fun IrExpression.useAsArgument(parameter: ParameterDescriptor): IrExpression { override fun IrExpression.useAsDispatchReceiver(function: CallableDescriptor): IrExpression {
return this.useAsValue(parameter.original) return this.useAsArgument(function.original.dispatchReceiverParameter!!)
}
override fun IrExpression.useAsExtensionReceiver(function: CallableDescriptor): IrExpression {
return this.useAsArgument(function.original.extensionReceiverParameter!!)
}
override fun IrExpression.useAsValueArgument(parameter: ValueParameterDescriptor): IrExpression {
val function = parameter.containingDeclaration
return this.useAsArgument(function.original.valueParameters[parameter.index])
} }
override fun IrExpression.useForField(field: PropertyDescriptor): IrExpression { override fun IrExpression.useForField(field: PropertyDescriptor): IrExpression {