Kotlin methods are excluded from inlining

This commit is contained in:
Konstantin Anisimov
2017-02-20 16:52:47 +07:00
parent 3b5c16076e
commit a71cd69f72
@@ -6,7 +6,7 @@ import org.jetbrains.kotlin.backend.konan.ir.IrInlineFunctionBody
import org.jetbrains.kotlin.backend.konan.ir.getArguments import org.jetbrains.kotlin.backend.konan.ir.getArguments
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.ParameterDescriptor import org.jetbrains.kotlin.descriptors.ParameterDescriptor
import org.jetbrains.kotlin.descriptors.impl.TypeParameterDescriptorImpl import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.builders.Scope import org.jetbrains.kotlin.ir.builders.Scope
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.ir.util.DeepCopyIrTree
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
//-----------------------------------------------------------------------------// //-----------------------------------------------------------------------------//
internal class FunctionInlining(val context: Context): IrElementTransformerVoid() { internal class FunctionInlining(val context: Context): IrElementTransformerVoid() {
@@ -30,6 +29,15 @@ internal class FunctionInlining(val context: Context): IrElementTransformerVoid(
//-------------------------------------------------------------------------// //-------------------------------------------------------------------------//
var fqName: String? = null
override fun visitFile(declaration: IrFile): IrFile {
fqName = declaration.packageFragmentDescriptor.fqName.asString()
println("akm_inline $fqName")
return super.visitFile(declaration)
}
//-------------------------------------------------------------------------//
fun isLambdaExpression(expression: IrExpression) : Boolean { fun isLambdaExpression(expression: IrExpression) : Boolean {
if (expression !is IrContainerExpressionBase) return false if (expression !is IrContainerExpressionBase) return false
if (expression.origin != IrStatementOrigin.LAMBDA) return false if (expression.origin != IrStatementOrigin.LAMBDA) return false
@@ -68,7 +76,6 @@ internal class FunctionInlining(val context: Context): IrElementTransformerVoid(
.functions[functionDescriptor.original] // Get FunctionDeclaration by FunctionDescriptor. .functions[functionDescriptor.original] // Get FunctionDeclaration by FunctionDescriptor.
if (functionDeclaration == null) return super.visitCall(irCall) // Function is declared in another module. if (functionDeclaration == null) return super.visitCall(irCall) // Function is declared in another module.
val copyFuncDeclaration = functionDeclaration.accept(DeepCopyIrTree(), // Create copy of the function. val copyFuncDeclaration = functionDeclaration.accept(DeepCopyIrTree(), // Create copy of the function.
null) as IrFunction null) as IrFunction
@@ -84,16 +91,18 @@ internal class FunctionInlining(val context: Context): IrElementTransformerVoid(
inlineBody.accept(lambdaInliner, null) inlineBody.accept(lambdaInliner, null)
val transformer = ParametersTransformer(parameters, irCall) val transformer = ParametersTransformer(parameters, irCall)
inlineBody.accept(transformer, null) // Replace parameters with expression. inlineBody.accept(transformer, null) // Replace parameters with expression.
return inlineBody return super.visitBlock(inlineBody)
} }
//-------------------------------------------------------------------------// //-------------------------------------------------------------------------//
override fun visitCall(expression: IrCall): IrExpression { override fun visitCall(expression: IrCall): IrExpression {
val functionDescriptor = expression.descriptor as FunctionDescriptor
if (!functionDescriptor.name.asString().contains("foo")) return super.visitCall(expression)
if(fqName!!.contains("kotlin")) return super.visitCall(expression)
val functionDescriptor = expression.descriptor as FunctionDescriptor
if (functionDescriptor.isInline) return inlineFunction(expression) // Return newly created IrInlineBody instead of IrCall. if (functionDescriptor.isInline) return inlineFunction(expression) // Return newly created IrInlineBody instead of IrCall.
return super.visitCall(expression) return super.visitCall(expression)
} }
@@ -194,8 +203,9 @@ internal class ParametersTransformer(val parameterToArgument: List<Pair<Paramete
val expression = super.visitTypeOperator(oldExpression) as IrTypeOperatorCall val expression = super.visitTypeOperator(oldExpression) as IrTypeOperatorCall
val typeArgsMap = (callSite as IrMemberAccessExpressionBase).typeArguments!! val typeArgsMap = (callSite as IrMemberAccessExpressionBase).typeArguments!!
val typeConstructor = expression.typeOperand.constructor val declarationDescriptor = expression.typeOperand.constructor.declarationDescriptor
val typeOld = typeConstructor.declarationDescriptor as TypeParameterDescriptorImpl
val typeOld = declarationDescriptor as TypeParameterDescriptor
val typeNew = typeArgsMap[typeOld]!! val typeNew = typeArgsMap[typeOld]!!
val startOffset = expression.startOffset val startOffset = expression.startOffset
val endOffset = expression.endOffset val endOffset = expression.endOffset