fix var lookups on generic structs
							parent
							
								
									a870a2c32e
								
							
						
					
					
						commit
						ca053585ac
					
				|  | @ -294,11 +294,11 @@ Statements              : Statement | |||
|                             $$ = AddStatement($1, $2); | ||||
|                         } | ||||
| 
 | ||||
| Arguments               : PrimaryExpression | ||||
| Arguments               : Expression | ||||
|                         { | ||||
|                             $$ = StartFunctionArgumentSequenceNode($1); | ||||
|                         } | ||||
|                         | Arguments COMMA PrimaryExpression | ||||
|                         | Arguments COMMA Expression | ||||
|                         { | ||||
|                             $$ = AddFunctionArgumentNode($1, $3); | ||||
|                         } | ||||
|  |  | |||
							
								
								
									
										10
									
								
								generic.w
								
								
								
								
							
							
						
						
									
										10
									
								
								generic.w
								
								
								
								
							|  | @ -25,8 +25,12 @@ struct Program { | |||
|         x: int = 4; | ||||
|         y: int = Foo.Func(x); | ||||
|         block: MemoryBlock<int>; | ||||
|         addr: MemoryAddress = @malloc(y); | ||||
|         @free(addr); | ||||
|         return x; | ||||
|         block.capacity = y; | ||||
|         block.start = @malloc(y * @sizeof<int>()); | ||||
|         z: MemoryAddress = block.AddressOf(2); | ||||
|         Console.PrintLine("%p", block.start); | ||||
|         Console.PrintLine("%p", z); | ||||
|         @free(block.start); | ||||
|         return 0; | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -119,7 +119,7 @@ typedef struct MonomorphizedGenericStructHashEntry | |||
|     uint64_t key; | ||||
|     TypeTag **types; | ||||
|     uint32_t typeCount; | ||||
|     StructTypeDeclaration structDeclaration; | ||||
|     StructTypeDeclaration *structDeclaration; | ||||
| } MonomorphizedGenericStructHashEntry; | ||||
| 
 | ||||
| typedef struct MonomorphizedGenericStructHashArray | ||||
|  | @ -409,7 +409,33 @@ static LLVMTypeRef LookupCustomType(char *name) | |||
|     return NULL; | ||||
| } | ||||
| 
 | ||||
| static StructTypeDeclaration CompileMonomorphizedGenericStruct( | ||||
| static StructTypeDeclaration *AddStructDeclaration( | ||||
|     LLVMModuleRef module, | ||||
|     LLVMTypeRef wStructType, | ||||
|     LLVMTypeRef wStructPointerType, | ||||
|     char *name) | ||||
| { | ||||
|     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; | ||||
| 
 | ||||
|     structTypeDeclarationCount += 1; | ||||
| 
 | ||||
|     return &structTypeDeclarations[index]; | ||||
| } | ||||
| 
 | ||||
| static StructTypeDeclaration *CompileMonomorphizedGenericStruct( | ||||
|     GenericStructTypeDeclaration *genericStructTypeDeclaration, | ||||
|     TypeTag **genericArgumentTypes, | ||||
|     uint32_t genericArgumentTypeCount) | ||||
|  | @ -454,17 +480,11 @@ static StructTypeDeclaration CompileMonomorphizedGenericStruct( | |||
|     LLVMTypeRef wStructType = LLVMStructCreateNamed(context, structName); | ||||
|     LLVMTypeRef wStructPointerType = LLVMPointerType(wStructType, 0); | ||||
| 
 | ||||
|     StructTypeDeclaration declaration; | ||||
|     declaration.module = genericStructTypeDeclaration->module; | ||||
|     declaration.name = structName; | ||||
|     declaration.structType = wStructType; | ||||
|     declaration.structPointerType = wStructPointerType; | ||||
|     declaration.genericFunctions = NULL; | ||||
|     declaration.genericFunctionCount = 0; | ||||
|     declaration.functions = NULL; | ||||
|     declaration.functionCount = 0; | ||||
|     declaration.fields = NULL; | ||||
|     declaration.fieldCount = 0; | ||||
|     StructTypeDeclaration *declaration = AddStructDeclaration( | ||||
|         genericStructTypeDeclaration->module, | ||||
|         wStructType, | ||||
|         wStructPointerType, | ||||
|         structName); | ||||
| 
 | ||||
|     /* first build the structure def */ | ||||
|     for (i = 0; i < declarationCount; i += 1) | ||||
|  | @ -479,7 +499,7 @@ static StructTypeDeclaration CompileMonomorphizedGenericStruct( | |||
|                     ->declarationSequence.sequence[i] | ||||
|                     ->declaration.identifier->typeTag); | ||||
|             AddFieldToStructDeclaration( | ||||
|                 &declaration, | ||||
|                 declaration, | ||||
|                 structDeclarationNode->structDeclaration.declarationSequence | ||||
|                     ->declarationSequence.sequence[i] | ||||
|                     ->declaration.identifier->identifier.name); | ||||
|  | @ -499,7 +519,7 @@ static StructTypeDeclaration CompileMonomorphizedGenericStruct( | |||
|         { | ||||
|         case FunctionDeclaration: | ||||
|             CompileFunction( | ||||
|                 &declaration, | ||||
|                 declaration, | ||||
|                 structDeclarationNode->structDeclaration.declarationSequence | ||||
|                     ->declarationSequence.sequence[i]); | ||||
|             break; | ||||
|  | @ -563,7 +583,7 @@ static StructTypeDeclaration *LookupGenericStructType( | |||
| 
 | ||||
|             if (hashEntry == NULL) | ||||
|             { | ||||
|                 StructTypeDeclaration structTypeDeclaration = | ||||
|                 StructTypeDeclaration *structTypeDeclaration = | ||||
|                     CompileMonomorphizedGenericStruct( | ||||
|                         &genericStructTypeDeclarations[i], | ||||
|                         genericTypeTags, | ||||
|  | @ -590,7 +610,7 @@ static StructTypeDeclaration *LookupGenericStructType( | |||
|                 hashEntry = &hashArray->elements[hashArray->count - 1]; | ||||
|             } | ||||
| 
 | ||||
|             return &hashEntry->structDeclaration; | ||||
|             return hashEntry->structDeclaration; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|  | @ -756,32 +776,6 @@ static LLVMValueRef FindVariableValue(LLVMBuilderRef builder, char *name) | |||
|     return NULL; | ||||
| } | ||||
| 
 | ||||
| static StructTypeDeclaration *AddStructDeclaration( | ||||
|     LLVMModuleRef module, | ||||
|     LLVMTypeRef wStructType, | ||||
|     LLVMTypeRef wStructPointerType, | ||||
|     char *name) | ||||
| { | ||||
|     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; | ||||
| 
 | ||||
|     structTypeDeclarationCount += 1; | ||||
| 
 | ||||
|     return &structTypeDeclarations[index]; | ||||
| } | ||||
| 
 | ||||
| static void DeclareStructFunction( | ||||
|     StructTypeDeclaration *structTypeDeclaration, | ||||
|     LLVMValueRef function, | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue