Function without args returnung void has been inlined

This commit is contained in:
Konstantin Anisimov
2016-12-26 15:39:13 +07:00
parent ee184de993
commit c106e4622c
@@ -1,33 +1,38 @@
package org.jetbrains.kotlin.backend.konan.lower 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.Context
import org.jetbrains.kotlin.backend.konan.ir.ModuleIndex
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.IrFile 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.expressions.IrCall
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl
import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.ir.expressions.impl.IrBlockImpl
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
internal class FunctionInlining(val context: Context) { internal class FunctionInlining(val context: Context) {
fun inline(irFile: IrFile) { fun inline(irFile: IrFile) {
irFile.acceptVoid(object : IrElementVisitorVoid { irFile.accept(object : IrElementTransformerVoid() {
override fun visitElement(element: IrElement) { override fun visitElement(element: IrElement) = element.accept(this, null)
element.acceptChildrenVoid(this)
}
override fun visitCall(expression: IrCall) { override fun visitCall(expression: IrCall): IrExpression {
val functionDescriptor = expression.descriptor as FunctionDescriptor val functionDescriptor = expression.descriptor as FunctionDescriptor //
if (functionDescriptor.isInline == false) { if (functionDescriptor.isInline == false) return super.visitCall(expression) // function is not to be inlined - do nothing
super.visitCall(expression)
} else { if (!functionDescriptor.name.asString().contains("foo")) return super.visitCall(expression)
val functionDeclaration = context.ir.moduleIndex.functions[functionDescriptor]
println("inline_akm") 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)
} }
} }