Fixed order of arguments for inline function

Default arguments are evaluated inside callee as opposed to other
arguments computed at callsite.
This commit is contained in:
Igor Chevdar
2017-05-17 18:32:06 +03:00
parent dfc179e2b9
commit 8599ac065f
@@ -247,7 +247,7 @@ private class Inliner(val currentScope: ScopeWithIr, val context: Context) {
private fun buildParameterToArgument(irCall : IrCall, // Call site. private fun buildParameterToArgument(irCall : IrCall, // Call site.
irFunction: IrFunction // Function to be called. irFunction: IrFunction // Function to be called.
): MutableList<ParameterToArgument> { ): List<ParameterToArgument> {
val parameterToArgument = mutableListOf<ParameterToArgument>() // Result list. val parameterToArgument = mutableListOf<ParameterToArgument>() // Result list.
val functionDescriptor = irFunction.descriptor.original // Descriptor of function to be called. val functionDescriptor = irFunction.descriptor.original // Descriptor of function to be called.
@@ -277,6 +277,7 @@ private class Inliner(val currentScope: ScopeWithIr, val context: Context) {
valueArguments.add(0, irCall.extensionReceiver!!) valueArguments.add(0, irCall.extensionReceiver!!)
} }
val parametersWithDefaultToArgument = mutableListOf<ParameterToArgument>()
functionDescriptor.valueParameters.forEach { parameterDescriptor -> // Iterate value parameter descriptors. functionDescriptor.valueParameters.forEach { parameterDescriptor -> // Iterate value parameter descriptors.
val argument = valueArguments[parameterDescriptor.index] // Get appropriate argument from call site. val argument = valueArguments[parameterDescriptor.index] // Get appropriate argument from call site.
when { when {
@@ -289,7 +290,7 @@ private class Inliner(val currentScope: ScopeWithIr, val context: Context) {
parameterDescriptor.hasDefaultValue() -> { // There is no argument - try default value. parameterDescriptor.hasDefaultValue() -> { // There is no argument - try default value.
val defaultArgument = irFunction.getDefault(parameterDescriptor)!! val defaultArgument = irFunction.getDefault(parameterDescriptor)!!
parameterToArgument += ParameterToArgument( parametersWithDefaultToArgument += ParameterToArgument(
parameterDescriptor = parameterDescriptor, parameterDescriptor = parameterDescriptor,
argumentExpression = defaultArgument.expression argumentExpression = defaultArgument.expression
) )
@@ -315,7 +316,8 @@ private class Inliner(val currentScope: ScopeWithIr, val context: Context) {
} }
} }
} }
return parameterToArgument return parameterToArgument + parametersWithDefaultToArgument // All arguments except default are evaluated at callsite,
// but default arguments are evaluated inside callee.
} }
//-------------------------------------------------------------------------// //-------------------------------------------------------------------------//