From 82ec25ad19f906174cd7f03336ab1f5b5dc4b421 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 15 Apr 2025 13:31:11 -0700 Subject: [PATCH] table lens --- .../eval_visualization_core.c | 42 +++++++++++-------- .../eval_visualization_core.h | 1 + src/raddbg/raddbg_core.c | 1 + src/raddbg/raddbg_views.c | 42 +++++++++++++++++++ 4 files changed, 69 insertions(+), 17 deletions(-) diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index ee581c25..c2c14195 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -1063,29 +1063,37 @@ ev_rows_from_num_range(Arena *arena, EV_View *view, String8 filter, EV_BlockRang return rows; } +internal B32 +ev_eval_is_expandable(E_Eval eval) +{ + B32 result = 0; + E_IRTreeAndType irtree = eval.irtree; + + // rjf: determine if lenses force expandability + if(!result) + { + EV_ExpandRule *expand_rule = ev_expand_rule_from_type_key(irtree.type_key); + if(expand_rule != &ev_nil_expand_rule) + { + result = 1; + } + } + + // rjf: determine if type info force expandability + if(!result) + { + result = ev_type_key_and_mode_is_expandable(irtree.type_key, irtree.mode); + } + return result; +} + internal B32 ev_row_is_expandable(EV_Row *row) { B32 result = 0; if(!ev_key_match(ev_key_root(), row->block->key)) { - E_IRTreeAndType irtree = row->eval.irtree; - - // rjf: determine if lenses force expandability - if(!result) - { - EV_ExpandRule *expand_rule = ev_expand_rule_from_type_key(irtree.type_key); - if(expand_rule != &ev_nil_expand_rule) - { - result = 1; - } - } - - // rjf: determine if type info force expandability - if(!result) - { - result = ev_type_key_and_mode_is_expandable(irtree.type_key, irtree.mode); - } + result = ev_eval_is_expandable(row->eval); } return result; } diff --git a/src/eval_visualization/eval_visualization_core.h b/src/eval_visualization/eval_visualization_core.h index 3967e505..2def910b 100644 --- a/src/eval_visualization/eval_visualization_core.h +++ b/src/eval_visualization/eval_visualization_core.h @@ -369,6 +369,7 @@ internal U64 ev_num_from_vnum(EV_BlockRangeList *block_ranges, U64 vidx); internal EV_WindowedRowList ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList *block_ranges, Rng1U64 vnum_range); internal EV_Row *ev_row_from_num(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList *block_ranges, U64 num); internal EV_WindowedRowList ev_rows_from_num_range(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList *block_ranges, Rng1U64 num_range); +internal B32 ev_eval_is_expandable(E_Eval eval); internal B32 ev_row_is_expandable(EV_Row *row); internal B32 ev_row_is_editable(EV_Row *row); diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 7c211371..40365af8 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -12330,6 +12330,7 @@ rd_frame(void) {str8_lit("range1"), 0, 0, 0, 0, 0, {0}}, {str8_lit("array"), 0, 0, 1, 0, 0, {E_TYPE_EXPAND_INFO_FUNCTION_NAME(array), E_TYPE_EXPAND_RANGE_FUNCTION_NAME(array)}}, {str8_lit("slice"), 0, 0, 1, E_TYPE_IREXT_FUNCTION_NAME(slice), E_TYPE_ACCESS_FUNCTION_NAME(slice), {E_TYPE_EXPAND_INFO_FUNCTION_NAME(slice), E_TYPE_EXPAND_RANGE_FUNCTION_NAME(slice)}}, + {str8_lit("table"), 0, 0, 0, 0, 0, {0}}, {str8_lit("text"), 0, 0, 0, 0, 0, {0}, RD_VIEW_UI_FUNCTION_NAME(text), EV_EXPAND_RULE_INFO_FUNCTION_NAME(text)}, {str8_lit("disasm"), 0, 0, 0, 0, 0, {0}, RD_VIEW_UI_FUNCTION_NAME(disasm), EV_EXPAND_RULE_INFO_FUNCTION_NAME(disasm)}, {str8_lit("memory"), 0, 0, 0, 0, 0, {0}, RD_VIEW_UI_FUNCTION_NAME(memory), EV_EXPAND_RULE_INFO_FUNCTION_NAME(memory)}, diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 90bfa3fa..33951338 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -1053,10 +1053,52 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) // rjf: determine view ui rule info.view_ui_rule = rd_view_ui_rule_from_string(row->block->viz_expand_rule->string); + // rjf: find possible table type + E_Type *maybe_table_type = block_type; + for(;;) + { + if(maybe_table_type->kind == E_TypeKind_Lens && + str8_match(maybe_table_type->name, str8_lit("table"), 0)) + { + break; + } + else if(maybe_table_type->kind == E_TypeKind_Lens) + { + maybe_table_type = e_type_from_key__cached(maybe_table_type->direct_type_key); + continue; + } + else + { + break; + } + } + // rjf: fill row's cells { if(0){} + // rjf: table rows + else if(maybe_table_type->kind == E_TypeKind_Lens && str8_match(maybe_table_type->name, str8_lit("table"), 0) && maybe_table_type->count >= 1) + { + U64 column_count = maybe_table_type->count; + info.cell_style_key = push_str8f(arena, "table_%I64u_cols", column_count); + RD_Cfg *view = rd_cfg_from_id(rd_regs()->view); + RD_Cfg *style = rd_cfg_child_from_string(view, info.cell_style_key); + RD_Cfg *w_cfg = style->first; + F32 next_pct = 0; +#define take_pct() (next_pct = (F32)f64_from_str8(w_cfg->string), w_cfg = w_cfg->next, next_pct) + E_IRTreeAndType *prev_overridden_irtree = e_ir_state->overridden_irtree; + e_ir_state->overridden_irtree = &row->eval.irtree; + for(U64 idx = 0; idx < maybe_table_type->count; idx += 1) + { + E_Eval cell_eval = e_eval_from_expr(arena, maybe_table_type->args[idx]); + rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .eval = cell_eval, .default_pct = 1.f/maybe_table_type->count, .pct = take_pct()); + } + e_ir_state->overridden_irtree = prev_overridden_irtree; + info.can_expand = 0; +#undef take_pct + } + // rjf: folder / file rows else if(row->eval.space.kind == E_SpaceKind_FileSystem) {