forked from cosmonaut/wraith-lang
				
			Minimizes memory footprint of id-tree search
							parent
							
								
									565d815deb
								
							
						
					
					
						commit
						71ba1f9454
					
				|  | @ -163,26 +163,31 @@ IdNode* FindId(IdNode *root, NodeType targetType, char *targetName) { | |||
|     IdNode **frontier = (IdNode**)malloc(sizeof(IdNode*)); | ||||
|     frontier[0] = root; | ||||
|     uint32_t frontierCount = 1; | ||||
|     uint32_t cursor = 0; | ||||
| 
 | ||||
|     while (frontierCount > 0 && cursor < frontierCount) { | ||||
|         IdNode *current = frontier[cursor]; | ||||
|     while (frontierCount > 0) { | ||||
|         IdNode *current = frontier[0]; | ||||
| 
 | ||||
|         if (current->type == targetType && strcmp(current->name, targetName) == 0) { | ||||
|             result = current; | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         int newSize = frontierCount + current->childCount; | ||||
|         frontier = realloc(frontier, sizeof(IdNode*) * newSize); | ||||
|         uint32_t i; | ||||
|         for (i = 0; i < current->childCount; i++) { | ||||
|             frontier[frontierCount + i] = current->children[i]; | ||||
|         for(i = 1; i < frontierCount; i++) { | ||||
|             frontier[i-1] = frontier[i]; | ||||
|         } | ||||
|         frontierCount += current->childCount; | ||||
|         cursor += 1; | ||||
| 
 | ||||
|         size_t newSize = frontierCount + current->childCount - 1; | ||||
|         if (frontierCount != newSize) { | ||||
|             frontier = realloc(frontier, sizeof(IdNode*) * newSize); | ||||
|         } | ||||
|         for (i = 0; i < current->childCount; i++) { | ||||
|             frontier[frontierCount + i - 1] = current->children[i]; | ||||
|         } | ||||
| 
 | ||||
|         frontierCount = newSize; | ||||
|     } | ||||
| 
 | ||||
|     free(frontier); | ||||
|     return result; | ||||
| } | ||||
| } | ||||
|  |  | |||
							
								
								
									
										14
									
								
								src/main.c
								
								
								
								
							
							
						
						
									
										14
									
								
								src/main.c
								
								
								
								
							|  | @ -65,21 +65,9 @@ int main(int argc, char *argv[]) | |||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     { | ||||
|                     if (parseVerbose) { | ||||
|                         IdNode *idTree = MakeIdTree(rootNode, NULL); | ||||
|                         PrintIdTree(idTree, /*tabCount=*/0); | ||||
|                         printf("\n"); | ||||
| 
 | ||||
|                         printf("Searching for a variable named 'lol' and printing its ancestors\n"); | ||||
|                         IdNode *deepest = FindId(idTree, Variable, "lol"); | ||||
|                         PrintAncestors(deepest); | ||||
|                         printf("\n"); | ||||
| 
 | ||||
|                         printf("Now searching for the same variable but with the caveat that it" | ||||
|                                " must be inside an if-block, and printing its ancestors\n"); | ||||
|                         deepest = FindId(idTree, LexicalScope, "if"); | ||||
|                         deepest = FindId(deepest, Variable, "lol"); | ||||
|                         PrintAncestors(deepest); | ||||
|                     } | ||||
|                     exitCode = Codegen(rootNode, optimizationLevel); | ||||
|                 } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue