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:
+5
-3
@@ -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.
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------------//
|
//-------------------------------------------------------------------------//
|
||||||
|
|||||||
Reference in New Issue
Block a user