Fix iterator traversal order
This commit is contained in:
@@ -38,6 +38,10 @@ struct Array {
|
||||
}
|
||||
}
|
||||
|
||||
void dealloc() {
|
||||
deallocate(allocator, data);
|
||||
}
|
||||
|
||||
S64 get_index(T *item) {
|
||||
assert((data <= item) && ((data + len) > item));
|
||||
size_t offset = item - data;
|
||||
@@ -50,10 +54,6 @@ struct Array {
|
||||
}
|
||||
}
|
||||
|
||||
void reset() {
|
||||
len = 0;
|
||||
}
|
||||
|
||||
void add(T item) {
|
||||
grow(1);
|
||||
data[len++] = item;
|
||||
@@ -101,6 +101,7 @@ struct Array {
|
||||
force_inline B32 is_last(T *item) { return item == last(); }
|
||||
force_inline B32 is_first(T *item) { return item == begin(); }
|
||||
force_inline void clear() { len = 0; }
|
||||
force_inline void reset() { len = 0; }
|
||||
force_inline T pop() { return data[--len]; }
|
||||
force_inline T *last() { return data + len - 1; }
|
||||
force_inline T *begin() { return data; }
|
||||
|
||||
@@ -147,14 +147,12 @@ struct String_Builder {
|
||||
U64 di;
|
||||
|
||||
void reset() {
|
||||
for (;;) {
|
||||
for (; first;) {
|
||||
auto *block = first;
|
||||
first = first->next;
|
||||
|
||||
block->next = first_free;
|
||||
first_free = block;
|
||||
|
||||
if (!first) break;
|
||||
}
|
||||
|
||||
last = 0;
|
||||
|
||||
@@ -828,6 +828,35 @@ CORE_Static String
|
||||
compile_to_c_code() {
|
||||
pctx->time.code_generation = os_time();
|
||||
|
||||
For(pctx->ordered_decls) {
|
||||
for (Ast_Iter iter = iterate_depth_first(pctx->heap, it); iter.ast; next(&iter)) {
|
||||
Ast_Decl *decl = (Ast_Decl *)iter.ast;
|
||||
switch (iter.kind) {
|
||||
case AST_STRUCT: {
|
||||
genln("(struct %s", decl->name.str);
|
||||
global_indent += 1;
|
||||
} break;
|
||||
case AST_STRUCT + 128: {
|
||||
global_indent -= 1;
|
||||
genln(")");
|
||||
} break;
|
||||
case AST_VAR: {
|
||||
genln("(var %s: ", decl->name.str);
|
||||
auto typespec = (Ast_Atom *)decl->typespec;
|
||||
Ast_Decl *type = typespec->resolved_decl;
|
||||
assert(typespec);
|
||||
gen("%s", type->name.str);
|
||||
} break;
|
||||
case AST_VAR + 128: {
|
||||
gen(")");
|
||||
} break;
|
||||
}
|
||||
}
|
||||
String str = string_flatten(pctx->perm, &pctx->gen);
|
||||
printf("%s", str.str);
|
||||
pctx->gen.reset();
|
||||
}
|
||||
|
||||
prefixed_string_type = string_fmt(pctx->perm, "%QString", pctx->symbol_prefix);
|
||||
if (pctx->single_header_library_mode) {
|
||||
gen(R"(
|
||||
|
||||
@@ -24,6 +24,7 @@ struct Ast_Iter {
|
||||
Ast *ast;
|
||||
Ast_Kind kind;
|
||||
uint32_t visit_id;
|
||||
uint32_t di;
|
||||
};
|
||||
|
||||
uint32_t Ast_Iter_VisitIDGen;
|
||||
@@ -32,6 +33,8 @@ Ast_Iter iterate_depth_first(Allocator *a, Ast *ast) {
|
||||
result.stack = {a};
|
||||
result.stack.add(ast);
|
||||
result.visit_id = ++Ast_Iter_VisitIDGen;
|
||||
void next(Ast_Iter * iter);
|
||||
next(&result);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -39,11 +42,13 @@ void next(Ast_Iter *iter) {
|
||||
if (iter->stack.len <= 0) {
|
||||
iter->ast = 0;
|
||||
iter->kind = AST_NONE;
|
||||
iter->stack.dealloc();
|
||||
return;
|
||||
}
|
||||
|
||||
Ast *ast = iter->stack.pop();
|
||||
assert(ast != 0);
|
||||
iter->di += 1;
|
||||
iter->ast = ast;
|
||||
iter->kind = ast->kind;
|
||||
if (ast->visit_id == iter->visit_id) {
|
||||
@@ -54,13 +59,9 @@ void next(Ast_Iter *iter) {
|
||||
switch (iter->kind) {
|
||||
case AST_SCOPE: {
|
||||
Ast_Scope *node = (Ast_Scope *)ast;
|
||||
For(node->decls) {
|
||||
iter->stack.add(it);
|
||||
}
|
||||
For(node->stmts) {
|
||||
iter->stack.add(it);
|
||||
}
|
||||
iter->stack.add(node);
|
||||
For(node->stmts) iter->stack.add(it);
|
||||
For(node->decls) iter->stack.add(it);
|
||||
} break;
|
||||
|
||||
case AST_MODULE: invalid_codepath; break;
|
||||
@@ -73,44 +74,38 @@ void next(Ast_Iter *iter) {
|
||||
|
||||
case AST_INDEX: {
|
||||
Ast_Index *node = (Ast_Index *)ast;
|
||||
iter->stack.add(node->expr);
|
||||
iter->stack.add(node->index);
|
||||
iter->stack.add(node);
|
||||
iter->stack.add(node->index);
|
||||
iter->stack.add(node->expr);
|
||||
} break;
|
||||
|
||||
case AST_UNARY: {
|
||||
Ast_Unary *node = (Ast_Unary *)ast;
|
||||
iter->stack.add(node->expr);
|
||||
iter->stack.add(node);
|
||||
iter->stack.add(node->expr);
|
||||
} break;
|
||||
|
||||
case AST_BINARY: {
|
||||
Ast_Binary *node = (Ast_Binary *)ast;
|
||||
iter->stack.add(node->left);
|
||||
iter->stack.add(node->right);
|
||||
iter->stack.add(node);
|
||||
iter->stack.add(node->right);
|
||||
iter->stack.add(node->left);
|
||||
} break;
|
||||
|
||||
case AST_CALL_ITEM: {
|
||||
Ast_Call_Item *node = (Ast_Call_Item *)ast;
|
||||
iter->stack.add(node->item);
|
||||
if (node->call_flags & CALL_INDEX) {
|
||||
iter->stack.add(node->index);
|
||||
}
|
||||
else if (node->call_flags & CALL_NAME) {
|
||||
iter->stack.add(node->name);
|
||||
}
|
||||
iter->stack.add(node);
|
||||
iter->stack.add(node->item);
|
||||
if (node->call_flags & CALL_INDEX) iter->stack.add(node->index);
|
||||
else if (node->call_flags & CALL_NAME) iter->stack.add(node->name);
|
||||
} break;
|
||||
|
||||
case AST_COMPOUND:
|
||||
case AST_CALL: {
|
||||
Ast_Call *node = (Ast_Call *)ast;
|
||||
iter->stack.add(node->name);
|
||||
For(node->exprs) {
|
||||
iter->stack.add(it);
|
||||
}
|
||||
iter->stack.add(node);
|
||||
For(node->exprs) iter->stack.add(it);
|
||||
iter->stack.add(node->name);
|
||||
} break;
|
||||
|
||||
case AST_TYPE_OF:
|
||||
@@ -120,30 +115,30 @@ void next(Ast_Iter *iter) {
|
||||
case AST_RUNTIME_ASSERT:
|
||||
case AST_CONSTANT_ASSERT: {
|
||||
Ast_Builtin *node = (Ast_Builtin *)ast;
|
||||
iter->stack.add(node->expr);
|
||||
iter->stack.add(node);
|
||||
iter->stack.add(node->expr);
|
||||
} break;
|
||||
|
||||
case AST_SWITCH: {
|
||||
Ast_Switch *node = (Ast_Switch *)ast;
|
||||
iter->stack.add(node->value);
|
||||
For(node->cases) iter->stack.add(it);
|
||||
iter->stack.add(node->default_scope);
|
||||
iter->stack.add(node);
|
||||
iter->stack.add(node->default_scope);
|
||||
For(node->cases) iter->stack.add(it);
|
||||
iter->stack.add(node->value);
|
||||
} break;
|
||||
|
||||
case AST_SWITCH_CASE: {
|
||||
Ast_Switch_Case *node = (Ast_Switch_Case *)ast;
|
||||
For(node->labels) iter->stack.add(it);
|
||||
iter->stack.add(node->scope);
|
||||
iter->stack.add(node);
|
||||
iter->stack.add(node->scope);
|
||||
For(node->labels) iter->stack.add(it);
|
||||
} break;
|
||||
|
||||
case AST_VAR_UNPACK: {
|
||||
Ast_Var_Unpack *node = (Ast_Var_Unpack *)ast;
|
||||
For(node->vars) iter->stack.add(it);
|
||||
iter->stack.add(node->expr);
|
||||
iter->stack.add(node);
|
||||
iter->stack.add(node->expr);
|
||||
For(node->vars) iter->stack.add(it);
|
||||
} break;
|
||||
|
||||
case AST_PASS:
|
||||
@@ -161,10 +156,10 @@ void next(Ast_Iter *iter) {
|
||||
case AST_VAR: {
|
||||
Ast_Decl *node = (Ast_Decl *)ast;
|
||||
|
||||
iter->stack.add(node->typespec);
|
||||
iter->stack.add(node->expr);
|
||||
iter->stack.add(node->scope);
|
||||
iter->stack.add(node);
|
||||
if (node->scope) iter->stack.add(node->scope);
|
||||
if (node->expr) iter->stack.add(node->expr);
|
||||
if (node->typespec) iter->stack.add(node->typespec);
|
||||
|
||||
// omitting polymorphs
|
||||
// omitting polymorph parameters
|
||||
@@ -172,46 +167,45 @@ void next(Ast_Iter *iter) {
|
||||
|
||||
case AST_ARRAY: {
|
||||
Ast_Array *node = (Ast_Array *)ast;
|
||||
iter->stack.add(node->expr);
|
||||
iter->stack.add(node);
|
||||
// dst->expr = (Ast_Expr *)ast_copy(node->expr, parent_scope);
|
||||
iter->stack.add(node->expr);
|
||||
} break;
|
||||
|
||||
case AST_FOR: {
|
||||
Ast_For *node = (Ast_For *)ast;
|
||||
if (node->init) iter->stack.add(node->init);
|
||||
if (node->cond) iter->stack.add(node->cond);
|
||||
if (node->iter) iter->stack.add(node->iter);
|
||||
iter->stack.add(node->scope);
|
||||
iter->stack.add(node);
|
||||
iter->stack.add(node->scope);
|
||||
if (node->iter) iter->stack.add(node->iter);
|
||||
if (node->cond) iter->stack.add(node->cond);
|
||||
if (node->init) iter->stack.add(node->init);
|
||||
} break;
|
||||
|
||||
case AST_IF: {
|
||||
Ast_If *node = (Ast_If *)ast;
|
||||
For(node->ifs) iter->stack.add(it);
|
||||
iter->stack.add(node);
|
||||
For(node->ifs) iter->stack.add(it);
|
||||
} break;
|
||||
|
||||
case AST_IF_NODE: {
|
||||
Ast_If_Node *node = (Ast_If_Node *)ast;
|
||||
if (node->init) iter->stack.add(node->init);
|
||||
iter->stack.add(node->expr);
|
||||
iter->stack.add(node->scope);
|
||||
iter->stack.add(node);
|
||||
iter->stack.add(node->scope);
|
||||
iter->stack.add(node->expr);
|
||||
if (node->init) iter->stack.add(node->init);
|
||||
} break;
|
||||
|
||||
case AST_RETURN: {
|
||||
Ast_Return *node = (Ast_Return *)ast;
|
||||
For(node->expr) iter->stack.add(it);
|
||||
iter->stack.add(node);
|
||||
For(node->expr) iter->stack.add(it);
|
||||
} break;
|
||||
|
||||
case AST_LAMBDA_EXPR: {
|
||||
Ast_Lambda *node = (Ast_Lambda *)ast;
|
||||
For(node->args) iter->stack.add(it);
|
||||
For(node->ret) iter->stack.add(it);
|
||||
iter->stack.add(node->scope);
|
||||
iter->stack.add(node);
|
||||
iter->stack.add(node->scope);
|
||||
For(node->ret) iter->stack.add(it);
|
||||
For(node->args) iter->stack.add(it);
|
||||
} break;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user