forked from cosmonaut/wraith-lang
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(
|
static LLVMValueRef LookupFunctionByType(
|
||||||
LLVMTypeRef structType,
|
LLVMTypeRef structType,
|
||||||
char *name,
|
char *name,
|
||||||
|
TypeTag **genericArgumentTypes,
|
||||||
|
uint32_t genericArgumentTypeCount,
|
||||||
LLVMTypeRef *pReturnType,
|
LLVMTypeRef *pReturnType,
|
||||||
uint8_t *pStatic)
|
uint8_t *pStatic)
|
||||||
{
|
{
|
||||||
|
@ -434,6 +447,22 @@ static LLVMValueRef LookupFunctionByType(
|
||||||
return structTypeDeclarations[i].functions[j].function;
|
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(
|
static LLVMValueRef LookupFunctionByPointerType(
|
||||||
LLVMTypeRef structPointerType,
|
LLVMTypeRef structPointerType,
|
||||||
char *name,
|
char *name,
|
||||||
|
TypeTag **genericArgumentTypes,
|
||||||
|
uint32_t genericArgumentTypeCount,
|
||||||
LLVMTypeRef *pReturnType,
|
LLVMTypeRef *pReturnType,
|
||||||
uint8_t *pStatic)
|
uint8_t *pStatic)
|
||||||
{
|
{
|
||||||
|
@ -464,6 +495,22 @@ static LLVMValueRef LookupFunctionByPointerType(
|
||||||
return structTypeDeclarations[i].functions[j].function;
|
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(
|
static LLVMValueRef LookupFunctionByInstance(
|
||||||
LLVMValueRef structPointer,
|
LLVMValueRef structPointer,
|
||||||
char *name,
|
char *name,
|
||||||
|
TypeTag **genericArgumentTypes,
|
||||||
|
uint32_t genericArgumentTypeCount,
|
||||||
LLVMTypeRef *pReturnType,
|
LLVMTypeRef *pReturnType,
|
||||||
uint8_t *pStatic)
|
uint8_t *pStatic)
|
||||||
{
|
{
|
||||||
return LookupFunctionByPointerType(
|
return LookupFunctionByPointerType(
|
||||||
LLVMTypeOf(structPointer),
|
LLVMTypeOf(structPointer),
|
||||||
name,
|
name,
|
||||||
|
genericArgumentTypes,
|
||||||
|
genericArgumentTypeCount,
|
||||||
pReturnType,
|
pReturnType,
|
||||||
pStatic);
|
pStatic);
|
||||||
}
|
}
|
||||||
|
@ -591,16 +642,37 @@ static LLVMValueRef CompileFunctionCallExpression(
|
||||||
{
|
{
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
uint32_t argumentCount = 0;
|
uint32_t argumentCount = 0;
|
||||||
|
uint32_t genericArgumentCount = 0;
|
||||||
LLVMValueRef args
|
LLVMValueRef args
|
||||||
[functionCallExpression->functionCallExpression.argumentSequence
|
[functionCallExpression->functionCallExpression.argumentSequence
|
||||||
->functionArgumentSequence.count +
|
->functionArgumentSequence.count +
|
||||||
1];
|
1];
|
||||||
|
TypeTag *genericArgumentTypes[functionCallExpression->functionCallExpression
|
||||||
|
.argumentSequence
|
||||||
|
->functionArgumentSequence.count];
|
||||||
LLVMValueRef function;
|
LLVMValueRef function;
|
||||||
uint8_t isStatic;
|
uint8_t isStatic;
|
||||||
LLVMValueRef structInstance;
|
LLVMValueRef structInstance;
|
||||||
LLVMTypeRef functionReturnType;
|
LLVMTypeRef functionReturnType;
|
||||||
char *returnName = "";
|
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 recursive on access chains */
|
||||||
/* FIXME: this needs to be able to call same-struct functions implicitly */
|
/* FIXME: this needs to be able to call same-struct functions implicitly */
|
||||||
if (functionCallExpression->functionCallExpression.identifier->syntaxKind ==
|
if (functionCallExpression->functionCallExpression.identifier->syntaxKind ==
|
||||||
|
@ -616,6 +688,8 @@ static LLVMValueRef CompileFunctionCallExpression(
|
||||||
typeReference,
|
typeReference,
|
||||||
functionCallExpression->functionCallExpression.identifier
|
functionCallExpression->functionCallExpression.identifier
|
||||||
->accessExpression.accessor->identifier.name,
|
->accessExpression.accessor->identifier.name,
|
||||||
|
genericArgumentTypes,
|
||||||
|
genericArgumentCount,
|
||||||
&functionReturnType,
|
&functionReturnType,
|
||||||
&isStatic);
|
&isStatic);
|
||||||
}
|
}
|
||||||
|
@ -628,6 +702,8 @@ static LLVMValueRef CompileFunctionCallExpression(
|
||||||
structInstance,
|
structInstance,
|
||||||
functionCallExpression->functionCallExpression.identifier
|
functionCallExpression->functionCallExpression.identifier
|
||||||
->accessExpression.accessor->identifier.name,
|
->accessExpression.accessor->identifier.name,
|
||||||
|
genericArgumentTypes,
|
||||||
|
genericArgumentCount,
|
||||||
&functionReturnType,
|
&functionReturnType,
|
||||||
&isStatic);
|
&isStatic);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue