From c106e4622cdd3e2c8db2d99274a0fdee67fb32ea Mon Sep 17 00:00:00 2001 From: Konstantin Anisimov Date: Mon, 26 Dec 2016 15:39:13 +0700 Subject: [PATCH] Function without args returnung void has been inlined --- .../backend/konan/lower/FunctionInlining.kt | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 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 d5535a709bf..0725568c4bb 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 @@ -1,33 +1,38 @@ package org.jetbrains.kotlin.backend.konan.lower -import org.jetbrains.kotlin.backend.common.BackendContext import org.jetbrains.kotlin.backend.konan.Context -import org.jetbrains.kotlin.backend.konan.ir.ModuleIndex import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.IrFile +import org.jetbrains.kotlin.ir.expressions.IrBody import org.jetbrains.kotlin.ir.expressions.IrCall -import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid -import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid -import org.jetbrains.kotlin.ir.visitors.acceptVoid +import org.jetbrains.kotlin.ir.expressions.IrExpression +import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl +import org.jetbrains.kotlin.ir.expressions.impl.IrBlockImpl +import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid internal class FunctionInlining(val context: Context) { fun inline(irFile: IrFile) { - irFile.acceptVoid(object : IrElementVisitorVoid { - override fun visitElement(element: IrElement) { - element.acceptChildrenVoid(this) - } + irFile.accept(object : IrElementTransformerVoid() { + override fun visitElement(element: IrElement) = element.accept(this, null) - override fun visitCall(expression: IrCall) { - val functionDescriptor = expression.descriptor as FunctionDescriptor - if (functionDescriptor.isInline == false) { - super.visitCall(expression) - } else { - val functionDeclaration = context.ir.moduleIndex.functions[functionDescriptor] - println("inline_akm") - } + override fun visitCall(expression: IrCall): IrExpression { + val functionDescriptor = expression.descriptor as FunctionDescriptor // + if (functionDescriptor.isInline == false) return super.visitCall(expression) // function is not to be inlined - do nothing + + if (!functionDescriptor.name.asString().contains("foo")) return super.visitCall(expression) + + val functionDeclaration = context.ir.moduleIndex.functions[functionDescriptor]!! // get FunctionDeclaration by FunctionDescriptor + val body = functionDeclaration.body!! as IrBlockBodyImpl + + val startOffset = functionDeclaration.startOffset + val endOffset = functionDeclaration.endOffset + val returnType = functionDeclaration.descriptor.returnType!! + val statements = body.statements + val irBlock = IrBlockImpl(startOffset, endOffset, returnType, null, statements) // create + return irBlock } - }) + }, null) } }