backend: support function types with receiver

This commit is contained in:
Svyatoslav Scherbina
2016-12-13 14:26:44 +07:00
committed by SvyatoslavScherbina
parent 319a473565
commit 7cebc4f676
2 changed files with 16 additions and 3 deletions
@@ -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<ParameterDescriptor>
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
}
@@ -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>): 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>): LLVMValueRef {
// Note: the whole function code below is written in the assumption that