forked from cosmonaut/wraith-lang
Minimizes memory footprint of id-tree search
parent
565d815deb
commit
71ba1f9454
|
@ -163,24 +163,29 @@ 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);
|
||||
|
|
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