Fix iterator traversal order

This commit is contained in:
Krzosa Karol
2023-03-31 12:41:19 +02:00
parent 534db633ed
commit 1839279235
4 changed files with 76 additions and 54 deletions

View File

@@ -38,6 +38,10 @@ struct Array {
} }
} }
void dealloc() {
deallocate(allocator, data);
}
S64 get_index(T *item) { S64 get_index(T *item) {
assert((data <= item) && ((data + len) > item)); assert((data <= item) && ((data + len) > item));
size_t offset = item - data; size_t offset = item - data;
@@ -50,10 +54,6 @@ struct Array {
} }
} }
void reset() {
len = 0;
}
void add(T item) { void add(T item) {
grow(1); grow(1);
data[len++] = item; data[len++] = item;
@@ -101,6 +101,7 @@ struct Array {
force_inline B32 is_last(T *item) { return item == last(); } force_inline B32 is_last(T *item) { return item == last(); }
force_inline B32 is_first(T *item) { return item == begin(); } force_inline B32 is_first(T *item) { return item == begin(); }
force_inline void clear() { len = 0; } force_inline void clear() { len = 0; }
force_inline void reset() { len = 0; }
force_inline T pop() { return data[--len]; } force_inline T pop() { return data[--len]; }
force_inline T *last() { return data + len - 1; } force_inline T *last() { return data + len - 1; }
force_inline T *begin() { return data; } force_inline T *begin() { return data; }

View File

@@ -147,14 +147,12 @@ struct String_Builder {
U64 di; U64 di;
void reset() { void reset() {
for (;;) { for (; first;) {
auto *block = first; auto *block = first;
first = first->next; first = first->next;
block->next = first_free; block->next = first_free;
first_free = block; first_free = block;
if (!first) break;
} }
last = 0; last = 0;

View File

@@ -828,6 +828,35 @@ CORE_Static String
compile_to_c_code() { compile_to_c_code() {
pctx->time.code_generation = os_time(); 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); prefixed_string_type = string_fmt(pctx->perm, "%QString", pctx->symbol_prefix);
if (pctx->single_header_library_mode) { if (pctx->single_header_library_mode) {
gen(R"( gen(R"(

View File

@@ -24,6 +24,7 @@ struct Ast_Iter {
Ast *ast; Ast *ast;
Ast_Kind kind; Ast_Kind kind;
uint32_t visit_id; uint32_t visit_id;
uint32_t di;
}; };
uint32_t Ast_Iter_VisitIDGen; uint32_t Ast_Iter_VisitIDGen;
@@ -32,6 +33,8 @@ Ast_Iter iterate_depth_first(Allocator *a, Ast *ast) {
result.stack = {a}; result.stack = {a};
result.stack.add(ast); result.stack.add(ast);
result.visit_id = ++Ast_Iter_VisitIDGen; result.visit_id = ++Ast_Iter_VisitIDGen;
void next(Ast_Iter * iter);
next(&result);
return result; return result;
} }
@@ -39,11 +42,13 @@ void next(Ast_Iter *iter) {
if (iter->stack.len <= 0) { if (iter->stack.len <= 0) {
iter->ast = 0; iter->ast = 0;
iter->kind = AST_NONE; iter->kind = AST_NONE;
iter->stack.dealloc();
return; return;
} }
Ast *ast = iter->stack.pop(); Ast *ast = iter->stack.pop();
assert(ast != 0); assert(ast != 0);
iter->di += 1;
iter->ast = ast; iter->ast = ast;
iter->kind = ast->kind; iter->kind = ast->kind;
if (ast->visit_id == iter->visit_id) { if (ast->visit_id == iter->visit_id) {
@@ -54,13 +59,9 @@ void next(Ast_Iter *iter) {
switch (iter->kind) { switch (iter->kind) {
case AST_SCOPE: { case AST_SCOPE: {
Ast_Scope *node = (Ast_Scope *)ast; Ast_Scope *node = (Ast_Scope *)ast;
For(node->decls) {
iter->stack.add(it);
}
For(node->stmts) {
iter->stack.add(it);
}
iter->stack.add(node); iter->stack.add(node);
For(node->stmts) iter->stack.add(it);
For(node->decls) iter->stack.add(it);
} break; } break;
case AST_MODULE: invalid_codepath; break; case AST_MODULE: invalid_codepath; break;
@@ -73,44 +74,38 @@ void next(Ast_Iter *iter) {
case AST_INDEX: { case AST_INDEX: {
Ast_Index *node = (Ast_Index *)ast; Ast_Index *node = (Ast_Index *)ast;
iter->stack.add(node->expr);
iter->stack.add(node->index);
iter->stack.add(node); iter->stack.add(node);
iter->stack.add(node->index);
iter->stack.add(node->expr);
} break; } break;
case AST_UNARY: { case AST_UNARY: {
Ast_Unary *node = (Ast_Unary *)ast; Ast_Unary *node = (Ast_Unary *)ast;
iter->stack.add(node->expr);
iter->stack.add(node); iter->stack.add(node);
iter->stack.add(node->expr);
} break; } break;
case AST_BINARY: { case AST_BINARY: {
Ast_Binary *node = (Ast_Binary *)ast; Ast_Binary *node = (Ast_Binary *)ast;
iter->stack.add(node->left);
iter->stack.add(node->right);
iter->stack.add(node); iter->stack.add(node);
iter->stack.add(node->right);
iter->stack.add(node->left);
} break; } break;
case AST_CALL_ITEM: { case AST_CALL_ITEM: {
Ast_Call_Item *node = (Ast_Call_Item *)ast; 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);
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; } break;
case AST_COMPOUND: case AST_COMPOUND:
case AST_CALL: { case AST_CALL: {
Ast_Call *node = (Ast_Call *)ast; Ast_Call *node = (Ast_Call *)ast;
iter->stack.add(node->name);
For(node->exprs) {
iter->stack.add(it);
}
iter->stack.add(node); iter->stack.add(node);
For(node->exprs) iter->stack.add(it);
iter->stack.add(node->name);
} break; } break;
case AST_TYPE_OF: case AST_TYPE_OF:
@@ -120,30 +115,30 @@ void next(Ast_Iter *iter) {
case AST_RUNTIME_ASSERT: case AST_RUNTIME_ASSERT:
case AST_CONSTANT_ASSERT: { case AST_CONSTANT_ASSERT: {
Ast_Builtin *node = (Ast_Builtin *)ast; Ast_Builtin *node = (Ast_Builtin *)ast;
iter->stack.add(node->expr);
iter->stack.add(node); iter->stack.add(node);
iter->stack.add(node->expr);
} break; } break;
case AST_SWITCH: { case AST_SWITCH: {
Ast_Switch *node = (Ast_Switch *)ast; 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);
iter->stack.add(node->default_scope);
For(node->cases) iter->stack.add(it);
iter->stack.add(node->value);
} break; } break;
case AST_SWITCH_CASE: { case AST_SWITCH_CASE: {
Ast_Switch_Case *node = (Ast_Switch_Case *)ast; 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);
iter->stack.add(node->scope);
For(node->labels) iter->stack.add(it);
} break; } break;
case AST_VAR_UNPACK: { case AST_VAR_UNPACK: {
Ast_Var_Unpack *node = (Ast_Var_Unpack *)ast; 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);
iter->stack.add(node->expr);
For(node->vars) iter->stack.add(it);
} break; } break;
case AST_PASS: case AST_PASS:
@@ -161,10 +156,10 @@ void next(Ast_Iter *iter) {
case AST_VAR: { case AST_VAR: {
Ast_Decl *node = (Ast_Decl *)ast; 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); 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 polymorphs
// omitting polymorph parameters // omitting polymorph parameters
@@ -172,46 +167,45 @@ void next(Ast_Iter *iter) {
case AST_ARRAY: { case AST_ARRAY: {
Ast_Array *node = (Ast_Array *)ast; Ast_Array *node = (Ast_Array *)ast;
iter->stack.add(node->expr);
iter->stack.add(node); iter->stack.add(node);
// dst->expr = (Ast_Expr *)ast_copy(node->expr, parent_scope); iter->stack.add(node->expr);
} break; } break;
case AST_FOR: { case AST_FOR: {
Ast_For *node = (Ast_For *)ast; 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);
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; } break;
case AST_IF: { case AST_IF: {
Ast_If *node = (Ast_If *)ast; Ast_If *node = (Ast_If *)ast;
For(node->ifs) iter->stack.add(it);
iter->stack.add(node); iter->stack.add(node);
For(node->ifs) iter->stack.add(it);
} break; } break;
case AST_IF_NODE: { case AST_IF_NODE: {
Ast_If_Node *node = (Ast_If_Node *)ast; 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);
iter->stack.add(node->scope);
iter->stack.add(node->expr);
if (node->init) iter->stack.add(node->init);
} break; } break;
case AST_RETURN: { case AST_RETURN: {
Ast_Return *node = (Ast_Return *)ast; Ast_Return *node = (Ast_Return *)ast;
For(node->expr) iter->stack.add(it);
iter->stack.add(node); iter->stack.add(node);
For(node->expr) iter->stack.add(it);
} break; } break;
case AST_LAMBDA_EXPR: { case AST_LAMBDA_EXPR: {
Ast_Lambda *node = (Ast_Lambda *)ast; 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);
iter->stack.add(node->scope);
For(node->ret) iter->stack.add(it);
For(node->args) iter->stack.add(it);
} break; } break;
} }
} }