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