diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index cdcf9b1d..1fec0f3e 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -499,6 +499,7 @@ ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval root U64 split_relative_idx; B32 default_expanded; B32 force_expanded; + S32 depth; }; BlockTreeBuildTask start_task = {0, tree.root, tree.root->eval, tree.root->eval.expr->next, 1, 0}; BlockTreeBuildTask *first_task = &start_task; @@ -543,9 +544,12 @@ ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval root continue; } + // rjf: get filter for this task + String8 task_filter = t->depth == 0 ? filter : str8_zero(); + // rjf: get top-level lookup/expansion info - E_TypeExpandInfo type_expand_info = type_expand_rule->info(arena, eval, filter); - EV_ExpandInfo viz_expand_info = viz_expand_rule->info(arena, view, filter, eval.expr); + E_TypeExpandInfo type_expand_info = type_expand_rule->info(arena, eval, task_filter); + EV_ExpandInfo viz_expand_info = viz_expand_rule->info(arena, view, task_filter, eval.expr); // rjf: determine expansion info U64 expansion_row_count = type_expand_info.expr_count; @@ -573,6 +577,7 @@ ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval root expansion_block->key = key; expansion_block->split_relative_idx = t->split_relative_idx; expansion_block->eval = eval; + expansion_block->filter = task_filter; expansion_block->type_expand_info = type_expand_info; expansion_block->type_expand_rule = type_expand_rule; expansion_block->viz_expand_info = viz_expand_info; @@ -659,7 +664,7 @@ ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval root { Rng1U64 child_range = r1u64(split_relative_idx, split_relative_idx+1); E_Eval child_eval = {0}; - type_expand_rule->range(arena, type_expand_info.user_data, eval, filter, r1u64(split_relative_idx, split_relative_idx+1), &child_eval); + type_expand_rule->range(arena, type_expand_info.user_data, eval, task_filter, r1u64(split_relative_idx, split_relative_idx+1), &child_eval); EV_Key child_key = child_keys[idx]; BlockTreeBuildTask *task = push_array(scratch.arena, BlockTreeBuildTask, 1); SLLQueuePush(first_task, last_task, task); @@ -669,6 +674,7 @@ ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval root task->child_id = child_key.child_id; task->split_relative_idx = split_relative_idx; task->default_expanded = viz_expand_info.rows_default_expanded; + task->depth = t->depth+1; } } @@ -685,6 +691,7 @@ ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval root task->split_relative_idx = 0; task->default_expanded = t->default_expanded; task->force_expanded = 1; + task->depth = t->depth; } } scratch_end(scratch); @@ -907,7 +914,7 @@ ev_num_from_vnum(EV_BlockRangeList *block_ranges, U64 vnum) //~ rjf: Row Building 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) +ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, EV_BlockRangeList *block_ranges, Rng1U64 vnum_range) { EV_WindowedRowList rows = {0}; { @@ -918,6 +925,7 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 Rng1U64 block_relative_range = n->v.range; U64 block_num_visual_rows = dim_1u64(block_relative_range); Rng1U64 block_global_range = r1u64(base_vnum, base_vnum + block_num_visual_rows); + String8 block_filter = n->v.block->filter; // rjf: get skip/chop of global range U64 num_skipped = 0; @@ -974,7 +982,7 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 } else { - n->v.block->type_expand_rule->range(arena, n->v.block->type_expand_info.user_data, n->v.block->eval, filter, block_relative_range__windowed, range_evals); + n->v.block->type_expand_rule->range(arena, n->v.block->type_expand_info.user_data, n->v.block->eval, block_filter, block_relative_range__windowed, range_evals); } // rjf: no expansion operator applied -> push row for block expression; pass through block info @@ -1017,10 +1025,10 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 } internal EV_Row * -ev_row_from_num(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList *block_ranges, U64 num) +ev_row_from_num(Arena *arena, EV_View *view, EV_BlockRangeList *block_ranges, U64 num) { U64 vidx = ev_vnum_from_num(block_ranges, num); - EV_WindowedRowList rows = ev_windowed_row_list_from_block_range_list(arena, view, filter, block_ranges, r1u64(vidx, vidx+1)); + EV_WindowedRowList rows = ev_windowed_row_list_from_block_range_list(arena, view, block_ranges, r1u64(vidx, vidx+1)); EV_Row *result = 0; if(rows.first != 0) { @@ -1036,10 +1044,10 @@ ev_row_from_num(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList * } internal EV_WindowedRowList -ev_rows_from_num_range(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList *block_ranges, Rng1U64 num_range) +ev_rows_from_num_range(Arena *arena, EV_View *view, EV_BlockRangeList *block_ranges, Rng1U64 num_range) { Rng1U64 vnum_range = r1u64(ev_vnum_from_num(block_ranges, num_range.min), ev_vnum_from_num(block_ranges, num_range.max)+1); - EV_WindowedRowList rows = ev_windowed_row_list_from_block_range_list(arena, view, filter, block_ranges, vnum_range); + EV_WindowedRowList rows = ev_windowed_row_list_from_block_range_list(arena, view, block_ranges, vnum_range); return rows; } diff --git a/src/eval_visualization/eval_visualization_core.h b/src/eval_visualization/eval_visualization_core.h index dcca9cb6..5f5a8d9d 100644 --- a/src/eval_visualization/eval_visualization_core.h +++ b/src/eval_visualization/eval_visualization_core.h @@ -149,6 +149,7 @@ struct EV_Block // rjf: evaluation info String8 string; E_Eval eval; + String8 filter; E_TypeExpandInfo type_expand_info; E_TypeExpandRule *type_expand_rule; EV_ExpandInfo viz_expand_info; @@ -291,6 +292,7 @@ global read_only EV_Block ev_nil_block = {0}, {{0}, {0}, {0}, &e_expr_nil, &e_irnode_nil}, {0}, + {0}, &e_type_expand_rule__default, {0}, &ev_nil_expand_rule, @@ -358,9 +360,9 @@ internal U64 ev_num_from_vnum(EV_BlockRangeList *block_ranges, U64 vidx); //////////////////////////////// //~ rjf: Row Building -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 EV_WindowedRowList ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, EV_BlockRangeList *block_ranges, Rng1U64 vnum_range); +internal EV_Row *ev_row_from_num(Arena *arena, EV_View *view, EV_BlockRangeList *block_ranges, U64 num); +internal EV_WindowedRowList ev_rows_from_num_range(Arena *arena, EV_View *view, 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 c081cd3f..6f4c8235 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -3111,7 +3111,7 @@ rd_view_ui(Rng2F32 rect) // rjf: compute legal coordinate range, given selection-defining row Rng1S64 cursor_x_range = {0}; { - EV_Row *row = ev_row_from_num(scratch.arena, eval_view, filter, &block_ranges, mark_tbl.y); + EV_Row *row = ev_row_from_num(scratch.arena, eval_view, &block_ranges, mark_tbl.y); RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row); cursor_x_range = r1s64(0, (S64)row_info.cells.count-1); } @@ -3206,13 +3206,13 @@ rd_view_ui(Rng2F32 rect) EV_Row *row = 0; if(selection_tbl.min.y == 0 && selection_tbl.max.y == 0) { - row = ev_row_from_num(scratch.arena, eval_view, filter, &block_ranges, 1); + row = ev_row_from_num(scratch.arena, eval_view, &block_ranges, 1); } // rjf: if we do have a selection, compute that row else { - row = ev_row_from_num(scratch.arena, eval_view, filter, &block_ranges, selection_tbl.min.y); + row = ev_row_from_num(scratch.arena, eval_view, &block_ranges, selection_tbl.min.y); } // rjf: use row to complete query @@ -3417,7 +3417,7 @@ rd_view_ui(Rng2F32 rect) ewv->text_edit_state_slots_count = u64_up_to_pow2(selection_dim.y+1); ewv->text_edit_state_slots_count = Max(ewv->text_edit_state_slots_count, 64); ewv->text_edit_state_slots = push_array(ewv->text_edit_arena, RD_WatchViewTextEditState*, ewv->text_edit_state_slots_count); - EV_WindowedRowList rows = ev_rows_from_num_range(scratch.arena, eval_view, filter, &block_ranges, r1u64(selection_tbl.min.y, selection_tbl.max.y+1)); + EV_WindowedRowList rows = ev_rows_from_num_range(scratch.arena, eval_view, &block_ranges, r1u64(selection_tbl.min.y, selection_tbl.max.y+1)); EV_WindowedRowNode *row_node = rows.first; B32 any_edits_started = 0; for(S64 y = selection_tbl.min.y; row_node != 0 && y <= selection_tbl.max.y; y += 1, row_node = row_node->next) @@ -3471,7 +3471,7 @@ rd_view_ui(Rng2F32 rect) (selection_tbl.min.y != 0 || selection_tbl.max.y != 0) && (selection_tbl.max.y - selection_tbl.min.y > 0)) { - EV_WindowedRowList rows = ev_rows_from_num_range(scratch.arena, eval_view, filter, &block_ranges, r1u64(selection_tbl.min.y, selection_tbl.max.y+1)); + EV_WindowedRowList rows = ev_rows_from_num_range(scratch.arena, eval_view, &block_ranges, r1u64(selection_tbl.min.y, selection_tbl.max.y+1)); EV_WindowedRowNode *row_node = rows.first; if(row_node != 0) { @@ -3546,7 +3546,7 @@ rd_view_ui(Rng2F32 rect) evt->delta_2s32.y == 0)) { taken = 1; - EV_WindowedRowList rows = ev_rows_from_num_range(scratch.arena, eval_view, filter, &block_ranges, r1u64(selection_tbl.min.y, selection_tbl.max.y+1)); + EV_WindowedRowList rows = ev_rows_from_num_range(scratch.arena, eval_view, &block_ranges, r1u64(selection_tbl.min.y, selection_tbl.max.y+1)); EV_WindowedRowNode *row_node = rows.first; for(S64 y = selection_tbl.min.y; row_node != 0 && y <= selection_tbl.max.y; y += 1, row_node = row_node->next) { @@ -3678,7 +3678,7 @@ rd_view_ui(Rng2F32 rect) { taken = 1; String8List strs = {0}; - EV_WindowedRowList rows = ev_rows_from_num_range(scratch.arena, eval_view, filter, &block_ranges, r1u64(selection_tbl.min.y, selection_tbl.max.y+1)); + EV_WindowedRowList rows = ev_rows_from_num_range(scratch.arena, eval_view, &block_ranges, r1u64(selection_tbl.min.y, selection_tbl.max.y+1)); EV_WindowedRowNode *row_node = rows.first; for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y && row_node != 0; y += 1, row_node = row_node->next) { @@ -3731,7 +3731,7 @@ rd_view_ui(Rng2F32 rect) RD_CfgList cfgs_to_remove = {0}; RD_WatchPt next_cursor_pt = {0}; B32 next_cursor_set = 0; - EV_WindowedRowList rows = ev_rows_from_num_range(scratch.arena, eval_view, filter, &block_ranges, r1u64(selection_tbl.min.y, selection_tbl.max.y+1)); + EV_WindowedRowList rows = ev_rows_from_num_range(scratch.arena, eval_view, &block_ranges, r1u64(selection_tbl.min.y, selection_tbl.max.y+1)); EV_WindowedRowNode *row_node = rows.first; for(S64 y = selection_tbl.min.y; row_node != 0 && y <= selection_tbl.max.y; y += 1, row_node = row_node->next) { @@ -4024,7 +4024,7 @@ rd_view_ui(Rng2F32 rect) rd_cfg_child_from_string(view, str8_lit("autocomplete")) != &rd_nil_cfg) { U64 row_num = ev_num_from_key(&block_ranges, ewv->cursor.key); - EV_Row *row = ev_row_from_num(scratch.arena, rd_view_eval_view(), rd_view_query_input(), &block_ranges, row_num); + EV_Row *row = ev_row_from_num(scratch.arena, rd_view_eval_view(), &block_ranges, row_num); RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row); RD_WatchCell *cell = row_info.cells.first; if(cell != 0) @@ -4083,7 +4083,7 @@ rd_view_ui(Rng2F32 rect) // EV_WindowedRowList rows = {0}; { - rows = ev_windowed_row_list_from_block_range_list(scratch.arena, eval_view, filter, &block_ranges, r1u64(visible_row_rng.min+1, visible_row_rng.max+2)); + rows = ev_windowed_row_list_from_block_range_list(scratch.arena, eval_view, &block_ranges, r1u64(visible_row_rng.min+1, visible_row_rng.max+2)); } //////////////////////// @@ -4335,7 +4335,7 @@ rd_view_ui(Rng2F32 rect) { EV_Key prev_row_key = ev_key_make(ev_hash_from_key(drag_block->key), ev_block_id_from_num(drag_block, best_prev_row_block_num)); U64 prev_row_num = ev_num_from_key(&block_ranges, prev_row_key); - EV_Row *prev_row = ev_row_from_num(scratch.arena, eval_view, filter, &block_ranges, prev_row_num); + EV_Row *prev_row = ev_row_from_num(scratch.arena, eval_view, &block_ranges, prev_row_num); RD_WatchRowInfo prev_row_info = rd_watch_row_info_from_row(scratch.arena, prev_row); drag_parent_cfg = rd_cfg_from_eval_space(drag_block->eval.space); drag_prev_cfg = prev_row_info.group_cfg_child; diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index 25e46912..84df2423 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -1154,7 +1154,29 @@ E_TYPE_ACCESS_FUNCTION_DEF(watches) E_TYPE_EXPAND_INFO_FUNCTION_DEF(watches) { - RD_WatchesAccel *accel = (RD_WatchesAccel *)eval.irtree.user_data; + RD_WatchesAccel *ext = (RD_WatchesAccel *)eval.irtree.user_data; + RD_WatchesAccel *accel = push_array(arena, RD_WatchesAccel, 1); + { + RD_CfgArray cfgs__filtered = ext->cfgs; + if(filter.size != 0) + { + Temp scratch = scratch_begin(&arena, 1); + RD_CfgList cfgs_list__filtered = {0}; + for EachIndex(idx, ext->cfgs.count) + { + RD_Cfg *watch = ext->cfgs.v[idx]; + String8 string = watch->first->string; + FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, string); + if(matches.count == matches.needle_part_count) + { + rd_cfg_list_push(scratch.arena, &cfgs_list__filtered, watch); + } + } + cfgs__filtered = rd_cfg_array_from_list(arena, &cfgs_list__filtered); + scratch_end(scratch); + } + accel->cfgs = cfgs__filtered; + } E_TypeExpandInfo result = {accel, accel->cfgs.count + 1}; return result; } diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index d8e0f2b7..f6d421e4 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -215,15 +215,14 @@ // // [ ] fix operator precedence in (u64)&foo - merge prefix-unary parsing with atom parsing loop // [ ] autocompletion lister -// [ ] "pop out" (hitting enter on visualizers should open them as tabs) // [ ] we probably want to disable pop/pull out for transient things, e.g. theme color cfgs +// (actually, just kill the tabs on load if they refer to transient things) // [ ] finish theme editing, build themes - replace code colors map with new theme stuff // // [ ] evaluate `foo.bar` symbol names??? // [ ] maybe add extra caching layer to process memory querying? we pay a pretty // heavy cost even to just read 8 bytes... // [ ] crash bug, release mode - filter globals view (try with debugging raddbg, typing `dev` in globals view) -// [ ] do not apply filters past one block layer //////////////////////////////// //~ rjf: post-0.9.16 TODO notes @@ -529,6 +528,8 @@ // "save" option in the menus. // [x] user switching // [x] project switching +// [x] do not apply filters past one block layer +// [x] "pop out" (hitting enter on visualizers should open them as tabs) //////////////////////////////// //~ rjf: Build Options diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index febbeab3..3ff060a0 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -872,7 +872,7 @@ rd_watch_pt_from_tbl(EV_BlockRangeList *block_ranges, Vec2S64 tbl) RD_WatchPt pt = zero_struct; { Temp scratch = scratch_begin(0, 0); - EV_Row *row = ev_row_from_num(scratch.arena, rd_view_eval_view(), rd_view_query_input(), block_ranges, (U64)tbl.y); + EV_Row *row = ev_row_from_num(scratch.arena, rd_view_eval_view(), block_ranges, (U64)tbl.y); RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row); { S64 x = 0; @@ -899,7 +899,7 @@ rd_tbl_from_watch_pt(EV_BlockRangeList *block_ranges, RD_WatchPt pt) { Temp scratch = scratch_begin(0, 0); U64 num = ev_num_from_key(block_ranges, pt.key); - EV_Row *row = ev_row_from_num(scratch.arena, rd_view_eval_view(), rd_view_query_input(), block_ranges, num); + EV_Row *row = ev_row_from_num(scratch.arena, rd_view_eval_view(), block_ranges, num); RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row); tbl.x = 0; {