From d45f3fe67808cb568249392de30407ac3fa88638 Mon Sep 17 00:00:00 2001 From: Konstantin Anisimov Date: Fri, 24 Mar 2017 16:34:24 +0700 Subject: [PATCH] Support for default arguments --- .../backend/konan/lower/FunctionInlining.kt | 39 +++++++++---------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt index 05dc0066deb..435074f95a7 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt @@ -98,7 +98,7 @@ internal class FunctionInlining(val context: Context): IrElementTransformerVoid( //-------------------------------------------------------------------------// - fun getArguments(irCall: IrCall): MutableMap { + fun getArguments(irCall: IrCall, declaration: IrFunction): MutableMap { val result = mutableMapOf() val descriptor = irCall.descriptor.original @@ -110,10 +110,13 @@ internal class FunctionInlining(val context: Context): IrElementTransformerVoid( result += (descriptor.extensionReceiverParameter!! to it) } - descriptor.valueParameters.forEach { - val arg = irCall.getValueArgument(it.index) - if (arg != null) { - result += (it to arg) + descriptor.valueParameters.forEach { parameter -> + val argument = irCall.getValueArgument(parameter.index) + if (argument != null) { + result += (parameter to argument) + } else { + val defaultArgument = declaration.getDefault(parameter)!!.expression + result += (parameter to defaultArgument) } } @@ -167,7 +170,7 @@ internal class FunctionInlining(val context: Context): IrElementTransformerVoid( val inlineBody = IrInlineFunctionBody(startOffset, endOffset, returnType, null, statements) val evaluationStatements = mutableListOf() - val parametersOld = getArguments(irCall) // Create map call_site_argument -> inline_function_parameter. + val parametersOld = getArguments(irCall, copyFuncDeclaration) // Create map call_site_argument -> inline_function_parameter. val parameterToArgument = evaluateParameters(parametersOld, evaluationStatements) val lambdaInliner = LambdaInliner(parameterToArgument) inlineBody.transformChildrenVoid(lambdaInliner) @@ -433,21 +436,15 @@ internal class FunctionInlining(val context: Context): IrElementTransformerVoid( class InlineCopyIr() : DeepCopyIrTree() { override fun visitBlock(expression: IrBlock): IrBlock { - return when(expression) { - is IrInlineFunctionBody -> - IrInlineFunctionBody( - expression.startOffset, expression.endOffset, - expression.type, - mapStatementOrigin(expression.origin), - expression.statements.map { it.transform(this, null) } - ) - - else -> IrBlockImpl( - expression.startOffset, expression.endOffset, - expression.type, - mapStatementOrigin(expression.origin), - expression.statements.map { it.transform(this, null) } - ) + return if(expression is IrInlineFunctionBody) { + IrInlineFunctionBody( + expression.startOffset, expression.endOffset, + expression.type, + mapStatementOrigin(expression.origin), + expression.statements.map { it.transform(this, null) } + ) + } else { + super.visitBlock(expression) } } }