From 4f80cff8e17c3f39a10ffb69ab3a532c125a3847 Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Sat, 1 Apr 2023 11:50:11 +0200 Subject: [PATCH] Replace set_flag_typespec with iterator! --- core_ast.cpp | 84 +++++++++++++++++++--------------------------------- 1 file changed, 30 insertions(+), 54 deletions(-) diff --git a/core_ast.cpp b/core_ast.cpp index 68afeed..b2634f2 100644 --- a/core_ast.cpp +++ b/core_ast.cpp @@ -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 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); + } +}