From c603457460d931d800319e01a3713a89702484e8 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 15 Feb 2025 18:11:22 -0800 Subject: [PATCH] dead code deletion, begin extending eval/eval-viz to work on expr-chains rather than single expressions; fixes / convergence for watch window --- src/eval/eval_bundles.c | 14 +- src/eval/eval_bundles.h | 3 +- src/eval/eval_ir.c | 37 ++-- src/eval/eval_ir.h | 2 +- src/eval/eval_parse.c | 60 +++---- src/eval/eval_parse.h | 12 +- .../eval_visualization_core.c | 4 +- .../dwrite/font_provider_dwrite.c | 7 +- src/raddbg/raddbg.mdesk | 8 +- src/raddbg/raddbg_core.c | 167 ++++-------------- src/raddbg/raddbg_core.h | 8 - src/raddbg/raddbg_views.c | 62 ++++--- 12 files changed, 152 insertions(+), 232 deletions(-) diff --git a/src/eval/eval_bundles.c b/src/eval/eval_bundles.c index b1753efa..0ee41d92 100644 --- a/src/eval/eval_bundles.c +++ b/src/eval/eval_bundles.c @@ -6,9 +6,17 @@ internal E_Eval e_eval_from_expr(Arena *arena, E_Expr *expr) +{ + E_ExprChain exprs = {expr, expr}; + E_Eval result = e_eval_from_exprs(arena, exprs); + return result; +} + +internal E_Eval +e_eval_from_exprs(Arena *arena, E_ExprChain exprs) { ProfBeginFunction(); - E_IRTreeAndType irtree = e_irtree_and_type_from_expr(arena, expr); + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(arena, exprs.last); E_OpList oplist = e_oplist_from_irtree(arena, irtree.root); String8 bytecode = e_bytecode_from_oplist(arena, &oplist); E_Interpretation interp = e_interpret(bytecode); @@ -17,7 +25,7 @@ e_eval_from_expr(Arena *arena, E_Expr *expr) .value = interp.value, .mode = irtree.mode, .space = interp.space, - .expr = expr, + .exprs = exprs, .type_key = irtree.type_key, .code = interp.code, }; @@ -35,7 +43,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.last_expr); + E_Eval eval = e_eval_from_exprs(arena, parse.exprs); e_msg_list_concat_in_place(&eval.msgs, &parse.msgs); return eval; } diff --git a/src/eval/eval_bundles.h b/src/eval/eval_bundles.h index c83b33f5..c72fa6ee 100644 --- a/src/eval/eval_bundles.h +++ b/src/eval/eval_bundles.h @@ -13,7 +13,7 @@ struct E_Eval E_Value value; E_Mode mode; E_Space space; - E_Expr *expr; + E_ExprChain exprs; E_TypeKey type_key; E_InterpretationCode code; E_MsgList msgs; @@ -23,6 +23,7 @@ struct E_Eval //~ rjf: Bundled Evaluation Functions internal E_Eval e_eval_from_expr(Arena *arena, E_Expr *expr); +internal E_Eval e_eval_from_exprs(Arena *arena, E_ExprChain exprs); internal E_Eval e_eval_from_string(Arena *arena, String8 string); internal E_Eval e_eval_from_stringf(Arena *arena, char *fmt, ...); internal E_Eval e_autoresolved_eval_from_eval(E_Eval eval); diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index e38c4423..0d975fec 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -166,11 +166,15 @@ E_LOOKUP_INFO_FUNCTION_DEF(default) } else if(lhs_type_kind == E_TypeKind_Struct || lhs_type_kind == E_TypeKind_Class || - lhs_type_kind == E_TypeKind_Union || - lhs_type_kind == E_TypeKind_Enum) + lhs_type_kind == E_TypeKind_Union) { - E_Type *lhs_type = e_type_from_key__cached(lhs_type_key); - lookup_info.named_expr_count = lhs_type->count; + E_MemberArray data_members = e_type_data_members_from_key__cached(lhs_type_key); + lookup_info.named_expr_count = data_members.count; + } + else if(lhs_type_kind == E_TypeKind_Enum) + { + E_Type *direct_type = e_type_from_key__cached(lhs_type_key); + lookup_info.named_expr_count = direct_type->count; } else if(lhs_type_kind == E_TypeKind_Array) { @@ -570,12 +574,10 @@ E_IRGEN_FUNCTION_DEF(array) E_TypeKind type_kind = e_type_kind_from_key(type_key); if(e_type_kind_is_pointer_or_ref(type_kind)) { - Temp scratch = scratch_begin(&arena, 1); - E_Eval count_eval = e_eval_from_expr(scratch.arena, tag->first->next); + E_Value count_value = e_value_from_expr(tag->first->next); E_TypeKey element_type_key = e_type_ptee_from_key(type_key); - E_TypeKey ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, element_type_key, count_eval.value.u64, 0); + E_TypeKey ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, element_type_key, count_value.u64, 0); irtree.type_key = ptr_type_key; - scratch_end(scratch); } return irtree; } @@ -617,9 +619,8 @@ E_IRGEN_FUNCTION_DEF(slice) if(count_member != 0) { E_Expr *count_member_expr = e_expr_irext_member_access(arena, expr, &irtree, count_member->name); - E_Eval count_member_eval = e_eval_from_expr(scratch.arena, count_member_expr); - E_Eval count_member_value_eval = e_value_eval_from_eval(count_member_eval); - count = count_member_value_eval.value.u64; + E_Value count_member_value = e_value_from_expr(count_member_expr); + count = count_member_value.u64; } // rjf: generate new struct slice type @@ -760,14 +761,14 @@ 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.last_expr); + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, parse.exprs.last); type_key = irtree.type_key; } E_AutoHookNode *node = push_array(arena, E_AutoHookNode, 1); node->type_key = type_key; U8 pattern_split = '?'; node->type_pattern_parts = str8_split(arena, params->type_pattern, &pattern_split, 1, 0); - node->tag_expr = e_parse_expr_from_text(arena, push_str8_copy(arena, params->tag_expr_string)); + node->tag_exprs = e_parse_expr_from_text(arena, push_str8_copy(arena, params->tag_expr_string)).exprs; if(!e_type_key_match(e_type_key_zero(), type_key)) { U64 hash = e_hash_from_string(5381, str8_struct(&type_key)); @@ -800,7 +801,10 @@ e_auto_hook_tag_exprs_from_type_key(Arena *arena, E_TypeKey type_key) { if(e_type_key_match(n->type_key, type_key)) { - e_expr_list_push(arena, &exprs, n->tag_expr); + for(E_Expr *e = n->tag_exprs.first; e != &e_expr_nil; e = e->next) + { + e_expr_list_push(arena, &exprs, e); + } } } } @@ -829,7 +833,10 @@ e_auto_hook_tag_exprs_from_type_key(Arena *arena, E_TypeKey type_key) } if(fits_this_type_string) { - e_expr_list_push(arena, &exprs, auto_hook_node->tag_expr); + for(E_Expr *e = auto_hook_node->tag_exprs.first; e != &e_expr_nil; e = e->next) + { + e_expr_list_push(arena, &exprs, e); + } } } } diff --git a/src/eval/eval_ir.h b/src/eval/eval_ir.h index 2e1d451f..2fcc65a9 100644 --- a/src/eval/eval_ir.h +++ b/src/eval/eval_ir.h @@ -189,7 +189,7 @@ struct E_AutoHookNode E_AutoHookNode *pattern_order_next; E_TypeKey type_key; String8List type_pattern_parts; - E_Expr *tag_expr; + E_ExprChain tag_exprs; }; typedef struct E_AutoHookSlot E_AutoHookSlot; diff --git a/src/eval/eval_parse.c b/src/eval/eval_parse.c index a61717b5..56e78ee7 100644 --- a/src/eval/eval_parse.c +++ b/src/eval/eval_parse.c @@ -660,7 +660,7 @@ internal E_Expr * e_push_expr(Arena *arena, E_ExprKind kind, void *location) { E_Expr *e = push_array(arena, E_Expr, 1); - e->first = e->last = e->next = e->ref = e->first_tag = e->last_tag = &e_expr_nil; + e->first = e->last = e->next = e->prev = e->ref = e->first_tag = e->last_tag = &e_expr_nil; e->location = location; e->kind = kind; return e; @@ -1110,14 +1110,14 @@ e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens) } // rjf: construct leaf type - parse.first_expr = parse.last_expr = e_push_expr(arena, E_ExprKind_TypeIdent, token_string.str); - parse.first_expr->type_key = type_key; + parse.exprs.first = parse.exprs.last = e_push_expr(arena, E_ExprKind_TypeIdent, token_string.str); + parse.exprs.first->type_key = type_key; } } } //- rjf: parse extensions - if(parse.first_expr != &e_expr_nil) + if(parse.exprs.first != &e_expr_nil) { for(;;) { @@ -1130,9 +1130,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.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); + E_Expr *ptee = parse.exprs.first; + parse.exprs.first = parse.exprs.last = e_push_expr(arena, E_ExprKind_Ptr, token_string.str); + e_expr_push_child(parse.exprs.first, ptee); } else { @@ -1246,7 +1246,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.last_expr; + E_Expr *type = type_parse.exprs.last; e_msg_list_concat_in_place(&result.msgs, &type_parse.msgs); it = type_parse.last_token; location = token_string.str; @@ -1329,7 +1329,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to 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, 1); e_msg_list_concat_in_place(&result.msgs, &nested_parse.msgs); - atom = nested_parse.last_expr; + atom = nested_parse.exprs.last; it = nested_parse.last_token; // rjf: expect ) @@ -1357,11 +1357,11 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to 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, 1); e_msg_list_concat_in_place(&result.msgs, &nested_parse.msgs); - atom = nested_parse.last_expr; + atom = nested_parse.exprs.last; it = nested_parse.last_token; // rjf: build cast-to-U64*, and dereference operators - if(nested_parse.last_expr == &e_expr_nil) + if(nested_parse.exprs.last == &e_expr_nil) { e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Expected expression following `[`."); } @@ -1737,7 +1737,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.last_expr; + E_Expr *type = type_parse.exprs.last; e_msg_list_concat_in_place(&result.msgs, &type_parse.msgs); it = type_parse.last_token; atom = type; @@ -2015,10 +2015,10 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to it = idx_expr_parse.last_token; // rjf: valid indexing expression => produce index expr - if(idx_expr_parse.last_expr != &e_expr_nil) + if(idx_expr_parse.exprs.last != &e_expr_nil) { E_Expr *array_expr = atom; - E_Expr *index_expr = idx_expr_parse.last_expr; + E_Expr *index_expr = idx_expr_parse.exprs.last; 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); @@ -2055,11 +2055,11 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to 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) + if(args_parse.exprs.first != &e_expr_nil) { - call_expr->last->next = args_parse.first_expr; - args_parse.first_expr->prev = call_expr->last; - call_expr->last = args_parse.last_expr; + call_expr->last->next = args_parse.exprs.first; + args_parse.exprs.first->prev = call_expr->last; + call_expr->last = args_parse.exprs.last; } atom = call_expr; @@ -2153,7 +2153,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to 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, 1); e_msg_list_concat_in_place(&result.msgs, &rhs_expr_parse.msgs); - E_Expr *rhs = rhs_expr_parse.last_expr; + E_Expr *rhs = rhs_expr_parse.exprs.last; it = rhs_expr_parse.last_token; if(rhs == &e_expr_nil) { @@ -2179,9 +2179,9 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to 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, 1); it = middle_expr_parse.last_token; - E_Expr *middle_expr = middle_expr_parse.last_expr; + E_Expr *middle_expr = middle_expr_parse.exprs.last; e_msg_list_concat_in_place(&result.msgs, &middle_expr_parse.msgs); - if(middle_expr_parse.last_expr == &e_expr_nil) + if(middle_expr_parse.exprs.last == &e_expr_nil) { e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Expected expression after `?`."); } @@ -2213,7 +2213,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to { it = rhs_expr_parse.last_token; e_msg_list_concat_in_place(&result.msgs, &rhs_expr_parse.msgs); - if(rhs_expr_parse.last_expr == &e_expr_nil) + if(rhs_expr_parse.exprs.last == &e_expr_nil) { e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, colon_token_string.str, "Expected expression after `:`."); } @@ -2221,12 +2221,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.last_expr != &e_expr_nil && - rhs_expr_parse.last_expr != &e_expr_nil) + middle_expr_parse.exprs.last != &e_expr_nil && + rhs_expr_parse.exprs.last != &e_expr_nil) { E_Expr *lhs = atom; - E_Expr *mhs = middle_expr_parse.last_expr; - E_Expr *rhs = rhs_expr_parse.last_expr; + E_Expr *mhs = middle_expr_parse.exprs.last; + E_Expr *rhs = rhs_expr_parse.exprs.last; atom = e_push_expr(arena, E_ExprKind_Ternary, token_string.str); e_expr_push_child(atom, lhs); e_expr_push_child(atom, mhs); @@ -2244,7 +2244,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to 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) + for(E_Expr *tag = tags_parse.exprs.first, *next = &e_expr_nil; tag != &e_expr_nil; tag = next) { next = tag->next; e_expr_push_tag(atom, tag); @@ -2262,7 +2262,7 @@ 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.first_expr, result.last_expr, atom, next, prev); + DLLPushBack_NPZ(&e_expr_nil, result.exprs.first, result.exprs.last, atom, next, prev); chain_count += 1; } else @@ -2287,14 +2287,14 @@ e_parse_expr_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens) return parse; } -internal E_Expr * +internal E_Parse e_parse_expr_from_text(Arena *arena, String8 text) { Temp scratch = scratch_begin(&arena, 1); 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.last_expr; + return parse; } internal E_Parse diff --git a/src/eval/eval_parse.h b/src/eval/eval_parse.h index 4ba88b90..37343f2e 100644 --- a/src/eval/eval_parse.h +++ b/src/eval/eval_parse.h @@ -68,6 +68,13 @@ struct E_Expr String8 bytecode; }; +typedef struct E_ExprChain E_ExprChain; +struct E_ExprChain +{ + E_Expr *first; + E_Expr *last; +}; + typedef struct E_ExprNode E_ExprNode; struct E_ExprNode { @@ -153,8 +160,7 @@ typedef struct E_Parse E_Parse; struct E_Parse { E_Token *last_token; - E_Expr *first_expr; - E_Expr *last_expr; + E_ExprChain exprs; E_MsgList msgs; }; @@ -289,7 +295,7 @@ internal void e_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, E_String 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, 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(Arena *arena, String8 text); internal E_Parse e_parse_expr_from_text__cached(String8 text); #endif // EVAL_PARSE_H diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index dc346cdb..2cce058e 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -485,7 +485,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.first_expr, *next = &e_expr_nil; tag != &e_expr_nil; tag = next) + for(E_Expr *tag = tag_expr_parse.exprs.first, *next = &e_expr_nil; tag != &e_expr_nil; tag = next) { next = tag->next; e_expr_push_tag(expr, tag); @@ -508,7 +508,7 @@ ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval eval //- rjf: generate root expression EV_Key root_key = ev_key_root(); EV_Key root_row_key = ev_key_make(ev_hash_from_key(root_key), 1); - E_Expr *root_expr = e_expr_copy(arena, eval.expr); + E_Expr *root_expr = e_expr_copy(arena, eval.exprs.last); ev_keyed_expr_push_tags(arena, view, &ev_nil_block, root_row_key, root_expr); //- rjf: generate root block diff --git a/src/font_provider/dwrite/font_provider_dwrite.c b/src/font_provider/dwrite/font_provider_dwrite.c index 4bfbddb2..1868c85f 100644 --- a/src/font_provider/dwrite/font_provider_dwrite.c +++ b/src/font_provider/dwrite/font_provider_dwrite.c @@ -432,7 +432,7 @@ fp_raster(Arena *arena, FP_Handle font_handle, F32 size, FP_RasterFlags flags, S F32 right_side_bearing = 0; if(font.face != 0) { - atlas_dim.y = (S16)ceil_f32((96.f/72.f) * size * (font_metrics.ascent + font_metrics.descent) / design_units_per_em) + 1; + atlas_dim.y = (S16)round_f32((96.f/72.f) * size * (font_metrics.ascent + font_metrics.descent + font_metrics.lineGap) / design_units_per_em) + 1; for(U64 idx = 0; idx < glyphs_count; idx += 1) { DWRITE_GLYPH_METRICS *glyph_metrics = glyphs_metrics + idx; @@ -476,11 +476,14 @@ fp_raster(Arena *arena, FP_Handle font_handle, F32 size, FP_RasterFlags flags, S } //- rjf: draw glyph run - Vec2F32 draw_p = {0, (F32)atlas_dim.y}; + Vec2F32 draw_p = {0, (F32)atlas_dim.y - 1}; if(font.face != 0) { F32 descent = round_f32((96.f/72.f)*size * font_metrics.descent / design_units_per_em); + F32 line_gap = round_f32((96.f/72.f)*size * font_metrics.lineGap / design_units_per_em); draw_p.y -= descent; + draw_p.y -= line_gap; + draw_p.y += 1; } DWRITE_GLYPH_RUN glyph_run = {0}; if(font.face != 0) diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index d8daf92e..8d1c8289 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -208,25 +208,19 @@ RD_VocabTable: ```@collection_commands(add_auto_view_rule) @commands(remove_cfg) x:{'source':code_string, 'dest':code_string}```, } - //- rjf: machines + //- rjf: control entities { machine, ```x:{'label':code_string, 'frozen':bool, 'processes':query}```, } - - //- rjf: processes { process, ```x:{'label':code_string, 'id':u64, 'frozen':bool, 'modules':query, 'threads':query}```, } - - //- rjf: modules { module, ```x:{'exe':path, 'dbg':path, 'vaddr_range':vaddr_range}```, } - - //- rjf: threads { thread, ```x:{'label':code_string, 'id':u64, 'frozen':bool, 'call_stack':query}```, diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index d91f7de0..fe8264d8 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -102,7 +102,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(watches) if(cfg_idx < cfgs->count) { String8 expr_string = rd_cfg_child_from_string(cfgs->v[cfg_idx], str8_lit("expression"))->first->string; - exprs[idx] = e_parse_expr_from_text(arena, expr_string); + exprs[idx] = e_parse_expr_from_text(arena, expr_string).exprs.first; exprs_strings[idx] = push_str8_copy(arena, expr_string); } } @@ -184,7 +184,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(locals) for(U64 idx = 0; idx < read_range_count; idx += 1) { String8 expr_string = accel->v[read_range.min + idx]; - exprs[idx] = e_parse_expr_from_text(arena, expr_string); + exprs[idx] = e_parse_expr_from_text(arena, expr_string).exprs.last; exprs_strings[idx] = push_str8_copy(arena, expr_string); } } @@ -236,7 +236,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(registers) String8 register_name = accel->v[read_range.min + idx]; String8 register_expr = push_str8f(arena, "reg:%S", register_name); exprs_strings[idx] = register_name; - exprs[idx] = e_parse_expr_from_text(arena, register_expr); + exprs[idx] = e_parse_expr_from_text(arena, register_expr).exprs.last; } } @@ -340,7 +340,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(cfg) { Rng1U64 read_range = intersect_1u64(cmds_idx_range, idx_range); U64 read_count = dim_1u64(read_range); - E_Expr *commands = e_parse_expr_from_text(arena, str8_lit("query:commands")); + E_Expr *commands = e_parse_expr_from_text(arena, str8_lit("query:commands")).exprs.last; E_IRTreeAndType commands_irtree = e_irtree_and_type_from_expr(arena, commands); for(U64 idx = 0; idx < read_count; idx += 1, dst_idx += 1) { @@ -425,7 +425,6 @@ E_LOOKUP_INFO_FUNCTION_DEF(call_stack) E_OpList oplist = e_oplist_from_irtree(scratch.arena, lhs->root); String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist); E_Interpretation interp = e_interpret(bytecode); - U128 u128 = interp.value.u128; CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(interp.space); if(entity->kind == CTRL_EntityKind_Thread) { @@ -3371,7 +3370,7 @@ rd_commit_eval_value_string(E_Eval dst_eval, String8 string, B32 string_needs_un if((E_TypeKind_FirstBasic <= type_kind && type_kind <= E_TypeKind_LastBasic) || type_kind == E_TypeKind_Enum) { - E_Expr *src_expr = e_parse_expr_from_text(scratch.arena, string); + E_Expr *src_expr = e_parse_expr_from_text(scratch.arena, string).exprs.last; E_Expr *src_expr__casted = e_expr_ref_cast(scratch.arena, type_key, src_expr); E_Eval src_eval = e_eval_from_expr(scratch.arena, src_expr__casted); commit_data = push_str8_copy(scratch.arena, str8_struct(&src_eval.value)); @@ -3462,113 +3461,6 @@ rd_commit_eval_value_string(E_Eval dst_eval, String8 string, B32 string_needs_un return result; } -//- rjf: view rule config tree info extraction - -internal E_Value -rd_value_from_params_key(MD_Node *params, String8 key) -{ - Temp scratch = scratch_begin(0, 0); - MD_Node *key_node = md_child_from_string(params, key, 0); - String8 expr = md_string_from_children(scratch.arena, key_node); - E_Eval eval = e_eval_from_string(scratch.arena, expr); - E_Eval value_eval = e_value_eval_from_eval(eval); - scratch_end(scratch); - return value_eval.value; -} - -internal Rng1U64 -rd_range_from_eval_params(E_Eval eval, MD_Node *params) -{ - Temp scratch = scratch_begin(0, 0); - U64 size = rd_value_from_params_key(params, str8_lit("size")).u64; - E_TypeKey type_key = e_type_unwrap(eval.type_key); - E_TypeKind type_kind = e_type_kind_from_key(type_key); - E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(eval.type_key)); - E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key); - if(size == 0 && e_type_kind_is_pointer_or_ref(type_kind) && (direct_type_kind == E_TypeKind_Struct || - direct_type_kind == E_TypeKind_Union || - direct_type_kind == E_TypeKind_Class || - direct_type_kind == E_TypeKind_Array)) - { - size = e_type_byte_size_from_key(e_type_direct_from_key(e_type_unwrap(eval.type_key))); - } - if(size == 0 && eval.mode == E_Mode_Offset && (type_kind == E_TypeKind_Struct || - type_kind == E_TypeKind_Union || - type_kind == E_TypeKind_Class || - type_kind == E_TypeKind_Array)) - { - size = e_type_byte_size_from_key(e_type_unwrap(eval.type_key)); - } - if(size == 0) - { - size = KB(16); - } - Rng1U64 result = {0}; - result.min = rd_base_offset_from_eval(eval); - result.max = result.min + size; - scratch_end(scratch); - return result; -} - -internal TXT_LangKind -rd_lang_kind_from_eval_params(E_Eval eval, MD_Node *params) -{ - TXT_LangKind lang_kind = TXT_LangKind_Null; - if(eval.expr->kind == E_ExprKind_LeafFilePath) - { - lang_kind = txt_lang_kind_from_extension(str8_skip_last_dot(eval.expr->string)); - } - else - { - MD_Node *lang_node = md_child_from_string(params, str8_lit("lang"), 0); - String8 lang_kind_string = lang_node->first->string; - lang_kind = txt_lang_kind_from_extension(lang_kind_string); - } - return lang_kind; -} - -internal Arch -rd_arch_from_eval_params(E_Eval eval, MD_Node *params) -{ - Arch arch = Arch_Null; - MD_Node *arch_node = md_child_from_string(params, str8_lit("arch"), 0); - String8 arch_kind_string = arch_node->first->string; - if(str8_match(arch_kind_string, str8_lit("x64"), StringMatchFlag_CaseInsensitive)) - { - arch = Arch_x64; - } - return arch; -} - -internal Vec2S32 -rd_dim2s32_from_eval_params(E_Eval eval, MD_Node *params) -{ - Vec2S32 dim = v2s32(1, 1); - { - dim.x = rd_value_from_params_key(params, str8_lit("w")).s32; - dim.y = rd_value_from_params_key(params, str8_lit("h")).s32; - } - return dim; -} - -internal R_Tex2DFormat -rd_tex2dformat_from_eval_params(E_Eval eval, MD_Node *params) -{ - R_Tex2DFormat result = R_Tex2DFormat_RGBA8; - { - MD_Node *fmt_node = md_child_from_string(params, str8_lit("fmt"), 0); - for EachNonZeroEnumVal(R_Tex2DFormat, fmt) - { - if(str8_match(r_tex2d_format_display_string_table[fmt], fmt_node->first->string, StringMatchFlag_CaseInsensitive)) - { - result = fmt; - break; - } - } - } - return result; -} - //- rjf: eval <-> file path internal String8 @@ -3577,7 +3469,7 @@ rd_file_path_from_eval_string(Arena *arena, String8 string) String8 result = {0}; { Temp scratch = scratch_begin(&arena, 1); - E_Expr *expr = e_parse_expr_from_text(scratch.arena, string); + E_Expr *expr = e_parse_expr_from_text(scratch.arena, string).exprs.last; if(expr->kind == E_ExprKind_LeafFilePath) { result = raw_from_escaped_str8(arena, expr->string); @@ -3605,7 +3497,7 @@ rd_query_from_eval_string(Arena *arena, String8 string) String8 result = {0}; { Temp scratch = scratch_begin(&arena, 1); - E_Expr *expr = e_parse_expr_from_text(scratch.arena, string); + E_Expr *expr = e_parse_expr_from_text(scratch.arena, string).exprs.last; if(expr->kind == E_ExprKind_LeafIdent && str8_match(expr->qualifier, str8_lit("query"), 0)) { @@ -3791,7 +3683,7 @@ rd_view_ui(Rng2F32 rect) { ui_labelf("use"); UI_TextAlignment(UI_TextAlign_Center) rd_cmd_binding_buttons(rd_cmd_kind_info_table[RD_CmdKind_OpenLister].string); - ui_labelf("to open the lister for commands and options"); + ui_labelf("to search for commands and options"); } } scratch_end(scratch); @@ -4041,9 +3933,9 @@ internal TXT_LangKind rd_lang_kind_from_eval_tag(E_Eval eval, E_Expr *tag) { TXT_LangKind lang_kind = TXT_LangKind_Null; - if(eval.expr->kind == E_ExprKind_LeafFilePath) + if(eval.exprs.last->kind == E_ExprKind_LeafFilePath) { - lang_kind = txt_lang_kind_from_extension(str8_skip_last_dot(eval.expr->string)); + lang_kind = txt_lang_kind_from_extension(str8_skip_last_dot(eval.exprs.last->string)); } else for(E_Expr *param = tag->first->next; param != &e_expr_nil; param = param->next) { @@ -9100,9 +8992,9 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul } //- rjf: force no_string, if we are looking at padding members - if(eval.expr->kind == E_ExprKind_MemberAccess) + if(eval.exprs.last->kind == E_ExprKind_MemberAccess) { - E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, eval.expr->first); + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, eval.exprs.last->first); E_TypeKey struct_type = irtree.type_key; for(B32 done = 0; !done;) { @@ -9118,8 +9010,12 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul { struct_type = e_type_direct_from_key(struct_type); } + else + { + break; + } } - E_Member member = e_type_member_from_key_name__cached(struct_type, eval.expr->last->string); + E_Member member = e_type_member_from_key_name__cached(struct_type, eval.exprs.last->last->string); if(member.kind == E_MemberKind_Padding) { no_string = 1; @@ -9288,7 +9184,7 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul { if(type->count == 1) { - E_Expr *deref_expr = e_expr_ref_deref(scratch.arena, eval.expr); + E_Expr *deref_expr = e_expr_ref_deref(scratch.arena, eval.exprs.last); E_Eval deref_eval = e_eval_from_expr(scratch.arena, deref_expr); space_taken += rd_append_value_strings_from_eval(arena, flags, radix, font, font_size, max_size-space_taken, depth+1, root_expr, deref_eval, out); } @@ -9305,8 +9201,8 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul // rjf: contents { - E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, eval.expr); - E_LookupRuleTagPair lookup_rule_and_tag = e_lookup_rule_tag_pair_from_expr_irtree(eval.expr, &irtree); + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, eval.exprs.last); + E_LookupRuleTagPair lookup_rule_and_tag = e_lookup_rule_tag_pair_from_expr_irtree(eval.exprs.last, &irtree); E_LookupRule *lookup_rule = lookup_rule_and_tag.rule; E_Expr *lookup_rule_tag = lookup_rule_and_tag.tag; E_LookupInfo lookup_info = lookup_rule->info(arena, &irtree, str8_zero()); @@ -9316,7 +9212,7 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul { E_Expr *expr = &e_expr_nil; String8 expr_string = {0}; - lookup_rule->range(scratch.arena, eval.expr, r1u64(idx, idx+1), &expr, &expr_string, lookup_info.user_data); + lookup_rule->range(scratch.arena, eval.exprs.last, r1u64(idx, idx+1), &expr, &expr_string, lookup_info.user_data); if(expr != &e_expr_nil) { if(!is_first) @@ -9444,8 +9340,8 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul // rjf: build contents if(depth < 4) { - E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, eval.expr); - E_LookupRuleTagPair lookup_rule_and_tag = e_lookup_rule_tag_pair_from_expr_irtree(eval.expr, &irtree); + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, eval.exprs.last); + E_LookupRuleTagPair lookup_rule_and_tag = e_lookup_rule_tag_pair_from_expr_irtree(eval.exprs.last, &irtree); E_LookupRule *lookup_rule = lookup_rule_and_tag.rule; E_Expr *lookup_rule_tag = lookup_rule_and_tag.tag; E_LookupInfo lookup_info = lookup_rule->info(arena, &irtree, str8_zero()); @@ -9455,7 +9351,7 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul { E_Expr *expr = &e_expr_nil; String8 expr_string = {0}; - lookup_rule->range(scratch.arena, eval.expr, r1u64(idx, idx+1), &expr, &expr_string, lookup_info.user_data); + lookup_rule->range(scratch.arena, eval.exprs.last, r1u64(idx, idx+1), &expr, &expr_string, lookup_info.user_data); if(expr != &e_expr_nil) { if(!is_first) @@ -9502,7 +9398,7 @@ rd_value_string_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix, { Temp scratch = scratch_begin(&arena, 1); String8List strs = {0}; - rd_append_value_strings_from_eval(scratch.arena, flags, default_radix, font, font_size, max_size, 0, eval.expr, eval, &strs); + rd_append_value_strings_from_eval(scratch.arena, flags, default_radix, font, font_size, max_size, 0, eval.exprs.last, eval, &strs); String8 result = str8_list_join(arena, &strs, 0); scratch_end(scratch); return result; @@ -12418,7 +12314,7 @@ rd_frame(void) //- rjf: add macro for 'call_stack' -> 'current_thread.callstack' { - E_Expr *expr = e_parse_expr_from_text(scratch.arena, str8_lit("current_thread.call_stack")); + E_Expr *expr = e_parse_expr_from_text(scratch.arena, str8_lit("current_thread.call_stack")).exprs.first; e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("call_stack"), expr); } @@ -12568,7 +12464,7 @@ rd_frame(void) E_Parse parse = e_parse_expr_from_text__cached(expr); if(parse.msgs.max_kind == E_MsgKind_Null) { - for(E_Expr *expr = parse.first_expr; expr != &e_expr_nil; expr = expr->next) + for(E_Expr *expr = parse.exprs.first; expr != &e_expr_nil; expr = expr->next) { e_push_leaf_ident_exprs_from_expr__in_place(scratch.arena, ctx->macro_map, expr); } @@ -14561,6 +14457,7 @@ Z(getting_started) // rjf: choose panel for source code RD_PanelNode *src_code_dst_panel = &rd_nil_panel_node; + if(file_path.size != 0) { if(src_code_dst_panel == &rd_nil_panel_node) { src_code_dst_panel = panel_w_this_src_code; } if(src_code_dst_panel == &rd_nil_panel_node) { src_code_dst_panel = panel_w_any_src_code; } @@ -14570,6 +14467,7 @@ Z(getting_started) // rjf: choose panel for disassembly RD_PanelNode *disasm_dst_panel = &rd_nil_panel_node; + if(vaddr != 0) { if(disasm_dst_panel == &rd_nil_panel_node) { disasm_dst_panel = panel_w_disasm; } if(disasm_dst_panel == &rd_nil_panel_node) { disasm_dst_panel = biggest_empty_panel; } @@ -14594,7 +14492,7 @@ Z(getting_started) // rjf: if disasm is not preferred, and we have no disassembly view // open at all, cancel disasm, so that it doesn't open if the user // doesn't want it. - if(!rd_regs()->prefer_disasm && panel_w_disasm == &rd_nil_panel_node) + if(!rd_regs()->prefer_disasm && panel_w_disasm == &rd_nil_panel_node && file_path.size != 0) { disasm_dst_panel = &rd_nil_panel_node; } @@ -14602,7 +14500,8 @@ Z(getting_started) // rjf: if disasm is not preferred, and we have no disassembly view // *selected* at all, cancel disasm, so that it doesn't open if the user // doesn't want it. - if(!rd_regs()->prefer_disasm && view_w_disasm != &rd_nil_cfg && rd_cfg_child_from_string(view_w_disasm, str8_lit("selected")) == &rd_nil_cfg) + if(!rd_regs()->prefer_disasm && view_w_disasm != &rd_nil_cfg && rd_cfg_child_from_string(view_w_disasm, str8_lit("selected")) == &rd_nil_cfg && + file_path.size != 0) { disasm_dst_panel = &rd_nil_panel_node; } @@ -15773,7 +15672,7 @@ Z(getting_started) ExprWalkTask *next; E_Expr *expr; }; - E_Expr *expr = e_parse_expr_from_text(scratch.arena, src_bp_cnd); + E_Expr *expr = e_parse_expr_from_text(scratch.arena, src_bp_cnd).exprs.last; ExprWalkTask start_task = {0, expr}; ExprWalkTask *first_task = &start_task; for(ExprWalkTask *t = first_task; t != 0; t = t->next) diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index f35a941c..ffe25121 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -1036,14 +1036,6 @@ internal Rng1U64 rd_whole_range_from_eval_space(E_Space space); //- rjf: writing values back to child processes internal B32 rd_commit_eval_value_string(E_Eval dst_eval, String8 string, B32 string_needs_unescaping); -//- rjf: eval / view rule params tree info extraction -internal E_Value rd_value_from_params_key(MD_Node *params, String8 key); -internal Rng1U64 rd_range_from_eval_params(E_Eval eval, MD_Node *params); -internal TXT_LangKind rd_lang_kind_from_eval_params(E_Eval eval, MD_Node *params); -internal Arch rd_arch_from_eval_params(E_Eval eval, MD_Node *params); -internal Vec2S32 rd_dim2s32_from_eval_params(E_Eval eval, MD_Node *params); -internal R_Tex2DFormat rd_tex2dformat_from_eval_params(E_Eval eval, MD_Node *params); - //- rjf: eval <-> file path internal String8 rd_file_path_from_eval_string(Arena *arena, String8 string); internal String8 rd_eval_string_from_file_path(Arena *arena, String8 string); diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 53fad55d..3cb30460 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -1108,7 +1108,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) } // rjf: for 'add-new' rows in meta-cfg evaluation spaces, only do expr - else if(info.eval.space.kind == E_SpaceKind_Null && info.group_cfg_parent != &rd_nil_cfg) + else if(info.eval.exprs.last == &e_expr_nil && info.group_cfg_name.size != 0) { rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Expr, .pct = 1.f); } @@ -1269,7 +1269,7 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla E_Expr *root_expr = row->expr; if(wrap_string.size != 0) { - E_Expr *wrap_expr = e_parse_expr_from_text(scratch.arena, wrap_string); + E_Expr *wrap_expr = e_parse_expr_from_text(scratch.arena, wrap_string).exprs.last; root_expr = wrap_expr; typedef struct Task Task; struct Task @@ -1308,8 +1308,23 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla //- rjf: evaluate wrapped expression result.eval = (cell->eval.mode != E_Mode_Null ? cell->eval : e_eval_from_expr(arena, root_expr)); - result.string = rd_value_string_from_eval(arena, string_flags, 10, font, font_size, max_size_px, result.eval); + + //- rjf: determine default radix + U32 default_radix = 10; + if(result.eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity && + rd_ctrl_entity_from_eval_space(result.eval.space)->kind == CTRL_EntityKind_Module) + { + default_radix = 16; + } + + //- rjf: generate strings/flags based on that expression & fill + result.string = rd_value_string_from_eval(arena, string_flags, default_radix, font, font_size, max_size_px, result.eval); result.flags |= !!(ev_type_key_is_editable(result.eval.type_key) && result.eval.mode == E_Mode_Offset) * RD_WatchCellFlag_CanEdit; + E_Type *type = e_type_from_key__cached(result.eval.type_key); + if(type->flags & (E_TypeFlag_IsPlainText|E_TypeFlag_IsPathText)) + { + result.flags |= RD_WatchCellFlag_IsNonCode; + } scratch_end(scratch); }break; @@ -2061,22 +2076,22 @@ RD_VIEW_UI_FUNCTION_DEF(watch) if(cfg != &rd_nil_cfg) { rd_cfg_list_push(scratch.arena, &cfgs_to_remove, cfg); - U64 deleted_num = ev_num_from_key(&block_ranges, row->key); + U64 deleted_num = row->block->lookup_rule->num_from_id(row->key.child_id, row->block->lookup_rule_user_data); if(deleted_num != 0) { EV_Key parent_key = row->block->parent->key; EV_Key key = row->block->key; - EV_Key fallback_key_prev = ev_key_from_num(&block_ranges, deleted_num-1); - EV_Key fallback_key_next = ev_key_from_num(&block_ranges, deleted_num+1); - if(fallback_key_next.child_id != 0) + U64 fallback_id_prev = row->block->lookup_rule->id_from_num(deleted_num-1, row->block->lookup_rule_user_data); + U64 fallback_id_next = row->block->lookup_rule->id_from_num(deleted_num+1, row->block->lookup_rule_user_data); + if(fallback_id_next != 0) { parent_key = row->block->key; - key = fallback_key_next; + key = ev_key_make(row->key.parent_hash, fallback_id_next); } - else if(fallback_key_prev.child_id != 0) + else if(fallback_id_prev != 0) { parent_key = row->block->key; - key = fallback_key_prev; + key = ev_key_make(row->key.parent_hash, fallback_id_prev); } RD_WatchPt new_pt = {parent_key, key, pt.cell_id}; next_cursor_pt = new_pt; @@ -2694,16 +2709,6 @@ RD_VIEW_UI_FUNCTION_DEF(watch) { row_flags |= UI_BoxFlag_DrawSideTop; } -#if 0 // TODO(rjf): @cfg - switch(row_kind) - { - default:{}break; - case RD_WatchViewRowKind_Normal:{row_flags |= UI_BoxFlag_DisableFocusOverlay;}break; - case RD_WatchViewRowKind_Header:{row_flags |= UI_BoxFlag_DrawSideBottom|UI_BoxFlag_DisableFocusOverlay;}break; - case RD_WatchViewRowKind_Canvas:{row_flags |= UI_BoxFlag_Clip|UI_BoxFlag_DrawBorder;}break; - case RD_WatchViewRowKind_PrettyEntityControls:{row_flags |= UI_BoxFlag_DisableFocusOverlay;}break; - } -#endif } ProfEnd(); @@ -2871,7 +2876,7 @@ RD_VIEW_UI_FUNCTION_DEF(watch) RD_Cfg *root = rd_immediate_cfg_from_keyf("view_%I64x_%I64x", rd_regs()->view, row_hash); RD_Cfg *view = rd_cfg_child_from_string_or_alloc(root, cell_info.view_ui_rule->name); RD_Cfg *expr = rd_cfg_child_from_string_or_alloc(view, str8_lit("expression")); - rd_cfg_new(expr, e_string_from_expr(scratch.arena, cell_info.eval.expr)); + rd_cfg_new(expr, e_string_from_expr(scratch.arena, cell_info.eval.exprs.last)); rd_cfg_new(view, str8_lit("selected")); RD_RegsScope(.view = view->id) UI_PermissionFlags(UI_PermissionFlag_Clicks|UI_PermissionFlag_ScrollX) @@ -2945,10 +2950,15 @@ RD_VIEW_UI_FUNCTION_DEF(watch) { B32 is_non_code = !!(cell_info.flags & RD_WatchCellFlag_IsNonCode); String8 ghost_text = {0}; - if(cell->kind == RD_WatchCellKind_Tag && cell_info.string.size == 0 && global_row_idx == 0) + if(cell->kind == RD_WatchCellKind_Expr && cell_info.string.size == 0) + { + ghost_text = str8_lit("Expression"); + is_non_code = !cell_selected || !ewv->text_editing; + } + else if(cell->kind == RD_WatchCellKind_Tag && cell_info.string.size == 0 && global_row_idx == 0) { ghost_text = str8_lit("View Rules"); - is_non_code = !ui_is_focus_active(); + is_non_code = !cell_selected || !ewv->text_editing; } RD_Font(is_non_code ? RD_FontSlot_Main : RD_FontSlot_Code) { @@ -3111,7 +3121,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.last_expr); + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, parse.exprs.last); 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:"); @@ -3133,7 +3143,7 @@ RD_VIEW_UI_FUNCTION_DEF(watch) E_Expr *expr; S64 depth; }; - Task start_task = {0, 0, parse.last_expr}; + Task start_task = {0, 0, parse.exprs.last}; Task *first_task = &start_task; Task *last_task = first_task; for(Task *t = first_task; t != 0; t = t->next) @@ -3562,7 +3572,7 @@ RD_VIEW_UI_FUNCTION_DEF(disasm) // B32 auto_selected = 0; E_Space auto_space = {0}; - if(eval.expr == &e_expr_nil) + if(eval.exprs.last == &e_expr_nil) { if(dv->temp_look_vaddr != 0 && dv->temp_look_run_gen == ctrl_run_gen()) {