From 86e332f2efeb404ac7cc6f52a6b98c609f220170 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 6 Feb 2024 11:55:51 -0800 Subject: [PATCH] allow compound macro expressions in eval system; poison used macro names, before descending --- src/eval/eval_compiler.c | 14 ++++++++------ src/eval/eval_core.c | 36 +++++++++++++++++++++++++++++++++++- src/eval/eval_core.h | 3 +++ 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/src/eval/eval_compiler.c b/src/eval/eval_compiler.c index e3ffdd35..e303f29d 100644 --- a/src/eval/eval_compiler.c +++ b/src/eval/eval_compiler.c @@ -706,11 +706,7 @@ eval_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, EVAL_String2ExprMap { EVAL_Expr *exprl = expr->children[0]; EVAL_Expr *exprr = expr->children[1]; - if(exprl->kind != EVAL_ExprKind_LeafIdent) - { - eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, expr->location, "Left side of assignment must be an identifier."); - } - else + if(exprl->kind == EVAL_ExprKind_LeafIdent) { eval_string2expr_map_insert(arena, map, exprl->name, exprr); } @@ -1540,6 +1536,10 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb case EVAL_ExprKind_Define: { + if(expr->children[0]->kind != EVAL_ExprKind_LeafIdent) + { + eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, expr->location, "Left side of assignment must be an identifier."); + } result = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, expr->children[1], eout); }break; case EVAL_ExprKind_LeafIdent: @@ -1552,7 +1552,9 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdb } else { - result = eval_irtree_and_type_from_expr(arena, graph, rdbg, &eval_string2expr_map_nil, leaf_ident_expr, eout); + eval_string2expr_map_inc_poison(leaf_ident_expr_map, name); + result = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, leaf_ident_expr, eout); + eval_string2expr_map_dec_poison(leaf_ident_expr_map, name); } }break; } diff --git a/src/eval/eval_core.c b/src/eval/eval_core.c index 33ef9357..6c26e6e3 100644 --- a/src/eval/eval_core.c +++ b/src/eval/eval_core.c @@ -153,6 +153,40 @@ eval_string2expr_map_insert(Arena *arena, EVAL_String2ExprMap *map, String8 stri existing_node->expr = expr; } +internal void +eval_string2expr_map_inc_poison(EVAL_String2ExprMap *map, String8 string) +{ + U64 hash = eval_hash_from_string(string); + U64 slot_idx = hash%map->slots_count; + for(EVAL_String2ExprMapNode *node = map->slots[slot_idx].first; + node != 0; + node = node->hash_next) + { + if(str8_match(node->string, string, 0)) + { + node->poison_count += 1; + break; + } + } +} + +internal void +eval_string2expr_map_dec_poison(EVAL_String2ExprMap *map, String8 string) +{ + U64 hash = eval_hash_from_string(string); + U64 slot_idx = hash%map->slots_count; + for(EVAL_String2ExprMapNode *node = map->slots[slot_idx].first; + node != 0; + node = node->hash_next) + { + if(str8_match(node->string, string, 0) && node->poison_count > 0) + { + node->poison_count -= 1; + break; + } + } +} + internal EVAL_Expr * eval_expr_from_string(EVAL_String2ExprMap *map, String8 string) { @@ -164,7 +198,7 @@ eval_expr_from_string(EVAL_String2ExprMap *map, String8 string) EVAL_String2ExprMapNode *existing_node = 0; for(EVAL_String2ExprMapNode *node = map->slots[slot_idx].first; node != 0; node = node->hash_next) { - if(str8_match(node->string, string, 0)) + if(str8_match(node->string, string, 0) && node->poison_count == 0) { existing_node = node; break; diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index 6213ead1..7a1d47cf 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -167,6 +167,7 @@ struct EVAL_String2ExprMapNode EVAL_String2ExprMapNode *hash_next; String8 string; EVAL_Expr *expr; + U64 poison_count; }; typedef struct EVAL_String2ExprMapSlot EVAL_String2ExprMapSlot; @@ -212,6 +213,8 @@ internal U64 eval_num_from_string(EVAL_String2NumMap *map, String8 string); //- rjf: string -> expr internal EVAL_String2ExprMap eval_string2expr_map_make(Arena *arena, U64 slot_count); internal void eval_string2expr_map_insert(Arena *arena, EVAL_String2NumMap *map, String8 string, EVAL_Expr *expr); +internal void eval_string2expr_map_inc_poison(EVAL_String2ExprMap *map, String8 string); +internal void eval_string2expr_map_dec_poison(EVAL_String2ExprMap *map, String8 string); internal EVAL_Expr *eval_expr_from_string(EVAL_String2ExprMap *map, String8 string); #endif // EVAL_CORE_H