fix some generic recursion issues

interfaces
cosmonaut 2021-09-07 01:58:48 -07:00
parent ff5011b813
commit 05b3707258
1 changed files with 72 additions and 68 deletions

View File

@ -111,7 +111,7 @@ struct StructTypeDeclaration
uint32_t genericFunctionCount; uint32_t genericFunctionCount;
}; };
StructTypeDeclaration *structTypeDeclarations; StructTypeDeclaration **structTypeDeclarations;
uint32_t structTypeDeclarationCount; uint32_t structTypeDeclarationCount;
typedef struct MonomorphizedGenericStructHashEntry typedef struct MonomorphizedGenericStructHashEntry
@ -401,9 +401,9 @@ static LLVMTypeRef LookupCustomType(char *name)
for (i = 0; i < structTypeDeclarationCount; i += 1) for (i = 0; i < structTypeDeclarationCount; i += 1)
{ {
if (strcmp(structTypeDeclarations[i].name, name) == 0) if (strcmp(structTypeDeclarations[i]->name, name) == 0)
{ {
return structTypeDeclarations[i].structType; return structTypeDeclarations[i]->structType;
} }
} }
@ -420,27 +420,30 @@ static StructTypeDeclaration *AddStructDeclaration(
uint32_t index = structTypeDeclarationCount; uint32_t index = structTypeDeclarationCount;
structTypeDeclarations = realloc( structTypeDeclarations = realloc(
structTypeDeclarations, structTypeDeclarations,
sizeof(StructTypeDeclaration) * (structTypeDeclarationCount + 1)); sizeof(StructTypeDeclaration*) * (structTypeDeclarationCount + 1));
structTypeDeclarations[index].module = module; structTypeDeclarations[index] = malloc(sizeof(StructTypeDeclaration));
structTypeDeclarations[index].structType = wStructType; structTypeDeclarations[index]->module = module;
structTypeDeclarations[index].structPointerType = wStructPointerType; structTypeDeclarations[index]->structType = wStructType;
structTypeDeclarations[index].name = strdup(name); structTypeDeclarations[index]->structPointerType = wStructPointerType;
structTypeDeclarations[index].fields = NULL; structTypeDeclarations[index]->name = strdup(name);
structTypeDeclarations[index].fieldCount = 0; structTypeDeclarations[index]->fields = NULL;
structTypeDeclarations[index].functions = NULL; structTypeDeclarations[index]->fieldCount = 0;
structTypeDeclarations[index].functionCount = 0; structTypeDeclarations[index]->functions = NULL;
structTypeDeclarations[index].genericFunctions = NULL; structTypeDeclarations[index]->functionCount = 0;
structTypeDeclarations[index].genericFunctionCount = 0; structTypeDeclarations[index]->genericFunctions = NULL;
structTypeDeclarations[index]->genericFunctionCount = 0;
structTypeDeclarationCount += 1; structTypeDeclarationCount += 1;
return &structTypeDeclarations[index]; return structTypeDeclarations[index];
} }
static StructTypeDeclaration *CompileMonomorphizedGenericStruct( static MonomorphizedGenericStructHashEntry *CompileMonomorphizedGenericStruct(
GenericStructTypeDeclaration *genericStructTypeDeclaration, GenericStructTypeDeclaration *genericStructTypeDeclaration,
TypeTag **genericArgumentTypes, TypeTag **genericArgumentTypes,
uint32_t genericArgumentTypeCount) uint32_t genericArgumentTypeCount,
MonomorphizedGenericStructHashArray *hashArray,
uint64_t typeHash)
{ {
uint32_t i = 0; uint32_t i = 0;
uint32_t fieldCount = 0; uint32_t fieldCount = 0;
@ -486,6 +489,25 @@ static StructTypeDeclaration *CompileMonomorphizedGenericStruct(
free(structName); free(structName);
/* add entry to the hash array here in case of recursion */
hashArray->elements = realloc(
hashArray->elements,
sizeof(MonomorphizedGenericStructHashEntry) *
(hashArray->count + 1));
hashArray->elements[hashArray->count].key = typeHash;
hashArray->elements[hashArray->count].types =
malloc(sizeof(TypeTag *) * genericArgumentTypeCount);
hashArray->elements[hashArray->count].typeCount =
genericArgumentTypeCount;
hashArray->elements[hashArray->count].structDeclaration =
declaration;
for (uint32_t j = 0; j < genericArgumentTypeCount; j += 1)
{
hashArray->elements[hashArray->count].types[j] =
genericArgumentTypes[j];
}
hashArray->count += 1;
/* first build the structure def */ /* first build the structure def */
for (i = 0; i < declarationCount; i += 1) for (i = 0; i < declarationCount; i += 1)
{ {
@ -528,7 +550,7 @@ static StructTypeDeclaration *CompileMonomorphizedGenericStruct(
PopScopeFrame(scope); PopScopeFrame(scope);
return declaration; return &hashArray->elements[hashArray->count - 1];;
} }
static StructTypeDeclaration *LookupGenericStructType( static StructTypeDeclaration *LookupGenericStructType(
@ -578,38 +600,20 @@ static StructTypeDeclaration *LookupGenericStructType(
if (match) if (match)
{ {
hashEntry = &hashArray->elements[i]; hashEntry = &hashArray->elements[j];
break; break;
} }
} }
if (hashEntry == NULL) if (hashEntry == NULL)
{ {
StructTypeDeclaration *structTypeDeclaration = hashEntry =
CompileMonomorphizedGenericStruct( CompileMonomorphizedGenericStruct(
&genericStructTypeDeclarations[i], &genericStructTypeDeclarations[i],
genericTypeTags, genericTypeTags,
typeTag->genericArgumentCount); typeTag->genericArgumentCount,
hashArray,
hashArray->elements = realloc( typeHash);
hashArray->elements,
sizeof(MonomorphizedGenericStructHashEntry) *
(hashArray->count + 1));
hashArray->elements[hashArray->count].key = typeHash;
hashArray->elements[hashArray->count].types =
malloc(sizeof(TypeTag *) * typeTag->genericArgumentCount);
hashArray->elements[hashArray->count].typeCount =
typeTag->genericArgumentCount;
hashArray->elements[hashArray->count].structDeclaration =
structTypeDeclaration;
for (j = 0; j < typeTag->genericArgumentCount; j += 1)
{
hashArray->elements[hashArray->count].types[j] =
genericTypeTags[j];
}
hashArray->count += 1;
hashEntry = &hashArray->elements[hashArray->count - 1];
} }
return hashEntry->structDeclaration; return hashEntry->structDeclaration;
@ -688,9 +692,9 @@ static LLVMTypeRef LookupStructTypeByName(char *name)
for (i = 0; i < structTypeDeclarationCount; i += 1) for (i = 0; i < structTypeDeclarationCount; i += 1)
{ {
if (strcmp(structTypeDeclarations[i].name, name) == 0) if (strcmp(structTypeDeclarations[i]->name, name) == 0)
{ {
return structTypeDeclarations[i].structType; return structTypeDeclarations[i]->structType;
} }
} }
@ -703,9 +707,9 @@ static StructTypeDeclaration *LookupStructDeclaration(LLVMTypeRef structType)
for (i = 0; i < structTypeDeclarationCount; i += 1) for (i = 0; i < structTypeDeclarationCount; i += 1)
{ {
if (structTypeDeclarations[i].structType == structType) if (structTypeDeclarations[i]->structType == structType)
{ {
return &structTypeDeclarations[i]; return structTypeDeclarations[i];
} }
} }
@ -724,18 +728,18 @@ static LLVMValueRef FindStructFieldPointer(
for (i = 0; i < structTypeDeclarationCount; i += 1) for (i = 0; i < structTypeDeclarationCount; i += 1)
{ {
if (structTypeDeclarations[i].structPointerType == structPointerType) if (structTypeDeclarations[i]->structPointerType == structPointerType)
{ {
for (j = 0; j < structTypeDeclarations[i].fieldCount; j += 1) for (j = 0; j < structTypeDeclarations[i]->fieldCount; j += 1)
{ {
if (strcmp(structTypeDeclarations[i].fields[j].name, name) == 0) if (strcmp(structTypeDeclarations[i]->fields[j].name, name) == 0)
{ {
char *ptrName = strdup(name); char *ptrName = strdup(name);
ptrName = w_strcat(ptrName, "_ptr"); ptrName = w_strcat(ptrName, "_ptr");
return LLVMBuildStructGEP( return LLVMBuildStructGEP(
builder, builder,
structPointer, structPointer,
structTypeDeclarations[i].fields[j].index, structTypeDeclarations[i]->fields[j].index,
ptrName); ptrName);
free(ptrName); free(ptrName);
} }
@ -1175,29 +1179,29 @@ static LLVMValueRef LookupFunctionByType(
for (i = 0; i < structTypeDeclarationCount; i += 1) for (i = 0; i < structTypeDeclarationCount; i += 1)
{ {
if (structTypeDeclarations[i].structType == structType) if (structTypeDeclarations[i]->structType == structType)
{ {
for (j = 0; j < structTypeDeclarations[i].functionCount; j += 1) for (j = 0; j < structTypeDeclarations[i]->functionCount; j += 1)
{ {
if (strcmp(structTypeDeclarations[i].functions[j].name, name) == if (strcmp(structTypeDeclarations[i]->functions[j].name, name) ==
0) 0)
{ {
*pReturnType = *pReturnType =
structTypeDeclarations[i].functions[j].returnType; structTypeDeclarations[i]->functions[j].returnType;
*pStatic = structTypeDeclarations[i].functions[j].isStatic; *pStatic = structTypeDeclarations[i]->functions[j].isStatic;
return structTypeDeclarations[i].functions[j].function; return structTypeDeclarations[i]->functions[j].function;
} }
} }
for (j = 0; j < structTypeDeclarations[i].genericFunctionCount; for (j = 0; j < structTypeDeclarations[i]->genericFunctionCount;
j += 1) j += 1)
{ {
if (strcmp( if (strcmp(
structTypeDeclarations[i].genericFunctions[j].name, structTypeDeclarations[i]->genericFunctions[j].name,
name) == 0) name) == 0)
{ {
return LookupGenericFunction( return LookupGenericFunction(
&structTypeDeclarations[i].genericFunctions[j], &structTypeDeclarations[i]->genericFunctions[j],
functionCallExpression, functionCallExpression,
pReturnType, pReturnType,
pStatic); pStatic);
@ -1221,29 +1225,29 @@ static LLVMValueRef LookupFunctionByPointerType(
for (i = 0; i < structTypeDeclarationCount; i += 1) for (i = 0; i < structTypeDeclarationCount; i += 1)
{ {
if (structTypeDeclarations[i].structPointerType == structPointerType) if (structTypeDeclarations[i]->structPointerType == structPointerType)
{ {
for (j = 0; j < structTypeDeclarations[i].functionCount; j += 1) for (j = 0; j < structTypeDeclarations[i]->functionCount; j += 1)
{ {
if (strcmp(structTypeDeclarations[i].functions[j].name, name) == if (strcmp(structTypeDeclarations[i]->functions[j].name, name) ==
0) 0)
{ {
*pReturnType = *pReturnType =
structTypeDeclarations[i].functions[j].returnType; structTypeDeclarations[i]->functions[j].returnType;
*pStatic = structTypeDeclarations[i].functions[j].isStatic; *pStatic = structTypeDeclarations[i]->functions[j].isStatic;
return structTypeDeclarations[i].functions[j].function; return structTypeDeclarations[i]->functions[j].function;
} }
} }
for (j = 0; j < structTypeDeclarations[i].genericFunctionCount; for (j = 0; j < structTypeDeclarations[i]->genericFunctionCount;
j += 1) j += 1)
{ {
if (strcmp( if (strcmp(
structTypeDeclarations[i].genericFunctions[j].name, structTypeDeclarations[i]->genericFunctions[j].name,
name) == 0) name) == 0)
{ {
return LookupGenericFunction( return LookupGenericFunction(
&structTypeDeclarations[i].genericFunctions[j], &structTypeDeclarations[i]->genericFunctions[j],
functionCallExpression, functionCallExpression,
pReturnType, pReturnType,
pStatic); pStatic);
@ -1391,7 +1395,7 @@ static LLVMValueRef CompileFunctionCallExpression(
&isStatic &isStatic
); );
free(typeTag); //free(typeTag);
} }
else else
{ {