From 7cebc4f676a35a8ec66d52f08edea479ef60855e Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Tue, 13 Dec 2016 14:26:44 +0700 Subject: [PATCH] backend: support function types with receiver --- .../jetbrains/kotlin/backend/konan/DescriptorUtils.kt | 10 ++++++++++ .../jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt | 9 ++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/DescriptorUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/DescriptorUtils.kt index b9e40e97cf8..80a399e1521 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/DescriptorUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/DescriptorUtils.kt @@ -1,6 +1,7 @@ package org.jetbrains.kotlin.backend.konan import org.jetbrains.kotlin.backend.konan.llvm.KonanBuiltIns +import org.jetbrains.kotlin.builtins.isFunctionType import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.name.FqName @@ -9,6 +10,7 @@ import org.jetbrains.kotlin.resolve.OverridingUtil import org.jetbrains.kotlin.resolve.descriptorUtil.* import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeUtils +import org.jetbrains.kotlin.util.OperatorNameConventions /** * List of all implemented interfaces (including those which implemented by a super class) @@ -112,3 +114,11 @@ internal val CallableDescriptor.allValueParameters: List return receivers + this.valueParameters } + +internal val FunctionDescriptor.isFunctionInvoke: Boolean + get() { + val dispatchReceiver = dispatchReceiverParameter ?: return false + + return dispatchReceiver.type.isFunctionType && + this.isOperator && this.name == OperatorNameConventions.INVOKE + } 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 7580c4a137f..8dab7a5cba2 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 @@ -4,7 +4,6 @@ import kotlinx.cinterop.* import llvm.* import org.jetbrains.kotlin.backend.konan.* import org.jetbrains.kotlin.builtins.KotlinBuiltIns -import org.jetbrains.kotlin.builtins.functions.FunctionInvokeDescriptor import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.ir.IrElement @@ -1563,8 +1562,12 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid private fun evaluateFunctionCall(tmpVariableName: String, callee: IrCall, args: List): LLVMValueRef { val descriptor:FunctionDescriptor = callee.descriptor as FunctionDescriptor + + if (descriptor.isFunctionInvoke) { + return evaluateFunctionInvoke(tmpVariableName, descriptor, args) + } + when (descriptor) { - is FunctionInvokeDescriptor -> return evaluateFunctionInvoke (tmpVariableName, descriptor, args) is IrBuiltinOperatorDescriptorBase -> return evaluateOperatorCall (tmpVariableName, callee, args) is ClassConstructorDescriptor -> return evaluateConstructorCall (tmpVariableName, callee, args) else -> return evaluateSimpleFunctionCall(tmpVariableName, descriptor, args) @@ -1582,7 +1585,7 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid } private fun evaluateFunctionInvoke(tmpVariableName: String, - descriptor: FunctionInvokeDescriptor, + descriptor: FunctionDescriptor, args: List): LLVMValueRef { // Note: the whole function code below is written in the assumption that