Replace set_flag_typespec with iterator!

This commit is contained in:
Krzosa Karol
2023-04-01 11:50:11 +02:00
parent acf64024b9
commit 4f80cff8e1

View File

@@ -1,4 +1,4 @@
void set_flag_typespec(Ast_Expr *expr);
#define AST_NEW(T, ikind, ipos, iflags) \
Ast_##T *result = allocate_struct(pctx->perm, Ast_##T); \
@@ -20,39 +20,6 @@ _ast_new(size_t size, Ast_Kind kind, Token *pos, Ast_Flag flags = 0) {
return result;
}
CORE_Static void
set_flag_typespec(Ast_Expr *expr) {
if (!expr) return;
set_flag(expr->flags, AST_TYPESPEC);
switch (expr->kind) {
case AST_UNARY: {
Ast_Unary *n = (Ast_Unary *)expr;
set_flag_typespec(n->expr);
} break;
case AST_ARRAY: {
Ast_Array *n = (Ast_Array *)expr;
set_flag_typespec(n->base);
set_flag_typespec(n->expr);
} break;
case AST_CALL: {
Ast_Call *n = (Ast_Call *)expr;
For(n->exprs) set_flag_typespec(it);
set_flag_typespec(n->name);
} break;
case AST_CALL_ITEM: {
Ast_Call_Item *n = (Ast_Call_Item *)expr;
set_flag_typespec(n->item);
set_flag_typespec(n->index);
} break;
case AST_IDENT:
break;
invalid_default_case;
}
}
CORE_Static void
propagate_polymorphic(Ast *to, Ast *from) {
if (is_flag_set(from->flags, AST_IDENT_POLYMORPH)) set_flag(to->flags, AST_IDENT_POLYMORPH);
@@ -450,19 +417,20 @@ struct Ast_Iter {
Array<Ast *> stack;
Ast *ast;
Ast_Kind kind;
bool skip_end_blocks;
bool skip_children;
uint32_t visit_id;
uint32_t di;
};
uint32_t Ast_Iter_VisitIDGen;
Ast_Iter iterate_depth_first(Allocator *a, Ast *ast) {
assert(ast);
Ast_Iter iterate_depth_first(Allocator *a, Ast *ast, bool skip_end_blocks = false) {
Ast_Iter result = {};
result.stack = {a};
result.ast = ast;
result.kind = ast->kind;
if (ast) result.kind = ast->kind;
result.visit_id = ++Ast_Iter_VisitIDGen;
result.skip_end_blocks = skip_end_blocks;
return result;
}
@@ -478,7 +446,7 @@ void next(Ast_Iter *iter) {
switch (iter->kind) {
case AST_SCOPE: {
Ast_Scope *node = (Ast_Scope *)ast;
iter->stack.add(node);
if (!iter->skip_end_blocks) iter->stack.add(node);
For(node->stmts) iter->stack.add(it);
For(node->decls) iter->stack.add(it);
} break;
@@ -493,7 +461,7 @@ void next(Ast_Iter *iter) {
case AST_INDEX: {
Ast_Index *node = (Ast_Index *)ast;
iter->stack.add(node);
if (!iter->skip_end_blocks) iter->stack.add(node);
iter->stack.add(node->index);
iter->stack.add(node->expr);
assert(node->index);
@@ -502,14 +470,14 @@ void next(Ast_Iter *iter) {
case AST_UNARY: {
Ast_Unary *node = (Ast_Unary *)ast;
iter->stack.add(node);
if (!iter->skip_end_blocks) iter->stack.add(node);
iter->stack.add(node->expr);
assert(node->expr);
} break;
case AST_BINARY: {
Ast_Binary *node = (Ast_Binary *)ast;
iter->stack.add(node);
if (!iter->skip_end_blocks) iter->stack.add(node);
iter->stack.add(node->right);
iter->stack.add(node->left);
assert(node->right);
@@ -518,7 +486,7 @@ void next(Ast_Iter *iter) {
case AST_CALL_ITEM: {
Ast_Call_Item *node = (Ast_Call_Item *)ast;
iter->stack.add(node);
if (!iter->skip_end_blocks) iter->stack.add(node);
iter->stack.add(node->item);
assert(node->item);
if (node->call_flags & CALL_INDEX) {
@@ -534,7 +502,7 @@ void next(Ast_Iter *iter) {
case AST_COMPOUND:
case AST_CALL: {
Ast_Call *node = (Ast_Call *)ast;
iter->stack.add(node);
if (!iter->skip_end_blocks) iter->stack.add(node);
For(node->exprs) iter->stack.add(it);
if (node->name) iter->stack.add(node->name);
} break;
@@ -546,14 +514,14 @@ void next(Ast_Iter *iter) {
case AST_RUNTIME_ASSERT:
case AST_CONSTANT_ASSERT: {
Ast_Builtin *node = (Ast_Builtin *)ast;
iter->stack.add(node);
if (!iter->skip_end_blocks) iter->stack.add(node);
iter->stack.add(node->expr);
assert(node->expr);
} break;
case AST_SWITCH: {
Ast_Switch *node = (Ast_Switch *)ast;
iter->stack.add(node);
if (!iter->skip_end_blocks) iter->stack.add(node);
if (node->default_scope) iter->stack.add(node->default_scope);
For(node->cases) iter->stack.add(it);
iter->stack.add(node->value);
@@ -562,7 +530,7 @@ void next(Ast_Iter *iter) {
case AST_SWITCH_CASE: {
Ast_Switch_Case *node = (Ast_Switch_Case *)ast;
iter->stack.add(node);
if (!iter->skip_end_blocks) iter->stack.add(node);
iter->stack.add(node->scope);
assert(node->scope);
For(node->labels) iter->stack.add(it);
@@ -570,7 +538,7 @@ void next(Ast_Iter *iter) {
case AST_VAR_UNPACK: {
Ast_Var_Unpack *node = (Ast_Var_Unpack *)ast;
iter->stack.add(node);
if (!iter->skip_end_blocks) iter->stack.add(node);
iter->stack.add(node->expr);
assert(node->expr);
For(node->vars) iter->stack.add(it);
@@ -591,7 +559,7 @@ void next(Ast_Iter *iter) {
case AST_VAR: {
Ast_Decl *node = (Ast_Decl *)ast;
iter->stack.add(node);
if (!iter->skip_end_blocks) 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);
@@ -602,13 +570,13 @@ void next(Ast_Iter *iter) {
case AST_ARRAY: {
Ast_Array *node = (Ast_Array *)ast;
iter->stack.add(node);
if (!iter->skip_end_blocks) iter->stack.add(node);
if (node->expr) iter->stack.add(node->expr);
} break;
case AST_FOR: {
Ast_For *node = (Ast_For *)ast;
iter->stack.add(node);
if (!iter->skip_end_blocks) iter->stack.add(node);
iter->stack.add(node->scope);
assert(node->scope);
if (node->iter) iter->stack.add(node->iter);
@@ -618,13 +586,13 @@ void next(Ast_Iter *iter) {
case AST_IF: {
Ast_If *node = (Ast_If *)ast;
iter->stack.add(node);
if (!iter->skip_end_blocks) iter->stack.add(node);
For(node->ifs) iter->stack.add(it);
} break;
case AST_IF_NODE: {
Ast_If_Node *node = (Ast_If_Node *)ast;
iter->stack.add(node);
if (!iter->skip_end_blocks) iter->stack.add(node);
iter->stack.add(node->scope);
assert(node->scope);
if (node->expr) iter->stack.add(node->expr);
@@ -633,13 +601,13 @@ void next(Ast_Iter *iter) {
case AST_RETURN: {
Ast_Return *node = (Ast_Return *)ast;
iter->stack.add(node);
if (!iter->skip_end_blocks) iter->stack.add(node);
For(node->expr) iter->stack.add(it);
} break;
case AST_LAMBDA_EXPR: {
Ast_Lambda *node = (Ast_Lambda *)ast;
iter->stack.add(node);
if (!iter->skip_end_blocks) iter->stack.add(node);
if (node->scope) iter->stack.add(node->scope);
For(node->ret) iter->stack.add(it);
For(node->args) iter->stack.add(it);
@@ -664,3 +632,11 @@ end_of_switch:
iter->kind = (Ast_Kind)((unsigned)iter->kind + AST_NODE_END);
}
}
CORE_Static void
set_flag_typespec(Ast_Expr *expr) {
for (Ast_Iter iter = iterate_depth_first(pctx->heap, expr, true); iter.ast; next(&iter)) {
assert(iter.kind == AST_UNARY || iter.kind == AST_ARRAY || iter.kind == AST_CALL || iter.kind == AST_CALL_ITEM || iter.kind == AST_IDENT);
set_flag(iter.ast->flags, AST_TYPESPEC);
}
}