From 4b85df07259abd241594ffb5368cc2edac09ae9a Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 10 Feb 2025 09:44:32 -0800 Subject: [PATCH] fix expr chain parsing; fix panel tree building --- src/eval/eval_bundles.c | 2 +- src/eval/eval_ir.c | 2 +- src/eval/eval_parse.c | 155 ++++++++---------- src/eval/eval_parse.h | 5 +- .../eval_visualization_builtin_view_rules.c | 2 +- .../eval_visualization_core.c | 4 +- src/raddbg/raddbg_core.c | 52 +----- src/raddbg/raddbg_core.h | 9 - src/raddbg/raddbg_views.c | 4 +- 9 files changed, 84 insertions(+), 151 deletions(-) diff --git a/src/eval/eval_bundles.c b/src/eval/eval_bundles.c index 4c9c5f32..b1753efa 100644 --- a/src/eval/eval_bundles.c +++ b/src/eval/eval_bundles.c @@ -35,7 +35,7 @@ e_eval_from_string(Arena *arena, String8 string) { E_TokenArray tokens = e_token_array_from_text(arena, string); E_Parse parse = e_parse_expr_from_text_tokens(arena, string, &tokens); - E_Eval eval = e_eval_from_expr(arena, parse.expr); + E_Eval eval = e_eval_from_expr(arena, parse.last_expr); e_msg_list_concat_in_place(&eval.msgs, &parse.msgs); return eval; } diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index cfa03ed4..7914c058 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -718,7 +718,7 @@ e_auto_hook_map_insert_new_(Arena *arena, E_AutoHookMap *map, E_AutoHookParams * { E_TokenArray tokens = e_token_array_from_text(scratch.arena, params->type_pattern); E_Parse parse = e_parse_type_from_text_tokens(scratch.arena, params->type_pattern, &tokens); - E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, parse.expr); + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, parse.last_expr); type_key = irtree.type_key; } E_AutoHookNode *node = push_array(arena, E_AutoHookNode, 1); diff --git a/src/eval/eval_parse.c b/src/eval/eval_parse.c index cc9a5232..13ea164b 100644 --- a/src/eval/eval_parse.c +++ b/src/eval/eval_parse.c @@ -1099,7 +1099,7 @@ e_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, E_String2ExprMap *map, internal E_Parse e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens) { - E_Parse parse = {0, &e_expr_nil}; + E_Parse parse = {0, &e_expr_nil, &e_expr_nil}; E_Token *token_it = tokens->v; //- rjf: parse unsigned marker @@ -1151,14 +1151,14 @@ e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens) } // rjf: construct leaf type - parse.expr = e_push_expr(arena, E_ExprKind_TypeIdent, token_string.str); - parse.expr->type_key = type_key; + parse.first_expr = parse.last_expr = e_push_expr(arena, E_ExprKind_TypeIdent, token_string.str); + parse.first_expr->type_key = type_key; } } } //- rjf: parse extensions - if(parse.expr != &e_expr_nil) + if(parse.first_expr != &e_expr_nil) { for(;;) { @@ -1171,9 +1171,9 @@ e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens) if(str8_match(token_string, str8_lit("*"), 0)) { token_it += 1; - E_Expr *ptee = parse.expr; - parse.expr = e_push_expr(arena, E_ExprKind_Ptr, token_string.str); - e_expr_push_child(parse.expr, ptee); + E_Expr *ptee = parse.first_expr; + parse.first_expr = parse.last_expr = e_push_expr(arena, E_ExprKind_Ptr, token_string.str); + e_expr_push_child(parse.first_expr, ptee); } else { @@ -1188,17 +1188,16 @@ e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens) } internal E_Parse -e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *tokens, S64 max_precedence) +e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *tokens, S64 max_precedence, U64 max_chain_count) { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); E_Token *it = tokens->v; E_Token *it_opl = tokens->v + tokens->count; - E_Parse result = {0, &e_expr_nil}; - E_Expr *last_expr = &e_expr_nil; + E_Parse result = {0, &e_expr_nil, &e_expr_nil}; //- rjf: parse chain of expressions - for(;it < it_opl;) + for(U64 chain_count = 0; it < it_opl && chain_count < max_chain_count;) { //- rjf: exit on symbols callers may be waiting on { @@ -1206,7 +1205,9 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to String8 token_string = str8_substr(text, token.range); if(token.kind == E_TokenKind_Symbol && (str8_match(token_string, str8_lit(")"), 0) || - str8_match(token_string, str8_lit("]"), 0))) + str8_match(token_string, str8_lit("]"), 0) || + str8_match(token_string, str8_lit(":"), 0) || + str8_match(token_string, str8_lit("?"), 0))) { break; } @@ -1286,7 +1287,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to // rjf: parse type expr E_TokenArray type_parse_tokens = e_token_array_make_first_opl(it, it_opl); E_Parse type_parse = e_parse_type_from_text_tokens(arena, text, &type_parse_tokens); - E_Expr *type = type_parse.expr; + E_Expr *type = type_parse.last_expr; e_msg_list_concat_in_place(&result.msgs, &type_parse.msgs); it = type_parse.last_token; location = token_string.str; @@ -1367,9 +1368,9 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to // rjf: parse () contents E_TokenArray nested_parse_tokens = e_token_array_make_first_opl(it, it_opl); - E_Parse nested_parse = e_parse_expr_from_text_tokens__prec(arena, text, &nested_parse_tokens, e_max_precedence); + E_Parse nested_parse = e_parse_expr_from_text_tokens__prec(arena, text, &nested_parse_tokens, e_max_precedence, 1); e_msg_list_concat_in_place(&result.msgs, &nested_parse.msgs); - atom = nested_parse.expr; + atom = nested_parse.last_expr; it = nested_parse.last_token; // rjf: expect ) @@ -1395,13 +1396,13 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to // rjf: parse [] contents E_TokenArray nested_parse_tokens = e_token_array_make_first_opl(it, it_opl); - E_Parse nested_parse = e_parse_expr_from_text_tokens__prec(arena, text, &nested_parse_tokens, e_max_precedence); + E_Parse nested_parse = e_parse_expr_from_text_tokens__prec(arena, text, &nested_parse_tokens, e_max_precedence, 1); e_msg_list_concat_in_place(&result.msgs, &nested_parse.msgs); - atom = nested_parse.expr; + atom = nested_parse.last_expr; it = nested_parse.last_token; // rjf: build cast-to-U64*, and dereference operators - if(nested_parse.expr == &e_expr_nil) + if(nested_parse.last_expr == &e_expr_nil) { e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Expected expression following `[`."); } @@ -1777,7 +1778,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to { E_TokenArray type_parse_tokens = e_token_array_make_first_opl(it-1, it_opl); E_Parse type_parse = e_parse_type_from_text_tokens(arena, text, &type_parse_tokens); - E_Expr *type = type_parse.expr; + E_Expr *type = type_parse.last_expr; e_msg_list_concat_in_place(&result.msgs, &type_parse.msgs); it = type_parse.last_token; atom = type; @@ -2050,15 +2051,15 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to // rjf: parse indexing expression E_TokenArray idx_expr_parse_tokens = e_token_array_make_first_opl(it, it_opl); - E_Parse idx_expr_parse = e_parse_expr_from_text_tokens__prec(arena, text, &idx_expr_parse_tokens, e_max_precedence); + E_Parse idx_expr_parse = e_parse_expr_from_text_tokens__prec(arena, text, &idx_expr_parse_tokens, e_max_precedence, 1); e_msg_list_concat_in_place(&result.msgs, &idx_expr_parse.msgs); it = idx_expr_parse.last_token; // rjf: valid indexing expression => produce index expr - if(idx_expr_parse.expr != &e_expr_nil) + if(idx_expr_parse.last_expr != &e_expr_nil) { E_Expr *array_expr = atom; - E_Expr *index_expr = idx_expr_parse.expr; + E_Expr *index_expr = idx_expr_parse.last_expr; atom = e_push_expr(arena, E_ExprKind_ArrayIndex, token_string.str); e_expr_push_child(atom, array_expr); e_expr_push_child(atom, index_expr); @@ -2083,7 +2084,10 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to if(token.kind == E_TokenKind_Symbol && str8_match(token_string, str8_lit("("), 0)) { + // rjf: skip ( it += 1; + + // rjf: parse all argument expressions E_Expr *callee_expr = atom; E_Expr *call_expr = e_push_expr(arena, E_ExprKind_Call, token_string.str); if(callee_expr->kind == E_ExprKind_LeafIdent) @@ -2091,34 +2095,31 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to call_expr->string = callee_expr->string; } e_expr_push_child(call_expr, callee_expr); - for(B32 done = 0; !done && it < it_opl;) + E_TokenArray args_parse_tokens = e_token_array_make_first_opl(it, it_opl); + E_Parse args_parse = e_parse_expr_from_text_tokens__prec(arena, text, &args_parse_tokens, e_max_precedence, max_U64); + e_msg_list_concat_in_place(&result.msgs, &args_parse.msgs); + it = args_parse.last_token; + if(args_parse.first_expr != &e_expr_nil) { - E_Token token = e_token_at_it(it, tokens); - String8 token_string = str8_substr(text, token.range); - if(token.kind == E_TokenKind_Symbol && str8_match(token_string, str8_lit(")"), 0)) + call_expr->last->next = args_parse.first_expr; + args_parse.first_expr->prev = call_expr->last; + call_expr->last = args_parse.last_expr; + } + atom = call_expr; + + // rjf: expect ) + { + E_Token close_paren_maybe = e_token_at_it(it, tokens); + String8 close_paren_maybe_string = str8_substr(text, close_paren_maybe.range); + if(close_paren_maybe.kind != E_TokenKind_Symbol || !str8_match(close_paren_maybe_string, str8_lit(")"), 0)) { - done = 1; - it += 1; + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Unclosed `(`."); } else { - E_TokenArray idx_expr_parse_tokens = e_token_array_make_first_opl(it, it_opl); - E_Parse arg_parse = e_parse_expr_from_text_tokens__prec(arena, text, &idx_expr_parse_tokens, e_max_precedence); - e_msg_list_concat_in_place(&result.msgs, &arg_parse.msgs); - if(arg_parse.expr != &e_expr_nil) - { - e_expr_push_child(call_expr, arg_parse.expr); - } - it = arg_parse.last_token; - E_Token maybe_comma = e_token_at_it(it, tokens); - String8 maybe_comma_string = str8_substr(text, token.range); - if(maybe_comma.kind == E_TokenKind_Symbol && str8_match(maybe_comma_string, str8_lit(","), 0)) - { - it += 1; - } + it += 1; } } - atom = call_expr; } // rjf: quit if this doesn't look like any patterns of postfix unary we know @@ -2194,9 +2195,9 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to if(binary_precedence != 0 && binary_precedence <= max_precedence) { E_TokenArray rhs_expr_parse_tokens = e_token_array_make_first_opl(it+1, it_opl); - E_Parse rhs_expr_parse = e_parse_expr_from_text_tokens__prec(arena, text, &rhs_expr_parse_tokens, binary_precedence-1); + E_Parse rhs_expr_parse = e_parse_expr_from_text_tokens__prec(arena, text, &rhs_expr_parse_tokens, binary_precedence-1, 1); e_msg_list_concat_in_place(&result.msgs, &rhs_expr_parse.msgs); - E_Expr *rhs = rhs_expr_parse.expr; + E_Expr *rhs = rhs_expr_parse.last_expr; it = rhs_expr_parse.last_token; if(rhs == &e_expr_nil) { @@ -2220,11 +2221,11 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to // rjf: parse middle expression E_TokenArray middle_expr_tokens = e_token_array_make_first_opl(it, it_opl); - E_Parse middle_expr_parse = e_parse_expr_from_text_tokens__prec(arena, text, &middle_expr_tokens, e_max_precedence); + E_Parse middle_expr_parse = e_parse_expr_from_text_tokens__prec(arena, text, &middle_expr_tokens, e_max_precedence, 1); it = middle_expr_parse.last_token; - E_Expr *middle_expr = middle_expr_parse.expr; + E_Expr *middle_expr = middle_expr_parse.last_expr; e_msg_list_concat_in_place(&result.msgs, &middle_expr_parse.msgs); - if(middle_expr_parse.expr == &e_expr_nil) + if(middle_expr_parse.last_expr == &e_expr_nil) { e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Expected expression after `?`."); } @@ -2251,12 +2252,12 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to // rjf: parse rhs E_TokenArray rhs_expr_parse_tokens = e_token_array_make_first_opl(it, it_opl); - E_Parse rhs_expr_parse = e_parse_expr_from_text_tokens__prec(arena, text, &rhs_expr_parse_tokens, e_max_precedence); + E_Parse rhs_expr_parse = e_parse_expr_from_text_tokens__prec(arena, text, &rhs_expr_parse_tokens, e_max_precedence, 1); if(got_colon) { it = rhs_expr_parse.last_token; e_msg_list_concat_in_place(&result.msgs, &rhs_expr_parse.msgs); - if(rhs_expr_parse.expr == &e_expr_nil) + if(rhs_expr_parse.last_expr == &e_expr_nil) { e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, colon_token_string.str, "Expected expression after `:`."); } @@ -2264,12 +2265,12 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to // rjf: build ternary if(atom != &e_expr_nil && - middle_expr_parse.expr != &e_expr_nil && - rhs_expr_parse.expr != &e_expr_nil) + middle_expr_parse.last_expr != &e_expr_nil && + rhs_expr_parse.last_expr != &e_expr_nil) { E_Expr *lhs = atom; - E_Expr *mhs = middle_expr_parse.expr; - E_Expr *rhs = rhs_expr_parse.expr; + E_Expr *mhs = middle_expr_parse.last_expr; + E_Expr *rhs = rhs_expr_parse.last_expr; atom = e_push_expr(arena, E_ExprKind_Ternary, token_string.str); e_expr_push_child(atom, lhs); e_expr_push_child(atom, mhs); @@ -2282,38 +2283,15 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to { if(token.kind == E_TokenKind_Symbol && str8_match(token_string, str8_lit("=>"), 0)) { - for(B32 done = 0; !done && it < it_opl;) + it += 1; + E_TokenArray tags_tokens = e_token_array_make_first_opl(it, it_opl); + E_Parse tags_parse = e_parse_expr_from_text_tokens__prec(arena, text, &tags_tokens, e_max_precedence, max_U64); + e_msg_list_concat_in_place(&result.msgs, &tags_parse.msgs); + it = tags_parse.last_token; + for(E_Expr *tag = tags_parse.first_expr, *next = &e_expr_nil; tag != &e_expr_nil; tag = next) { - E_Token maybe_identifier = e_token_at_it(it, tokens); - E_Token maybe_open_paren = e_token_at_it(it+1, tokens); - String8 maybe_open_paren_string = str8_substr(text, maybe_open_paren.range); - if(maybe_identifier.kind == E_TokenKind_Identifier && - maybe_open_paren.kind == E_TokenKind_Symbol && - str8_match(maybe_open_paren_string, str8_lit("("), 0)) - { - E_TokenArray tag_tokens = e_token_array_make_first_opl(it, it_opl); - E_Parse tag_parse = e_parse_expr_from_text_tokens(arena, text, &tag_tokens); - e_msg_list_concat_in_place(&result.msgs, &tag_parse.msgs); - it = tag_parse.last_token; - if(tag_parse.expr != &e_expr_nil) - { - e_expr_push_tag(atom, tag_parse.expr); - } - else - { - done = 1; - } - E_Token maybe_comma = e_token_at_it(it, tokens); - String8 maybe_comma_string = str8_substr(text, token.range); - if(maybe_comma.kind == E_TokenKind_Symbol && str8_match(maybe_comma_string, str8_lit(","), 0)) - { - it += 1; - } - } - else - { - done = 1; - } + next = tag->next; + e_expr_push_tag(atom, tag); } } } @@ -2328,7 +2306,8 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to //- rjf: store parsed atom to expression chain - if we didn't get an expression, break if(atom != &e_expr_nil) { - DLLPushBack_NPZ(&e_expr_nil, result.expr, last_expr, atom, next, prev); + DLLPushBack_NPZ(&e_expr_nil, result.first_expr, result.last_expr, atom, next, prev); + chain_count += 1; } else { @@ -2347,7 +2326,7 @@ internal E_Parse e_parse_expr_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens) { ProfBegin("parse '%.*s'", str8_varg(text)); - E_Parse parse = e_parse_expr_from_text_tokens__prec(arena, text, tokens, e_max_precedence); + E_Parse parse = e_parse_expr_from_text_tokens__prec(arena, text, tokens, e_max_precedence, max_U64); ProfEnd(); return parse; } @@ -2359,7 +2338,7 @@ e_parse_expr_from_text(Arena *arena, String8 text) E_TokenArray tokens = e_token_array_from_text(scratch.arena, text); E_Parse parse = e_parse_expr_from_text_tokens(arena, text, &tokens); scratch_end(scratch); - return parse.expr; + return parse.last_expr; } internal E_Parse diff --git a/src/eval/eval_parse.h b/src/eval/eval_parse.h index 2b57c552..75c6d399 100644 --- a/src/eval/eval_parse.h +++ b/src/eval/eval_parse.h @@ -153,7 +153,8 @@ typedef struct E_Parse E_Parse; struct E_Parse { E_Token *last_token; - E_Expr *expr; + E_Expr *first_expr; + E_Expr *last_expr; E_MsgList msgs; }; @@ -290,7 +291,7 @@ internal E_TypeKey e_leaf_type_from_name(String8 name); internal E_TypeKey e_type_from_expr(E_Expr *expr); internal void e_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, E_String2ExprMap *map, E_Expr *expr); internal E_Parse e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens); -internal E_Parse e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *tokens, S64 max_precedence); +internal E_Parse e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *tokens, S64 max_precedence, U64 max_chain_count); internal E_Parse e_parse_expr_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens); internal E_Expr *e_parse_expr_from_text(Arena *arena, String8 text); internal E_Parse e_parse_expr_from_text__cached(String8 text); diff --git a/src/eval_visualization/eval_visualization_builtin_view_rules.c b/src/eval_visualization/eval_visualization_builtin_view_rules.c index edd26587..b8d293c7 100644 --- a/src/eval_visualization/eval_visualization_builtin_view_rules.c +++ b/src/eval_visualization/eval_visualization_builtin_view_rules.c @@ -32,7 +32,7 @@ ev_type_key_from_params(MD_Node *params) String8 expr = md_string_from_children(scratch.arena, params); E_TokenArray tokens = e_token_array_from_text(scratch.arena, expr); E_Parse parse = e_parse_type_from_text_tokens(scratch.arena, expr, &tokens); - E_TypeKey type_key = e_type_from_expr(parse.expr); + E_TypeKey type_key = e_type_from_expr(parse.last_expr); scratch_end(scratch); return type_key; } diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index 719e85d2..9fc3a3e0 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -463,7 +463,7 @@ ev_keyed_expr_push_tags(Arena *arena, EV_View *view, EV_Block *block, EV_Key key String8 tag_expr = push_str8_copy(arena, ev_view_rule_from_key(view, key)); E_TokenArray tag_expr_tokens = e_token_array_from_text(scratch.arena, tag_expr); E_Parse tag_expr_parse = e_parse_expr_from_text_tokens(arena, tag_expr, &tag_expr_tokens); - for(E_Expr *tag = tag_expr_parse.expr, *next = &e_expr_nil; tag != &e_expr_nil; tag = next) + for(E_Expr *tag = tag_expr_parse.first_expr, *next = &e_expr_nil; tag != &e_expr_nil; tag = next) { next = tag->next; e_expr_push_tag(expr, tag); @@ -488,7 +488,7 @@ ev_block_tree_from_string(Arena *arena, EV_View *view, String8 filter, String8 s EV_Key root_row_key = ev_key_make(ev_hash_from_key(root_key), 1); E_TokenArray root_tokens = e_token_array_from_text(scratch.arena, string); E_Parse root_parse = e_parse_expr_from_text_tokens(arena, string, &root_tokens); - E_Expr *root_expr = root_parse.expr; + E_Expr *root_expr = root_parse.last_expr; ev_keyed_expr_push_tags(arena, view, &ev_nil_block, root_row_key, root_expr); //- rjf: generate root block diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 92c49185..89d3d206 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -73,46 +73,6 @@ rd_cmd_list_push_new(Arena *arena, RD_CmdList *cmds, String8 name, RD_Regs *regs cmds->count += 1; } -//////////////////////////////// -//~ rjf: View Spec Type Functions - -#if 0 // TODO(rjf): @cfg -internal RD_ViewRuleKind -rd_view_rule_kind_from_string(String8 string) -{ - RD_ViewRuleKind kind = RD_ViewRuleKind_Null; - for EachEnumVal(RD_ViewRuleKind, k) - { - if(str8_match(string, rd_view_rule_kind_info_table[k].string, 0)) - { - kind = k; - break; - } - } - return kind; -} - -internal RD_ViewRuleInfo * -rd_view_rule_info_from_kind(RD_ViewRuleKind kind) -{ - return &rd_view_rule_kind_info_table[kind]; -} - -internal RD_ViewRuleInfo * -rd_view_rule_info_from_string(String8 string) -{ - RD_ViewRuleInfo *result = &rd_nil_view_rule_info; - { - RD_ViewRuleKind kind = rd_view_rule_kind_from_string(string); - if(kind != RD_ViewRuleKind_Null) - { - result = &rd_view_rule_kind_info_table[kind]; - } - } - return result; -} -#endif - //////////////////////////////// //~ rjf: View UI Rule Functions @@ -847,7 +807,7 @@ rd_panel_tree_from_cfg(Arena *arena, RD_Cfg *cfg) } // rjf: extract cfg info - B32 panel_has_tabs = 0; + B32 panel_has_children = 0; dst->cfg = src; dst->pct_of_parent = (F32)f64_from_str8(src->string); dst->tab_side = (rd_cfg_child_from_string(src, str8_lit("tabs_on_bottom")) != &rd_nil_cfg ? Side_Max : Side_Min); @@ -857,7 +817,7 @@ rd_panel_tree_from_cfg(Arena *arena, RD_Cfg *cfg) MD_TokenizeResult tokenize = md_tokenize_from_text(scratch.arena, src_child->string); if(tokenize.tokens.count == 1 && tokenize.tokens.v[0].flags & MD_TokenFlag_Numeric) { - // NOTE(rjf): skip - this is a panel. + panel_has_children = 1; } else if(str8_match(src_child->string, str8_lit("tabs_on_bottom"), 0)) { @@ -869,7 +829,6 @@ rd_panel_tree_from_cfg(Arena *arena, RD_Cfg *cfg) } else if(tokenize.tokens.count == 1 && tokenize.tokens.v[0].flags & MD_TokenFlag_Identifier) { - panel_has_tabs = 1; rd_cfg_list_push(arena, &dst->tabs, src_child); if(rd_cfg_child_from_string(src_child, str8_lit("selected")) != &rd_nil_cfg) { @@ -880,7 +839,7 @@ rd_panel_tree_from_cfg(Arena *arena, RD_Cfg *cfg) // rjf: recurse rec = rd_cfg_rec__depth_first(src_root, src); - if(panel_has_tabs) + if(!panel_has_children) { MemoryZeroStruct(&rec); rec.next = &rd_nil_cfg; @@ -13165,7 +13124,10 @@ rd_frame(void) E_Parse parse = e_parse_expr_from_text__cached(expr); if(parse.msgs.max_kind == E_MsgKind_Null) { - e_push_leaf_ident_exprs_from_expr__in_place(scratch.arena, ctx->macro_map, parse.expr); + for(E_Expr *expr = parse.first_expr; expr != &e_expr_nil; expr = expr->next) + { + e_push_leaf_ident_exprs_from_expr__in_place(scratch.arena, ctx->macro_map, expr); + } } } diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 03b49a4c..e2a079ec 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -936,15 +936,6 @@ internal RD_Regs *rd_regs_copy(Arena *arena, RD_Regs *src); internal void rd_cmd_list_push_new(Arena *arena, RD_CmdList *cmds, String8 name, RD_Regs *regs); -//////////////////////////////// -//~ rjf: View Spec Type Functions - -#if 0 // TODO(rjf): @cfg -internal RD_ViewRuleKind rd_view_rule_kind_from_string(String8 string); -internal RD_ViewRuleInfo *rd_view_rule_info_from_kind(RD_ViewRuleKind kind); -internal RD_ViewRuleInfo *rd_view_rule_info_from_string(String8 string); -#endif - //////////////////////////////// //~ rjf: View UI Rule Functions diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index d92319cb..a3d6577e 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -2793,7 +2793,7 @@ RD_VIEW_UI_FUNCTION_DEF(watch) String8 string = ev_expr_string_from_row(scratch.arena, row, 0); E_TokenArray tokens = e_token_array_from_text(scratch.arena, string); E_Parse parse = e_parse_expr_from_text_tokens(scratch.arena, string, &tokens); - E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, parse.expr); + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, parse.last_expr); E_OpList oplist = e_oplist_from_irtree(scratch.arena, irtree.root); String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist); UI_Flags(UI_BoxFlag_DrawTextWeak) ui_labelf("Text:"); @@ -2815,7 +2815,7 @@ RD_VIEW_UI_FUNCTION_DEF(watch) E_Expr *expr; S64 depth; }; - Task start_task = {0, 0, parse.expr}; + Task start_task = {0, 0, parse.last_expr}; Task *first_task = &start_task; Task *last_task = first_task; for(Task *t = first_task; t != 0; t = t->next)