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