fix some generic recursion issues
parent
ff5011b813
commit
05b3707258
140
src/codegen.c
140
src/codegen.c
|
@ -111,7 +111,7 @@ struct StructTypeDeclaration
|
|||
uint32_t genericFunctionCount;
|
||||
};
|
||||
|
||||
StructTypeDeclaration *structTypeDeclarations;
|
||||
StructTypeDeclaration **structTypeDeclarations;
|
||||
uint32_t structTypeDeclarationCount;
|
||||
|
||||
typedef struct MonomorphizedGenericStructHashEntry
|
||||
|
@ -401,9 +401,9 @@ static LLVMTypeRef LookupCustomType(char *name)
|
|||
|
||||
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;
|
||||
structTypeDeclarations = realloc(
|
||||
structTypeDeclarations,
|
||||
sizeof(StructTypeDeclaration) * (structTypeDeclarationCount + 1));
|
||||
structTypeDeclarations[index].module = module;
|
||||
structTypeDeclarations[index].structType = wStructType;
|
||||
structTypeDeclarations[index].structPointerType = wStructPointerType;
|
||||
structTypeDeclarations[index].name = strdup(name);
|
||||
structTypeDeclarations[index].fields = NULL;
|
||||
structTypeDeclarations[index].fieldCount = 0;
|
||||
structTypeDeclarations[index].functions = NULL;
|
||||
structTypeDeclarations[index].functionCount = 0;
|
||||
structTypeDeclarations[index].genericFunctions = NULL;
|
||||
structTypeDeclarations[index].genericFunctionCount = 0;
|
||||
sizeof(StructTypeDeclaration*) * (structTypeDeclarationCount + 1));
|
||||
structTypeDeclarations[index] = malloc(sizeof(StructTypeDeclaration));
|
||||
structTypeDeclarations[index]->module = module;
|
||||
structTypeDeclarations[index]->structType = wStructType;
|
||||
structTypeDeclarations[index]->structPointerType = wStructPointerType;
|
||||
structTypeDeclarations[index]->name = strdup(name);
|
||||
structTypeDeclarations[index]->fields = NULL;
|
||||
structTypeDeclarations[index]->fieldCount = 0;
|
||||
structTypeDeclarations[index]->functions = NULL;
|
||||
structTypeDeclarations[index]->functionCount = 0;
|
||||
structTypeDeclarations[index]->genericFunctions = NULL;
|
||||
structTypeDeclarations[index]->genericFunctionCount = 0;
|
||||
|
||||
structTypeDeclarationCount += 1;
|
||||
|
||||
return &structTypeDeclarations[index];
|
||||
return structTypeDeclarations[index];
|
||||
}
|
||||
|
||||
static StructTypeDeclaration *CompileMonomorphizedGenericStruct(
|
||||
static MonomorphizedGenericStructHashEntry *CompileMonomorphizedGenericStruct(
|
||||
GenericStructTypeDeclaration *genericStructTypeDeclaration,
|
||||
TypeTag **genericArgumentTypes,
|
||||
uint32_t genericArgumentTypeCount)
|
||||
uint32_t genericArgumentTypeCount,
|
||||
MonomorphizedGenericStructHashArray *hashArray,
|
||||
uint64_t typeHash)
|
||||
{
|
||||
uint32_t i = 0;
|
||||
uint32_t fieldCount = 0;
|
||||
|
@ -486,6 +489,25 @@ static StructTypeDeclaration *CompileMonomorphizedGenericStruct(
|
|||
|
||||
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 */
|
||||
for (i = 0; i < declarationCount; i += 1)
|
||||
{
|
||||
|
@ -528,7 +550,7 @@ static StructTypeDeclaration *CompileMonomorphizedGenericStruct(
|
|||
|
||||
PopScopeFrame(scope);
|
||||
|
||||
return declaration;
|
||||
return &hashArray->elements[hashArray->count - 1];;
|
||||
}
|
||||
|
||||
static StructTypeDeclaration *LookupGenericStructType(
|
||||
|
@ -578,38 +600,20 @@ static StructTypeDeclaration *LookupGenericStructType(
|
|||
|
||||
if (match)
|
||||
{
|
||||
hashEntry = &hashArray->elements[i];
|
||||
hashEntry = &hashArray->elements[j];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (hashEntry == NULL)
|
||||
{
|
||||
StructTypeDeclaration *structTypeDeclaration =
|
||||
hashEntry =
|
||||
CompileMonomorphizedGenericStruct(
|
||||
&genericStructTypeDeclarations[i],
|
||||
genericTypeTags,
|
||||
typeTag->genericArgumentCount);
|
||||
|
||||
hashArray->elements = realloc(
|
||||
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];
|
||||
typeTag->genericArgumentCount,
|
||||
hashArray,
|
||||
typeHash);
|
||||
}
|
||||
|
||||
return hashEntry->structDeclaration;
|
||||
|
@ -688,9 +692,9 @@ static LLVMTypeRef LookupStructTypeByName(char *name)
|
|||
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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);
|
||||
ptrName = w_strcat(ptrName, "_ptr");
|
||||
return LLVMBuildStructGEP(
|
||||
builder,
|
||||
structPointer,
|
||||
structTypeDeclarations[i].fields[j].index,
|
||||
structTypeDeclarations[i]->fields[j].index,
|
||||
ptrName);
|
||||
free(ptrName);
|
||||
}
|
||||
|
@ -1175,29 +1179,29 @@ static LLVMValueRef LookupFunctionByType(
|
|||
|
||||
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)
|
||||
{
|
||||
*pReturnType =
|
||||
structTypeDeclarations[i].functions[j].returnType;
|
||||
*pStatic = structTypeDeclarations[i].functions[j].isStatic;
|
||||
return structTypeDeclarations[i].functions[j].function;
|
||||
structTypeDeclarations[i]->functions[j].returnType;
|
||||
*pStatic = structTypeDeclarations[i]->functions[j].isStatic;
|
||||
return structTypeDeclarations[i]->functions[j].function;
|
||||
}
|
||||
}
|
||||
|
||||
for (j = 0; j < structTypeDeclarations[i].genericFunctionCount;
|
||||
for (j = 0; j < structTypeDeclarations[i]->genericFunctionCount;
|
||||
j += 1)
|
||||
{
|
||||
if (strcmp(
|
||||
structTypeDeclarations[i].genericFunctions[j].name,
|
||||
structTypeDeclarations[i]->genericFunctions[j].name,
|
||||
name) == 0)
|
||||
{
|
||||
return LookupGenericFunction(
|
||||
&structTypeDeclarations[i].genericFunctions[j],
|
||||
&structTypeDeclarations[i]->genericFunctions[j],
|
||||
functionCallExpression,
|
||||
pReturnType,
|
||||
pStatic);
|
||||
|
@ -1221,29 +1225,29 @@ static LLVMValueRef LookupFunctionByPointerType(
|
|||
|
||||
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)
|
||||
{
|
||||
*pReturnType =
|
||||
structTypeDeclarations[i].functions[j].returnType;
|
||||
*pStatic = structTypeDeclarations[i].functions[j].isStatic;
|
||||
return structTypeDeclarations[i].functions[j].function;
|
||||
structTypeDeclarations[i]->functions[j].returnType;
|
||||
*pStatic = structTypeDeclarations[i]->functions[j].isStatic;
|
||||
return structTypeDeclarations[i]->functions[j].function;
|
||||
}
|
||||
}
|
||||
|
||||
for (j = 0; j < structTypeDeclarations[i].genericFunctionCount;
|
||||
for (j = 0; j < structTypeDeclarations[i]->genericFunctionCount;
|
||||
j += 1)
|
||||
{
|
||||
if (strcmp(
|
||||
structTypeDeclarations[i].genericFunctions[j].name,
|
||||
structTypeDeclarations[i]->genericFunctions[j].name,
|
||||
name) == 0)
|
||||
{
|
||||
return LookupGenericFunction(
|
||||
&structTypeDeclarations[i].genericFunctions[j],
|
||||
&structTypeDeclarations[i]->genericFunctions[j],
|
||||
functionCallExpression,
|
||||
pReturnType,
|
||||
pStatic);
|
||||
|
@ -1391,7 +1395,7 @@ static LLVMValueRef CompileFunctionCallExpression(
|
|||
&isStatic
|
||||
);
|
||||
|
||||
free(typeTag);
|
||||
//free(typeTag);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue