From cb6a66b98d0606e1e4569c126bae87df09af64d6 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 14 Mar 2025 13:27:26 -0700 Subject: [PATCH] member filtering, better visualization for selection state in targets/bps/threads/etc. --- src/eval/eval_ir.c | 10 ++-- src/eval/eval_ir.h | 2 +- src/eval/eval_types.c | 51 +++++++++++++++++++ src/eval/eval_types.h | 18 +++++++ .../eval_visualization_core.c | 4 +- src/raddbg/generated/raddbg.meta.c | 2 +- src/raddbg/raddbg.mdesk | 2 +- src/raddbg/raddbg_core.c | 4 +- src/raddbg/raddbg_widgets.c | 17 +++++++ src/ui/ui_core.c | 2 +- 10 files changed, 99 insertions(+), 13 deletions(-) diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index bdb88716..3113346f 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -500,7 +500,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(slice) { if(user_data == 0) { - E_LOOKUP_RANGE_FUNCTION_NAME(default)(arena, lhs, tag, idx_range, exprs, exprs_strings, user_data); + E_LOOKUP_RANGE_FUNCTION_NAME(default)(arena, lhs, tag, filter, idx_range, exprs, exprs_strings, user_data); } else { @@ -536,7 +536,7 @@ E_LOOKUP_INFO_FUNCTION_DEF(default) direct_type_kind == E_TypeKind_Class || direct_type_kind == E_TypeKind_Union) { - E_MemberArray data_members = e_type_data_members_from_key__cached(direct_type_key); + E_MemberArray data_members = e_type_data_members_from_key_filter__cached(direct_type_key, filter); lookup_info.named_expr_count = data_members.count; } else if(direct_type_kind == E_TypeKind_Enum) @@ -550,7 +550,7 @@ E_LOOKUP_INFO_FUNCTION_DEF(default) lhs_type_kind == E_TypeKind_Class || lhs_type_kind == E_TypeKind_Union) { - E_MemberArray data_members = e_type_data_members_from_key__cached(lhs_type_key); + E_MemberArray data_members = e_type_data_members_from_key_filter__cached(lhs_type_key, filter); lookup_info.named_expr_count = data_members.count; } else if(lhs_type_kind == E_TypeKind_Enum) @@ -880,7 +880,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(default) //- rjf: struct case -> the lookup-range will return a range of members if(do_struct_range) { - E_MemberArray data_members = e_type_data_members_from_key__cached(struct_type_key); + E_MemberArray data_members = e_type_data_members_from_key_filter__cached(struct_type_key, filter); Rng1U64 legal_idx_range = r1u64(0, data_members.count); Rng1U64 read_range = intersect_1u64(legal_idx_range, idx_range); U64 read_range_count = dim_1u64(read_range); @@ -1083,7 +1083,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(only_and_omit) { if(user_data == 0) { - E_LOOKUP_RANGE_FUNCTION_NAME(default)(arena, lhs, tag, idx_range, exprs, exprs_strings, user_data); + E_LOOKUP_RANGE_FUNCTION_NAME(default)(arena, lhs, tag, filter, idx_range, exprs, exprs_strings, user_data); } else { diff --git a/src/eval/eval_ir.h b/src/eval/eval_ir.h index c2c87531..d06cb232 100644 --- a/src/eval/eval_ir.h +++ b/src/eval/eval_ir.h @@ -86,7 +86,7 @@ E_LOOKUP_INFO_FUNCTION_DEF(default); typedef E_LOOKUP_ACCESS_FUNCTION_SIG(E_LookupAccessFunctionType); E_LOOKUP_ACCESS_FUNCTION_DEF(default); -#define E_LOOKUP_RANGE_FUNCTION_SIG(name) void name(Arena *arena, E_Expr *lhs, E_Expr *tag, Rng1U64 idx_range, E_Expr **exprs, String8 *exprs_strings, void *user_data) +#define E_LOOKUP_RANGE_FUNCTION_SIG(name) void name(Arena *arena, E_Expr *lhs, E_Expr *tag, String8 filter, Rng1U64 idx_range, E_Expr **exprs, String8 *exprs_strings, void *user_data) #define E_LOOKUP_RANGE_FUNCTION_NAME(name) e_lookup_range_##name #define E_LOOKUP_RANGE_FUNCTION_DEF(name) internal E_LOOKUP_RANGE_FUNCTION_SIG(E_LOOKUP_RANGE_FUNCTION_NAME(name)) typedef E_LOOKUP_RANGE_FUNCTION_SIG(E_LookupRangeFunctionType); diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index 6a4195e0..ef07ee7f 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -1935,6 +1935,8 @@ e_member_cache_node_from_type_key(E_TypeKey key) node->members = e_type_data_members_from_key(e_type_state->arena, key); node->member_hash_slots_count = node->members.count; node->member_hash_slots = push_array(e_type_state->arena, E_MemberHashSlot, node->member_hash_slots_count); + node->member_filter_slots_count = 16; + node->member_filter_slots = push_array(e_type_state->arena, E_MemberFilterSlot, node->member_filter_slots_count); for EachIndex(idx, node->members.count) { U64 hash = e_hash_from_string(5381, node->members.v[idx].name); @@ -1947,6 +1949,55 @@ e_member_cache_node_from_type_key(E_TypeKey key) return node; } +internal E_MemberArray +e_type_data_members_from_key_filter__cached(E_TypeKey key, String8 filter) +{ + E_MemberArray members = {0}; + E_MemberCacheNode *node = e_member_cache_node_from_type_key(key); + if(node != 0) + { + if(filter.size == 0) + { + members = node->members; + } + else + { + U64 hash = e_hash_from_string(5381, filter); + U64 slot_idx = hash%node->member_filter_slots_count; + E_MemberFilterSlot *slot = &node->member_filter_slots[slot_idx]; + E_MemberFilterNode *filter_node = 0; + for(E_MemberFilterNode *n = slot->first; n != 0; n = n->next) + { + if(str8_match(n->filter, filter, 0)) + { + filter_node = n; + break; + } + } + if(filter_node == 0) + { + Temp scratch = scratch_begin(0, 0); + filter_node = push_array(e_type_state->arena, E_MemberFilterNode, 1); + filter_node->filter = push_str8_copy(e_type_state->arena, filter); + E_MemberList member_list__filtered = {0}; + for EachIndex(idx, node->members.count) + { + E_Member *member = &node->members.v[idx]; + FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, member->name); + if(matches.count == matches.needle_part_count) + { + e_member_list_push(scratch.arena, &member_list__filtered, member); + } + } + filter_node->members_filtered = e_member_array_from_list(e_type_state->arena, &member_list__filtered); + scratch_end(scratch); + } + members = filter_node->members_filtered; + } + } + return members; +} + internal E_MemberArray e_type_data_members_from_key__cached(E_TypeKey key) { diff --git a/src/eval/eval_types.h b/src/eval/eval_types.h index e59c09c4..2ca62b9f 100644 --- a/src/eval/eval_types.h +++ b/src/eval/eval_types.h @@ -234,6 +234,21 @@ struct E_MemberHashSlot E_MemberHashNode *last; }; +typedef struct E_MemberFilterNode E_MemberFilterNode; +struct E_MemberFilterNode +{ + E_MemberFilterNode *next; + String8 filter; + E_MemberArray members_filtered; +}; + +typedef struct E_MemberFilterSlot E_MemberFilterSlot; +struct E_MemberFilterSlot +{ + E_MemberFilterNode *first; + E_MemberFilterNode *last; +}; + typedef struct E_MemberCacheNode E_MemberCacheNode; struct E_MemberCacheNode { @@ -242,6 +257,8 @@ struct E_MemberCacheNode E_MemberArray members; U64 member_hash_slots_count; E_MemberHashSlot *member_hash_slots; + U64 member_filter_slots_count; + E_MemberFilterSlot *member_filter_slots; }; typedef struct E_MemberCacheSlot E_MemberCacheSlot; @@ -381,6 +398,7 @@ internal E_TypeKey e_string2typekey_map_lookup(E_String2TypeKeyMap *map, String8 internal E_Type *e_type_from_key__cached(E_TypeKey key); internal E_MemberCacheNode *e_member_cache_node_from_type_key(E_TypeKey key); +internal E_MemberArray e_type_data_members_from_key_filter__cached(E_TypeKey key, String8 filter); internal E_MemberArray e_type_data_members_from_key__cached(E_TypeKey key); internal E_Member e_type_member_from_key_name__cached(E_TypeKey key, String8 name); diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index 39dc30ba..1b2787a6 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -712,7 +712,7 @@ ev_block_tree_from_exprs(Arena *arena, EV_View *view, String8 filter, E_ExprChai Rng1U64 child_range = r1u64(split_relative_idx, split_relative_idx+1); E_Expr *child_expr = &e_expr_nil; String8 child_string = {0}; - lookup_rule->range(arena, t->expr, lookup_rule_tag, r1u64(split_relative_idx, split_relative_idx+1), &child_expr, &child_string, lookup_info.user_data); + lookup_rule->range(arena, t->expr, lookup_rule_tag, filter, r1u64(split_relative_idx, split_relative_idx+1), &child_expr, &child_string, lookup_info.user_data); if(child_expr != &e_expr_nil) { EV_Key child_key = child_keys[idx]; @@ -1003,7 +1003,7 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 } else { - n->v.block->lookup_rule->range(arena, n->v.block->expr, n->v.block->lookup_tag, block_relative_range__windowed, range_exprs, range_exprs_strings, n->v.block->lookup_rule_user_data); + n->v.block->lookup_rule->range(arena, n->v.block->expr, n->v.block->lookup_tag, filter, block_relative_range__windowed, range_exprs, range_exprs_strings, n->v.block->lookup_rule_user_data); } // rjf: no expansion operator applied -> push row for block expression; pass through block info diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 9dad2728..7ea36428 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -308,7 +308,7 @@ RD_VocabInfo rd_vocab_info_table[297] = RD_NameSchemaInfo rd_name_schema_info_table[12] = { {str8_lit_comp("settings"), str8_lit_comp("x:\n{\n @default(1) 'hover_animations': bool,\n @default(1) 'press_animations': bool,\n @default(0) 'focus_animations': bool,\n @default(1) 'tooltip_animations': bool,\n @default(1) 'menu_animations': bool,\n @default(1) 'scrolling_animations': bool,\n @default(1) 'background_blur': bool,\n @default(1) 'thread_lines': bool,\n @default(1) 'breakpoint_lines': bool,\n @default(1) 'thread_glow': bool,\n @default(1) 'breakpoint_glow': bool,\n @default(0) 'opaque_backgrounds': bool,\n @default(1) 'smooth_main_text': bool,\n @default(0) 'smooth_code_text': bool,\n @default(1) 'hint_main_text': bool,\n @default(1) 'hint_code_text': bool,\n @default(2) 'tab_width': @range[1, 32] u64,\n @can_be_per_window 'main_font_size': @range[6, 72] u64,\n @can_be_per_window 'code_font_size': @range[1, 32] u64,\n}\n")}, -{str8_lit_comp("target"), str8_lit_comp("@commands(launch_and_run, launch_and_init, select_cfg, remove_cfg)\n@collection_commands(add_target)\nx:\n{\n 'label': code_string,\n 'executable': path,\n 'arguments': string,\n 'working_directory': path,\n 'entry_point': code_string,\n 'stdout_path': path,\n 'stderr_path': path,\n 'stdin_path': path,\n 'debug_subprocesses': bool,\n 'environment': query,\n}\n")}, +{str8_lit_comp("target"), str8_lit_comp("@commands(launch_and_run, launch_and_init, enable_cfg, remove_cfg)\n@collection_commands(add_target)\nx:\n{\n 'label': code_string,\n 'executable': path,\n 'arguments': string,\n 'working_directory': path,\n 'entry_point': code_string,\n 'stdout_path': path,\n 'stderr_path': path,\n 'stdin_path': path,\n 'debug_subprocesses': bool,\n 'environment': query,\n}\n")}, {str8_lit_comp("breakpoint"), str8_lit_comp("@commands(enable_cfg, remove_cfg)\n@collection_commands(toggle_breakpoint, add_breakpoint, add_address_breakpoint, add_function_breakpoint)\nx:\n{\n 'label': code_string,\n 'condition': code_string,\n 'source_location': path_pt,\n 'address_location': code_string,\n 'hit_count': u64,\n 'disabled': bool,\n}\n")}, {str8_lit_comp("watch_pin"), str8_lit_comp("@commands(remove_cfg)\n@collection_commands(add_watch_pin)\nx:\n{\n 'expression': code_string,\n 'view_rule': code_string,\n 'source_location': path_pt,\n 'address_location': code_string,\n}\n")}, {str8_lit_comp("file_path_map"), str8_lit_comp("@collection_commands(add_file_path_map) @commands(remove_cfg) x:{'source':path, 'dest':path}")}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index f3058905..42feaf07 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -156,7 +156,7 @@ RD_VocabTable: { target, ``` - @commands(launch_and_run, launch_and_init, select_cfg, remove_cfg) + @commands(launch_and_run, launch_and_init, enable_cfg, remove_cfg) @collection_commands(add_target) x: { diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index ad93dbc0..1d386e02 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -10628,7 +10628,7 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f { E_Expr *expr = &e_expr_nil; String8 expr_string = {0}; - lookup_rule->range(scratch.arena, eval.exprs.last, lookup_rule_tag, r1u64(idx, idx+1), &expr, &expr_string, lookup_info.user_data); + lookup_rule->range(scratch.arena, eval.exprs.last, lookup_rule_tag, filter, r1u64(idx, idx+1), &expr, &expr_string, lookup_info.user_data); if(expr != &e_expr_nil) { if(!is_first) @@ -10772,7 +10772,7 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f { E_Expr *expr = &e_expr_nil; String8 expr_string = {0}; - lookup_rule->range(scratch.arena, eval.exprs.last, lookup_rule_tag, r1u64(idx, idx+1), &expr, &expr_string, lookup_info.user_data); + lookup_rule->range(scratch.arena, eval.exprs.last, lookup_rule_tag, filter, r1u64(idx, idx+1), &expr, &expr_string, lookup_info.user_data); if(expr != &e_expr_nil) { if(!is_first) diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 6c12ce3c..bad4f9ec 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -97,6 +97,12 @@ rd_title_fstrs_from_cfg(Arena *arena, RD_Cfg *cfg) B32 running_is_secondary = 0; #define start_secondary() if(!running_is_secondary){running_is_secondary = 1; params.color = rgba_secondary; params.size = ui_top_font_size()*0.95f;} + //- rjf: disabled? -> soften color + if(is_disabled) + { + params.color = rgba_secondary; + } + //- rjf: push icon if(icon_kind != RD_IconKind_Null) { @@ -430,6 +436,17 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, B32 include_e dr_fstrs_push_new(arena, &result, ¶ms, str8_lit(" ")); } + //- rjf: push selected icon, if selected thread + if(entity->kind == CTRL_EntityKind_Thread) + { + B32 is_selected = ctrl_handle_match(entity->handle, rd_base_regs()->thread); + if(is_selected) + { + dr_fstrs_push_new(arena, &result, ¶ms, rd_icon_kind_text_table[RD_IconKind_RightArrow], .font = rd_font_from_slot(RD_FontSlot_Icons), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons), .color = color); + dr_fstrs_push_new(arena, &result, ¶ms, str8_lit(" ")); + } + } + //- rjf: push containing process prefix if(entity->kind == CTRL_EntityKind_Thread || entity->kind == CTRL_EntityKind_Module) diff --git a/src/ui/ui_core.c b/src/ui/ui_core.c index 7e4ffacc..89490c01 100644 --- a/src/ui/ui_core.c +++ b/src/ui/ui_core.c @@ -3143,7 +3143,7 @@ ui_anim_(UI_Key key, UI_AnimParams *params) MemoryCopyStruct(&node->params, params); if(node->params.epsilon == 0) { - node->params.epsilon = 0.01f; + node->params.epsilon = 0.005f; } if(node->params.rate == 1) {