From be2b2f1b438fe47493198c0e03062408fcd6cccb Mon Sep 17 00:00:00 2001 From: Konstantin Anisimov Date: Thu, 2 Feb 2017 16:33:55 +0700 Subject: [PATCH] Non local return implemented --- .../jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt | 2 ++ .../org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt | 5 +++++ .../kotlin/backend/konan/lower/FunctionInlining.kt | 7 +++---- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt index a92ed8f3e67..e47a0aebd85 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt @@ -20,6 +20,7 @@ internal class CodeGenerator(override val context: Context) : ContextUtils { var returnSlot: LLVMValueRef? = null var slotsPhi: LLVMValueRef? = null var slotCount = 0 + var functionDescriptor: FunctionDescriptor? = null fun prologue(descriptor: FunctionDescriptor) { prologue(llvmFunction(descriptor), @@ -27,6 +28,7 @@ internal class CodeGenerator(override val context: Context) : ContextUtils { if (descriptor is ConstructorDescriptor) { constructedClass = descriptor.constructedClass } + functionDescriptor = descriptor } fun prologue(function:LLVMValueRef, returnType:LLVMTypeRef) { diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index bd8d8d19a45..d266d8ee67f 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -1491,6 +1491,11 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid } override fun genReturn(target: CallableDescriptor, value: LLVMValueRef?) { + if (target == codegen.functionDescriptor) { + super.genReturn(target, value) + return + } + if (KotlinBuiltIns.isUnit(inlineBody.type) == false) { codegen.assignPhis(getResult()!! to value!!) } 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 7db7621c86c..0de52cfcc00 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 @@ -35,7 +35,6 @@ internal class FunctionInlining(val context: Context): IrElementTransformerVoid( //-------------------------------------------------------------------------// fun getLambdaStatements(value: IrExpression) : MutableList { - val statements = (value as IrContainerExpressionBase).statements val lambdaFunction = statements[0] as IrFunction val lambdaBody = lambdaFunction.body as IrBlockBody @@ -52,11 +51,11 @@ internal class FunctionInlining(val context: Context): IrElementTransformerVoid( //-------------------------------------------------------------------------// - fun evaluateParameters(callExpression: IrCall, + fun evaluateParameters(irCall: IrCall, statements: MutableList): List> { - val scope = Scope(callExpression.descriptor as FunctionDescriptor) - val parametersOld = callExpression.getArguments() // Create map inline_function_parameter -> containing_function_expression. + val scope = Scope(irCall.descriptor as FunctionDescriptor) + val parametersOld = irCall.getArguments() // Create map inline_function_parameter -> containing_function_expression. val parametersNew = parametersOld.map { val parameter = it.first val expression = it.second