start on generic codegen
							parent
							
								
									a529bb6e4f
								
							
						
					
					
						commit
						e5e5397e7e
					
				| 
						 | 
				
			
			@ -56,6 +56,12 @@ typedef struct StructTypeFunction
 | 
			
		|||
    uint8_t isStatic;
 | 
			
		||||
} StructTypeFunction;
 | 
			
		||||
 | 
			
		||||
typedef struct GenericStructFunction
 | 
			
		||||
{
 | 
			
		||||
    char *name;
 | 
			
		||||
    Node *functionDeclaration;
 | 
			
		||||
} GenericStructFunction;
 | 
			
		||||
 | 
			
		||||
typedef struct StructTypeDeclaration
 | 
			
		||||
{
 | 
			
		||||
    char *name;
 | 
			
		||||
| 
						 | 
				
			
			@ -66,6 +72,9 @@ typedef struct StructTypeDeclaration
 | 
			
		|||
 | 
			
		||||
    StructTypeFunction *functions;
 | 
			
		||||
    uint32_t functionCount;
 | 
			
		||||
 | 
			
		||||
    GenericStructFunction *genericFunctions;
 | 
			
		||||
    uint32_t genericFunctionCount;
 | 
			
		||||
} StructTypeDeclaration;
 | 
			
		||||
 | 
			
		||||
StructTypeDeclaration *structTypeDeclarations;
 | 
			
		||||
| 
						 | 
				
			
			@ -299,6 +308,27 @@ static void DeclareStructFunction(
 | 
			
		|||
    fprintf(stderr, "Could not find struct type for function!\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void DeclareGenericFunction(
 | 
			
		||||
    LLVMTypeRef structPointerType,
 | 
			
		||||
    Node *functionDeclaration
 | 
			
		||||
) {
 | 
			
		||||
    uint32_t i, index;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < structTypeDeclarationCount; i += 1)
 | 
			
		||||
    {
 | 
			
		||||
        if (structTypeDeclarations[i].structPointerType == structPointerType)
 | 
			
		||||
        {
 | 
			
		||||
            index = structTypeDeclarations[i].genericFunctionCount;
 | 
			
		||||
            structTypeDeclarations[i].genericFunctions = realloc(structTypeDeclarations[i].genericFunctions, sizeof(GenericStructFunction) * (structTypeDeclarations[i].genericFunctionCount + 1));
 | 
			
		||||
            structTypeDeclarations[i].genericFunctions[i].name = strdup(functionDeclaration->children[0]->children[0]->value.string);
 | 
			
		||||
            structTypeDeclarations[i].genericFunctions[i].functionDeclaration = functionDeclaration;
 | 
			
		||||
            structTypeDeclarations[i].genericFunctionCount += 1;
 | 
			
		||||
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static LLVMTypeRef LookupCustomType(char *name)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t i;
 | 
			
		||||
| 
						 | 
				
			
			@ -337,6 +367,12 @@ static LLVMTypeRef ResolveType(Node* typeNode)
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static LLVMValueRef LookupGenericFunction(
 | 
			
		||||
 | 
			
		||||
) {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static LLVMValueRef LookupFunctionByType(
 | 
			
		||||
    LLVMTypeRef structType,
 | 
			
		||||
    char *name,
 | 
			
		||||
| 
						 | 
				
			
			@ -386,6 +422,14 @@ 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()
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -872,6 +916,12 @@ static void CompileFunction(
 | 
			
		|||
        paramIndex += 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (functionSignature->children[4]->childCount > 0)
 | 
			
		||||
    {
 | 
			
		||||
        DeclareGenericFunction(wStructPointerType, functionDeclaration);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    PushScopeFrame(scope);
 | 
			
		||||
 | 
			
		||||
    /* FIXME: should work for non-primitive types */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue