backend: support function types with receiver
This commit is contained in:
committed by
SvyatoslavScherbina
parent
319a473565
commit
7cebc4f676
+10
@@ -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
|
||||
}
|
||||
|
||||
+6
-3
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user