forked from cosmonaut/wraith-lang
				
			improve field storage pattern
							parent
							
								
									2708dfbbed
								
							
						
					
					
						commit
						180583d772
					
				
							
								
								
									
										46
									
								
								compiler.c
								
								
								
								
							
							
						
						
									
										46
									
								
								compiler.c
								
								
								
								
							|  | @ -70,6 +70,26 @@ static void AddStructField(LLVMBuilderRef builder, LLVMValueRef wStructPointer, | |||
|     } | ||||
| } | ||||
| 
 | ||||
| static void MarkStructFieldForWrite(LLVMValueRef wStructPointer, LLVMValueRef value) | ||||
| { | ||||
|     uint32_t i, j; | ||||
| 
 | ||||
|     for (i = 0; i < structFieldMapCount; i += 1) | ||||
|     { | ||||
|         if (structFieldMaps[i].structPointer == wStructPointer) | ||||
|         { | ||||
|             for (j = 0; j < structFieldMaps[i].fieldCount; j += 1) | ||||
|             { | ||||
|                 if (structFieldMaps[i].fields[j].value == value) | ||||
|                 { | ||||
|                     structFieldMaps[i].fields[j].needsWrite = 1; | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| static LLVMValueRef GetStructFieldPointer(LLVMValueRef wStructPointer, LLVMValueRef value) | ||||
| { | ||||
|     uint32_t i, j; | ||||
|  | @ -91,14 +111,26 @@ static LLVMValueRef GetStructFieldPointer(LLVMValueRef wStructPointer, LLVMValue | |||
|     return NULL; | ||||
| } | ||||
| 
 | ||||
| static void RemoveStruct(LLVMValueRef wStructPointer) | ||||
| static void RemoveStruct(LLVMBuilderRef builder, LLVMValueRef wStructPointer) | ||||
| { | ||||
|     uint32_t i; | ||||
|     uint32_t i, j; | ||||
| 
 | ||||
|     for (i = 0; i < structFieldMapCount; i += 1) | ||||
|     { | ||||
|         if (structFieldMaps[i].structPointer == wStructPointer) | ||||
|         { | ||||
|             for (j = 0; j < structFieldMaps[i].fieldCount; j += 1) | ||||
|             { | ||||
|                 if (structFieldMaps[i].fields[j].needsWrite) | ||||
|                 { | ||||
|                     LLVMBuildStore( | ||||
|                         builder, | ||||
|                         structFieldMaps[i].fields[j].value, | ||||
|                         structFieldMaps[i].fields[j].valuePointer | ||||
|                     ); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             free(structFieldMaps[i].fields); | ||||
|             structFieldMaps[i].fields = NULL; | ||||
|             structFieldMaps[i].fieldCount = 0; | ||||
|  | @ -281,11 +313,7 @@ static void CompileAssignment(LLVMValueRef wStructValue, LLVMBuilderRef builder, | |||
|     LLVMValueRef result = CompileExpression(wStructValue, builder, function, assignmentStatement->children[1]); | ||||
|     LLVMValueRef identifier = CompileExpression(wStructValue, builder, function, assignmentStatement->children[0]); | ||||
| 
 | ||||
|     fieldPointer = GetStructFieldPointer(wStructValue, identifier); | ||||
|     if (fieldPointer != NULL) | ||||
|     { | ||||
|         LLVMBuildStore(builder, result, fieldPointer); | ||||
|     } | ||||
|     MarkStructFieldForWrite(wStructValue, identifier); | ||||
| } | ||||
| 
 | ||||
| static uint8_t CompileStatement(LLVMValueRef wStructValue, LLVMBuilderRef builder, LLVMValueRef function, Node *statement) | ||||
|  | @ -360,7 +388,7 @@ static void CompileFunction( | |||
|         hasReturn |= CompileStatement(wStructPointer, builder, function, functionBody->children[i]); | ||||
|     } | ||||
| 
 | ||||
|     AddNamedVariable(functionSignature->children[0]->value.string, function); | ||||
|     RemoveStruct(builder, wStructPointer); | ||||
| 
 | ||||
|     if (LLVMGetTypeKind(returnType) == LLVMVoidTypeKind && !hasReturn) | ||||
|     { | ||||
|  | @ -370,8 +398,6 @@ static void CompileFunction( | |||
|     { | ||||
|         fprintf(stderr, "Return statement not provided!"); | ||||
|     } | ||||
| 
 | ||||
|     RemoveStruct(wStructPointer); | ||||
| } | ||||
| 
 | ||||
| static void CompileStruct(LLVMModuleRef module, LLVMContextRef context, Node *node) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue