skeleton of generic function lookup
parent
24bcef6d87
commit
0d94e89045
|
@ -411,9 +411,22 @@ static LLVMTypeRef ResolveType(Node *typeNode)
|
|||
}
|
||||
}
|
||||
|
||||
static LLVMValueRef LookupGenericFunction(
|
||||
StructTypeGenericFunction *genericFunction,
|
||||
TypeTag **genericArgumentTypes,
|
||||
uint32_t genericArgumentTypeCount,
|
||||
LLVMTypeRef *pReturnType,
|
||||
uint8_t *pStatic)
|
||||
{
|
||||
/* TODO: hash the argument types */
|
||||
/* TODO: compile the monomorphism if doesnt exist */
|
||||
}
|
||||
|
||||
static LLVMValueRef LookupFunctionByType(
|
||||
LLVMTypeRef structType,
|
||||
char *name,
|
||||
TypeTag **genericArgumentTypes,
|
||||
uint32_t genericArgumentTypeCount,
|
||||
LLVMTypeRef *pReturnType,
|
||||
uint8_t *pStatic)
|
||||
{
|
||||
|
@ -434,6 +447,22 @@ static LLVMValueRef LookupFunctionByType(
|
|||
return structTypeDeclarations[i].functions[j].function;
|
||||
}
|
||||
}
|
||||
|
||||
for (j = 0; j < structTypeDeclarations[i].genericFunctionCount;
|
||||
j += 1)
|
||||
{
|
||||
if (strcmp(
|
||||
structTypeDeclarations[i].genericFunctions[j].name,
|
||||
name) == 0)
|
||||
{
|
||||
return LookupGenericFunction(
|
||||
&structTypeDeclarations[i].genericFunctions[j],
|
||||
genericArgumentTypes,
|
||||
genericArgumentTypeCount,
|
||||
pReturnType,
|
||||
pStatic);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -444,6 +473,8 @@ static LLVMValueRef LookupFunctionByType(
|
|||
static LLVMValueRef LookupFunctionByPointerType(
|
||||
LLVMTypeRef structPointerType,
|
||||
char *name,
|
||||
TypeTag **genericArgumentTypes,
|
||||
uint32_t genericArgumentTypeCount,
|
||||
LLVMTypeRef *pReturnType,
|
||||
uint8_t *pStatic)
|
||||
{
|
||||
|
@ -464,6 +495,22 @@ static LLVMValueRef LookupFunctionByPointerType(
|
|||
return structTypeDeclarations[i].functions[j].function;
|
||||
}
|
||||
}
|
||||
|
||||
for (j = 0; j < structTypeDeclarations[i].genericFunctionCount;
|
||||
j += 1)
|
||||
{
|
||||
if (strcmp(
|
||||
structTypeDeclarations[i].genericFunctions[j].name,
|
||||
name) == 0)
|
||||
{
|
||||
return LookupGenericFunction(
|
||||
&structTypeDeclarations[i].genericFunctions[j],
|
||||
genericArgumentTypes,
|
||||
genericArgumentTypeCount,
|
||||
pReturnType,
|
||||
pStatic);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -474,12 +521,16 @@ static LLVMValueRef LookupFunctionByPointerType(
|
|||
static LLVMValueRef LookupFunctionByInstance(
|
||||
LLVMValueRef structPointer,
|
||||
char *name,
|
||||
TypeTag **genericArgumentTypes,
|
||||
uint32_t genericArgumentTypeCount,
|
||||
LLVMTypeRef *pReturnType,
|
||||
uint8_t *pStatic)
|
||||
{
|
||||
return LookupFunctionByPointerType(
|
||||
LLVMTypeOf(structPointer),
|
||||
name,
|
||||
genericArgumentTypes,
|
||||
genericArgumentTypeCount,
|
||||
pReturnType,
|
||||
pStatic);
|
||||
}
|
||||
|
@ -591,16 +642,37 @@ static LLVMValueRef CompileFunctionCallExpression(
|
|||
{
|
||||
uint32_t i;
|
||||
uint32_t argumentCount = 0;
|
||||
uint32_t genericArgumentCount = 0;
|
||||
LLVMValueRef args
|
||||
[functionCallExpression->functionCallExpression.argumentSequence
|
||||
->functionArgumentSequence.count +
|
||||
1];
|
||||
TypeTag *genericArgumentTypes[functionCallExpression->functionCallExpression
|
||||
.argumentSequence
|
||||
->functionArgumentSequence.count];
|
||||
LLVMValueRef function;
|
||||
uint8_t isStatic;
|
||||
LLVMValueRef structInstance;
|
||||
LLVMTypeRef functionReturnType;
|
||||
char *returnName = "";
|
||||
|
||||
for (i = 0; i < functionCallExpression->functionCallExpression
|
||||
.argumentSequence->functionArgumentSequence.count;
|
||||
i += 1)
|
||||
{
|
||||
if (functionCallExpression->functionCallExpression.argumentSequence
|
||||
->functionArgumentSequence.sequence[i]
|
||||
->syntaxKind == GenericArgument)
|
||||
{
|
||||
genericArgumentTypes[genericArgumentCount] =
|
||||
functionCallExpression->functionCallExpression.argumentSequence
|
||||
->functionArgumentSequence.sequence[i]
|
||||
->typeTag;
|
||||
|
||||
genericArgumentCount += 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* FIXME: this needs to be recursive on access chains */
|
||||
/* FIXME: this needs to be able to call same-struct functions implicitly */
|
||||
if (functionCallExpression->functionCallExpression.identifier->syntaxKind ==
|
||||
|
@ -616,6 +688,8 @@ static LLVMValueRef CompileFunctionCallExpression(
|
|||
typeReference,
|
||||
functionCallExpression->functionCallExpression.identifier
|
||||
->accessExpression.accessor->identifier.name,
|
||||
genericArgumentTypes,
|
||||
genericArgumentCount,
|
||||
&functionReturnType,
|
||||
&isStatic);
|
||||
}
|
||||
|
@ -628,6 +702,8 @@ static LLVMValueRef CompileFunctionCallExpression(
|
|||
structInstance,
|
||||
functionCallExpression->functionCallExpression.identifier
|
||||
->accessExpression.accessor->identifier.name,
|
||||
genericArgumentTypes,
|
||||
genericArgumentCount,
|
||||
&functionReturnType,
|
||||
&isStatic);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue