diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 298bde4f..c43d2951 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -33,7 +33,7 @@ struct CTRL_MetaEvalFrameArray U64 count; CTRL_MetaEvalFrame *v; }; -ptr_type(CTRL_MetaEvalFrameArray__v_ptr_type, type(CTRL_MetaEvalFrame), .count_delimiter_name = str8_lit_comp("count")); +ptr_type(CTRL_MetaEvalFrameArray__v_ptr_type, &CTRL_MetaEvalFrame__vaddr_type, .count_delimiter_name = str8_lit_comp("count")); struct_members(CTRL_MetaEvalFrameArray) { member_lit_comp(CTRL_MetaEvalFrameArray, type(U64), count), diff --git a/src/eval_visualization/eval_visualization_builtin_view_rules.c b/src/eval_visualization/eval_visualization_builtin_view_rules.c index 45dffa09..b3a3eb21 100644 --- a/src/eval_visualization/eval_visualization_builtin_view_rules.c +++ b/src/eval_visualization/eval_visualization_builtin_view_rules.c @@ -423,8 +423,16 @@ EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(only) } } E_MemberArray new_members_array = e_member_array_from_list(scratch.arena, &new_members); - String8 struct_name = e_type_string_from_key(scratch.arena, irtree.type_key); - E_TypeKey new_type = e_type_key_cons(.kind = E_TypeKind_Struct, .name = struct_name, .members = new_members_array.v, .count = new_members_array.count); + E_TypeKey new_type = {0}; + if(new_members_array.count == 1 && new_members_array.v[0].off == 0) + { + new_type = new_members_array.v[0].type_key; + } + else + { + String8 struct_name = e_type_string_from_key(scratch.arena, irtree.type_key); + new_type = e_type_key_cons(.kind = E_TypeKind_Struct, .name = struct_name, .members = new_members_array.v, .count = new_members_array.count); + } expr = e_expr_ref_addr(arena, expr); expr = e_expr_ref_cast(arena, e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, new_type, 0), expr); expr = e_expr_ref_deref(arena, expr); @@ -462,8 +470,16 @@ EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(omit) } } E_MemberArray new_members_array = e_member_array_from_list(scratch.arena, &new_members); - String8 struct_name = e_type_string_from_key(scratch.arena, irtree.type_key); - E_TypeKey new_type = e_type_key_cons(.kind = E_TypeKind_Struct, .name = struct_name, .members = new_members_array.v, .count = new_members_array.count); + E_TypeKey new_type = {0}; + if(new_members_array.count == 1 && new_members_array.v[0].off == 0) + { + new_type = new_members_array.v[0].type_key; + } + else + { + String8 struct_name = e_type_string_from_key(scratch.arena, irtree.type_key); + new_type = e_type_key_cons(.kind = E_TypeKind_Struct, .name = struct_name, .members = new_members_array.v, .count = new_members_array.count); + } expr = e_expr_ref_addr(arena, expr); expr = e_expr_ref_cast(arena, e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, new_type, 0), expr); expr = e_expr_ref_deref(arena, expr); diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index d0b4ecca..e3a3f0ab 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -527,7 +527,7 @@ internal void ev_block_end(EV_BlockList *list, EV_Block *block) { EV_BlockNode *n = CastFromMember(EV_BlockNode, v, block); - SLLQueuePush(list->first, list->last, n); + DLLPushBack(list->first, list->last, n); list->count += 1; list->total_visual_row_count += dim_1u64(block->visual_idx_range); list->total_semantic_row_count += dim_1u64(block->semantic_idx_range); @@ -563,7 +563,8 @@ ev_append_expr_blocks__rec(Arena *arena, EV_View *view, String8 filter, EV_Key p //- rjf: do view rule children block generation, if we have an applicable view rule if(parent_is_expanded && block_prod_view_rule_info != &ev_nil_view_rule_info) { - block_prod_view_rule_info->block_prod(arena, view, filter, parent_key, key, node, string, expr, view_rules, block_prod_view_rule_params, depth+1, list_out); + E_Expr *expr_resolved = ev_expr_from_expr_view_rules(arena, expr, view_rules); + block_prod_view_rule_info->block_prod(arena, view, filter, parent_key, key, node, string, expr_resolved, view_rules, block_prod_view_rule_params, depth+1, list_out); } scratch_end(scratch); @@ -639,7 +640,7 @@ ev_block_list_from_view_expr_keys(Arena *arena, EV_View *view, String8 filter, E } //- rjf: push expansions for root - ev_append_expr_blocks__rec(arena, view, filter, parent_key, key, expr, expr_resolved, view_rule_list, depth, &blocks); + ev_append_expr_blocks__rec(arena, view, filter, parent_key, key, expr, parse.expr, view_rule_list, depth, &blocks); } ProfEnd(); return blocks; @@ -1094,19 +1095,37 @@ internal String8 ev_expr_string_from_row(Arena *arena, EV_Row *row) { String8 result = row->string; - if(result.size == 0) switch(row->expr->kind) + E_Expr *notable_expr = row->expr; + for(B32 good = 0; !good;) + { + switch(notable_expr->kind) + { + default:{good = 1;}break; + case E_ExprKind_Address: + case E_ExprKind_Deref: + case E_ExprKind_Cast: + { + notable_expr = notable_expr->last; + }break; + case E_ExprKind_Ref: + { + notable_expr = notable_expr->ref; + }break; + } + } + if(result.size == 0) switch(notable_expr->kind) { default: { - result = e_string_from_expr(arena, row->expr); + result = e_string_from_expr(arena, notable_expr); }break; case E_ExprKind_ArrayIndex: { - result = push_str8f(arena, "[%S]", e_string_from_expr(arena, row->expr->last)); + result = push_str8f(arena, "[%S]", e_string_from_expr(arena, notable_expr->last)); }break; case E_ExprKind_MemberAccess: { - result = push_str8f(arena, ".%S", e_string_from_expr(arena, row->expr->last)); + result = push_str8f(arena, ".%S", e_string_from_expr(arena, notable_expr->last)); }break; } return result; diff --git a/src/eval_visualization/eval_visualization_core.h b/src/eval_visualization/eval_visualization_core.h index dc6ff24c..789e3512 100644 --- a/src/eval_visualization/eval_visualization_core.h +++ b/src/eval_visualization/eval_visualization_core.h @@ -109,7 +109,7 @@ typedef enum EV_BlockKind EV_BlockKind_EnumMembers, // members of enum EV_BlockKind_Elements, // elements of array EV_BlockKind_Canvas, // escape hatch for arbitrary UI - EV_BlockKind_DebugInfoTable, // block of filtered debug info table elements + EV_BlockKind_DebugInfoTable, // block of filtered debug info table elements EV_BlockKind_COUNT, } EV_BlockKind; @@ -143,6 +143,7 @@ typedef struct EV_BlockNode EV_BlockNode; struct EV_BlockNode { EV_BlockNode *next; + EV_BlockNode *prev; EV_Block v; }; @@ -172,7 +173,7 @@ struct EV_BlockArray #define EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(name) ev_view_rule_expr_resolution__##name #define EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_SIG(EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(name)) #define EV_VIEW_RULE_BLOCK_PROD_FUNCTION_SIG(name) void name(Arena *arena, \ -EV_View *view, \ +EV_View *view, \ String8 filter, \ EV_Key parent_key, \ EV_Key key, \ diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index a2d7f30a..08b40512 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -7877,14 +7877,14 @@ EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(rd_collection_block_prod) { Temp scratch = scratch_begin(&arena, 1); RD_EntityList watches = rd_query_cached_entity_list_with_kind(RD_EntityKind_Watch); - EV_ViewRuleList top_level_view_rules = {0}; + EV_ViewRuleList *view_rules_inherited = ev_view_rule_list_from_inheritance(arena, view_rules); for(RD_EntityNode *n = watches.first; n != 0; n = n->next) { RD_Entity *entity = n->entity; String8 entity_expr_string = entity->string; EV_Key entity_parent_key = rd_parent_ev_key_from_entity(entity); EV_Key entity_key = rd_ev_key_from_entity(entity); - EV_BlockList blocks = ev_block_list_from_view_expr_keys(arena, view, filter, &top_level_view_rules, entity_expr_string, entity_parent_key, entity_key, depth); + EV_BlockList blocks = ev_block_list_from_view_expr_keys(arena, view, filter, view_rules_inherited, entity_expr_string, entity_parent_key, entity_key, depth); FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, entity_expr_string); if(blocks.total_semantic_row_count > 1 || matches.count == matches.needle_part_count) { @@ -7901,18 +7901,14 @@ EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(rd_collection_block_prod) { Temp scratch = scratch_begin(&arena, 1); RD_EntityList targets = rd_query_cached_entity_list_with_kind(RD_EntityKind_Target); - EV_ViewRuleList top_level_view_rules = {0}; - EV_Key addnew_key = ev_key_make(ev_hash_from_key(key), 1); - EV_Block *addnew_block = ev_block_begin(arena, EV_BlockKind_Canvas, key, addnew_key, depth); - addnew_block->visual_idx_range = addnew_block->semantic_idx_range = r1u64(0, 1); - ev_block_end(out, addnew_block); + EV_ViewRuleList *view_rules_inherited = ev_view_rule_list_from_inheritance(arena, view_rules); for(RD_EntityNode *n = targets.first; n != 0; n = n->next) { RD_Entity *target = n->entity; String8 target_expr_string = push_str8f(arena, "$%I64u", target->id); EV_Key target_parent_key = key; EV_Key target_key = ev_key_make(ev_hash_from_key(target_parent_key), target->id); - EV_BlockList blocks = ev_block_list_from_view_expr_keys(arena, view, str8_zero(), &top_level_view_rules, target_expr_string, target_parent_key, target_key, depth); + EV_BlockList blocks = ev_block_list_from_view_expr_keys(arena, view, str8_zero(), view_rules_inherited, target_expr_string, target_parent_key, target_key, depth); ev_block_list_concat__in_place(out, &blocks); } scratch_end(scratch); @@ -7925,14 +7921,14 @@ EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(rd_collection_block_prod) { Temp scratch = scratch_begin(&arena, 1); RD_EntityList bps = rd_query_cached_entity_list_with_kind(RD_EntityKind_Breakpoint); - EV_ViewRuleList top_level_view_rules = {0}; + EV_ViewRuleList *view_rules_inherited = ev_view_rule_list_from_inheritance(arena, view_rules); for(RD_EntityNode *n = bps.first; n != 0; n = n->next) { RD_Entity *bp = n->entity; String8 bp_expr_string = push_str8f(arena, "$%I64u", bp->id); EV_Key bp_parent_key = key; EV_Key bp_key = ev_key_make(ev_hash_from_key(bp_parent_key), bp->id); - EV_BlockList blocks = ev_block_list_from_view_expr_keys(arena, view, str8_zero(), &top_level_view_rules, bp_expr_string, bp_parent_key, bp_key, depth); + EV_BlockList blocks = ev_block_list_from_view_expr_keys(arena, view, str8_zero(), view_rules_inherited, bp_expr_string, bp_parent_key, bp_key, depth); ev_block_list_concat__in_place(out, &blocks); } scratch_end(scratch); @@ -7945,14 +7941,14 @@ EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(rd_collection_block_prod) { Temp scratch = scratch_begin(&arena, 1); RD_EntityList wps = rd_query_cached_entity_list_with_kind(RD_EntityKind_WatchPin); - EV_ViewRuleList top_level_view_rules = {0}; + EV_ViewRuleList *view_rules_inherited = ev_view_rule_list_from_inheritance(arena, view_rules); for(RD_EntityNode *n = wps.first; n != 0; n = n->next) { RD_Entity *wp = n->entity; String8 wp_expr_string = push_str8f(arena, "$%I64u", wp->id); EV_Key wp_parent_key = key; EV_Key wp_key = ev_key_make(ev_hash_from_key(wp_parent_key), wp->id); - EV_BlockList blocks = ev_block_list_from_view_expr_keys(arena, view, str8_zero(), &top_level_view_rules, wp_expr_string, wp_parent_key, wp_key, depth); + EV_BlockList blocks = ev_block_list_from_view_expr_keys(arena, view, str8_zero(), view_rules_inherited, wp_expr_string, wp_parent_key, wp_key, depth); ev_block_list_concat__in_place(out, &blocks); } scratch_end(scratch); @@ -7965,14 +7961,14 @@ EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(rd_collection_block_prod) { Temp scratch = scratch_begin(&arena, 1); CTRL_EntityList entities = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Thread); - EV_ViewRuleList top_level_view_rules = {0}; + EV_ViewRuleList *view_rules_inherited = ev_view_rule_list_from_inheritance(arena, view_rules); for(CTRL_EntityNode *n = entities.first; n != 0; n = n->next) { CTRL_Entity *entity = n->v; String8 entity_expr_string = push_str8f(arena, "$_%I64x_%I64x", entity->handle.machine_id, entity->handle.dmn_handle.u64[0]); EV_Key entity_parent_key = key; EV_Key entity_key = ev_key_make(ev_hash_from_key(entity_parent_key), d_hash_from_string(entity_expr_string)); - EV_BlockList blocks = ev_block_list_from_view_expr_keys(arena, view, str8_zero(), &top_level_view_rules, entity_expr_string, entity_parent_key, entity_key, depth); + EV_BlockList blocks = ev_block_list_from_view_expr_keys(arena, view, str8_zero(), view_rules_inherited, entity_expr_string, entity_parent_key, entity_key, depth); ev_block_list_concat__in_place(out, &blocks); } scratch_end(scratch); @@ -7985,14 +7981,14 @@ EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(rd_collection_block_prod) { Temp scratch = scratch_begin(&arena, 1); CTRL_EntityList entities = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Module); - EV_ViewRuleList top_level_view_rules = {0}; + EV_ViewRuleList *view_rules_inherited = ev_view_rule_list_from_inheritance(arena, view_rules); for(CTRL_EntityNode *n = entities.first; n != 0; n = n->next) { CTRL_Entity *entity = n->v; String8 entity_expr_string = push_str8f(arena, "$_%I64x_%I64x", entity->handle.machine_id, entity->handle.dmn_handle.u64[0]); EV_Key entity_parent_key = key; EV_Key entity_key = ev_key_make(ev_hash_from_key(entity_parent_key), d_hash_from_string(entity_expr_string)); - EV_BlockList blocks = ev_block_list_from_view_expr_keys(arena, view, str8_zero(), &top_level_view_rules, entity_expr_string, entity_parent_key, entity_key, depth); + EV_BlockList blocks = ev_block_list_from_view_expr_keys(arena, view, str8_zero(), view_rules_inherited, entity_expr_string, entity_parent_key, entity_key, depth); ev_block_list_concat__in_place(out, &blocks); } scratch_end(scratch); @@ -8006,7 +8002,7 @@ EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(rd_collection_block_prod) Temp scratch = scratch_begin(&arena, 1); E_String2NumMapNodeArray nodes = e_string2num_map_node_array_from_map(scratch.arena, e_parse_ctx->locals_map); e_string2num_map_node_array_sort__in_place(&nodes); - EV_ViewRuleList top_level_view_rules = {0}; + EV_ViewRuleList *view_rules_inherited = ev_view_rule_list_from_inheritance(arena, view_rules); for(U64 idx = 0; idx < nodes.count; idx += 1) { E_String2NumMapNode *n = nodes.v[idx]; @@ -8016,7 +8012,7 @@ EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(rd_collection_block_prod) { EV_Key local_parent_key = key; EV_Key local_key = ev_key_make(ev_hash_from_key(local_parent_key), idx+1); - EV_BlockList root_blocks = ev_block_list_from_view_expr_keys(arena, view, str8_zero(), &top_level_view_rules, root_expr_string, local_parent_key, local_key, depth); + EV_BlockList root_blocks = ev_block_list_from_view_expr_keys(arena, view, str8_zero(), view_rules_inherited, root_expr_string, local_parent_key, local_key, depth); ev_block_list_concat__in_place(out, &root_blocks); } } @@ -8036,8 +8032,8 @@ EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(rd_collection_block_prod) U64 alias_count = regs_alias_code_count_from_arch(arch); String8 *alias_strings = regs_alias_code_string_table_from_arch(arch); U64 num = 1; - EV_ViewRuleList top_level_view_rules = {0}; - ev_view_rule_list_push_string(arena, &top_level_view_rules, str8_lit("hex")); + EV_ViewRuleList *view_rules_inherited = ev_view_rule_list_from_inheritance(arena, view_rules); + ev_view_rule_list_push_string(arena, view_rules_inherited, str8_lit("hex")); for(U64 reg_idx = 1; reg_idx < reg_count; reg_idx += 1, num += 1) { String8 root_expr_string = push_str8f(arena, "reg:%S", reg_strings[reg_idx]); @@ -8046,7 +8042,7 @@ EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(rd_collection_block_prod) { EV_Key reg_parent_key = key; EV_Key reg_key = ev_key_make(ev_hash_from_key(reg_parent_key), num); - EV_BlockList root_blocks = ev_block_list_from_view_expr_keys(arena, view, str8_zero(), &top_level_view_rules, root_expr_string, reg_parent_key, reg_key, depth); + EV_BlockList root_blocks = ev_block_list_from_view_expr_keys(arena, view, str8_zero(), view_rules_inherited, root_expr_string, reg_parent_key, reg_key, depth); ev_block_list_concat__in_place(out, &root_blocks); } } @@ -8058,7 +8054,7 @@ EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(rd_collection_block_prod) { EV_Key reg_parent_key = ev_key_make(5381, 0); EV_Key reg_key = ev_key_make(ev_hash_from_key(reg_parent_key), num); - EV_BlockList root_blocks = ev_block_list_from_view_expr_keys(arena, view, str8_zero(), &top_level_view_rules, root_expr_string, reg_parent_key, reg_key, depth); + EV_BlockList root_blocks = ev_block_list_from_view_expr_keys(arena, view, str8_zero(), view_rules_inherited, root_expr_string, reg_parent_key, reg_key, depth); ev_block_list_concat__in_place(out, &root_blocks); } } @@ -8074,7 +8070,6 @@ EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(rd_collection_block_prod) str8_match(string, str8_lit("procedures"), 0)) { Temp scratch = scratch_begin(&arena, 1); - EV_ViewRuleList top_level_view_rules = {0}; RDI_SectionKind fzy_target = (str8_match(string, str8_lit("globals"), 0) ? RDI_SectionKind_GlobalVariables : str8_match(string, str8_lit("thread_locals"), 0) ? RDI_SectionKind_ThreadVariables : str8_match(string, str8_lit("types"), 0) ? RDI_SectionKind_UDTs : @@ -8184,7 +8179,7 @@ EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(rd_collection_block_prod) last_vb = ev_block_split_and_continue(arena, out, last_vb, sub_expand_item_idxs[sub_expand_idx]); // rjf: build child view rules - EV_ViewRuleList *child_view_rules = ev_view_rule_list_from_inheritance(arena, &top_level_view_rules); + EV_ViewRuleList *child_view_rules = ev_view_rule_list_from_inheritance(arena, view_rules); { String8 view_rule_string = ev_view_rule_from_key(view, sub_expand_keys[sub_expand_idx]); if(view_rule_string.size != 0) @@ -8555,7 +8550,8 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul { E_Member *mem = &data_members.v[member_idx]; E_Expr *dot_expr = e_expr_ref_member_access(scratch.arena, eval.expr, mem->name); - E_Eval dot_eval = e_eval_from_expr(scratch.arena, dot_expr); + E_Expr *dot_expr_resolved = ev_expr_from_expr_view_rules(scratch.arena, dot_expr, view_rules); + E_Eval dot_eval = e_eval_from_expr(scratch.arena, dot_expr_resolved); space_taken += rd_append_value_strings_from_eval(arena, flags, radix, font, font_size, max_size-space_taken, depth+1, dot_eval, 0, view_rules, out); if(member_idx+1 < data_members.count) { diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 846ed77d..ad389225 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -950,7 +950,7 @@ rd_watch_view_init(RD_WatchViewState *ewv) } internal void -rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view_rule, B32 modifiable, U32 default_radix, Rng2F32 rect) +rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 root_expr, String8 root_view_rule, B32 modifiable, U32 default_radix, Rng2F32 rect) { ProfBeginFunction(); DI_Scope *di_scope = di_scope_open(); @@ -2105,7 +2105,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view scroll_list_params.row_height_px = floor_f32(ui_top_font_size()*2.5f); scroll_list_params.dim_px = dim_2f32(rect); scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(3, blocks.total_semantic_row_count)); - scroll_list_params.item_range = r1s64(0, 1 + blocks.total_visual_row_count); + scroll_list_params.item_range = r1s64(0, blocks.total_visual_row_count + 1*!(flags & RD_WatchViewFlag_NoHeader)); scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; UI_ScrollListRowBlockChunkList row_block_chunks = {0}; for(EV_BlockNode *n = blocks.first; n != 0; n = n->next) @@ -2138,7 +2138,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view //////////////////////////// //- rjf: build table header // - if(visible_row_rng.min == 0) UI_TableVector UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + if(~flags & RD_WatchViewFlag_NoHeader && visible_row_rng.min == 0) UI_TableVector UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) { for(RD_WatchViewColumn *col = ewv->first_column; col != 0; col = col->next) UI_TableCell @@ -2210,7 +2210,10 @@ rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view // EV_WindowedRowList rows = {0}; { - rows = ev_windowed_row_list_from_block_list(scratch.arena, eval_view, r1s64(visible_row_rng.min-1, visible_row_rng.max), &blocks); + rows = ev_windowed_row_list_from_block_list(scratch.arena, eval_view, + r1s64(visible_row_rng.min - 1*!(flags & RD_WatchViewFlag_NoHeader), + visible_row_rng.max + 1*!!(flags & RD_WatchViewFlag_NoHeader)), + &blocks); } //////////////////////////// @@ -2306,20 +2309,11 @@ rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view ui_ts_cell_idx = 0; //////////////////////// - //- rjf: row with expand ui rule -> build large singular row for "escape hatch" ui + //- rjf: canvas block row -> build singular row for "escape hatch" ui // if(row->block_kind == EV_BlockKind_Canvas) UI_Parent(row_box) UI_FocusHot(row_selected ? UI_FocusKind_On : UI_FocusKind_Off) { - //- rjf: build button row contents - if(ui_view_rule_info == &rd_nil_view_rule_info) - { - if(ui_clicked(rd_icon_buttonf(RD_IconKind_Add, 0, "Add New Target"))) - { - rd_cmd(RD_CmdKind_RunCommand, .string = rd_cmd_kind_info_table[RD_CmdKind_AddTarget].string); - } - } - //- rjf: build ui hook row contents if(ui_view_rule_info != &rd_nil_view_rule_info && ui_view_rule_info->ui != 0) { @@ -5033,13 +5027,10 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(targets) if(!wv->initialized) { rd_watch_view_init(wv); - rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Member, 0.25f, .string = str8_lit("label.str"), .display_string = str8_lit("Label"), .dequote_string = 1); - rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Member, 0.35f, .string = str8_lit("exe.str"), .display_string = str8_lit("Executable"), .dequote_string = 1, .is_non_code = 1); - rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Member, 0.20f, .string = str8_lit("args.str"), .display_string = str8_lit("Arguments"), .dequote_string = 1); - rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Member, 0.10f, .string = str8_lit("working_directory.str"), .display_string = str8_lit("Working Directory "), .dequote_string = 1, .is_non_code = 1); - rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Member, 0.10f, .string = str8_lit("entry_point.str"), .display_string = str8_lit("Custom Entry Point"), .dequote_string = 1); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Expr, 0.30f, .display_string = str8_lit("Expression")); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Value, 0.70f, .display_string = str8_lit("Value"), .dequote_string = 1, .is_non_code = 1); } - rd_watch_view_build(wv, str8_lit("targets"), str8_lit(""), 0, 10, rect); + rd_watch_view_build(wv, RD_WatchViewFlag_NoHeader, str8_lit("targets"), str8_lit("collection, only:label exe args working_directory entry_point str"), 0, 10, rect); ProfEnd(); } @@ -5549,7 +5540,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(breakpoints) rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Member, 0.10f, .string = str8_lit("enabled"), .display_string = str8_lit("Enabled"), .view_rule = str8_lit("checkbox")); rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Member, 0.10f, .string = str8_lit("hit_count"), .display_string = str8_lit("Hit Count")); } - rd_watch_view_build(wv, str8_lit("breakpoints"), str8_lit(""), 0, 10, rect); + rd_watch_view_build(wv, 0, str8_lit("breakpoints"), str8_lit(""), 0, 10, rect); ProfEnd(); } @@ -5566,7 +5557,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(watch_pins) rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Member, 0.5f, .string = str8_lit("Label"), .dequote_string = 1); rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Member, 0.5f, .string = str8_lit("Location"), .dequote_string = 1, .is_non_code = 1); } - rd_watch_view_build(wv, str8_lit("watch_pins"), str8_lit(""), 0, 10, rect); + rd_watch_view_build(wv, 0, str8_lit("watch_pins"), str8_lit(""), 0, 10, rect); ProfEnd(); } @@ -5808,7 +5799,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(call_stack) rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Value, 0.7f); rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Module, 0.25f, .is_non_code = 1); } - rd_watch_view_build(wv, str8_lit("current_thread.callstack.v"), str8_lit("cast:void**, array:current_thread.callstack.count"), 0, 10, rect); + rd_watch_view_build(wv, 0, str8_lit("current_thread.callstack.v"), str8_lit("cast:void**, array:current_thread.callstack.count"), 0, 10, rect); ProfEnd(); } @@ -5827,7 +5818,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(modules) rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Member, 0.30f, .string = str8_lit("dbg.str"), .display_string = str8_lit("Debug Info Path"), .dequote_string = 1, .is_non_code = 1); rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Member, 0.20f, .string = str8_lit("vaddr_range"), .display_string = str8_lit("Address Range"), .view_rule = str8_lit("hex")); } - rd_watch_view_build(wv, str8_lit("modules"), str8_lit(""), 0, 10, rect); + rd_watch_view_build(wv, 0, str8_lit("modules"), str8_lit(""), 0, 10, rect); ProfEnd(); } @@ -6172,7 +6163,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(watch) rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Type, 0.15f); rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_ViewRule, 0.30f); } - rd_watch_view_build(wv, str8_lit("watches"), str8_lit(""), 1, 10, rect); + rd_watch_view_build(wv, 0, str8_lit("watches"), str8_lit(""), 1, 10, rect); ProfEnd(); } @@ -6191,7 +6182,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(locals) rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Type, 0.15f); rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_ViewRule, 0.30f); } - rd_watch_view_build(wv, str8_lit("locals"), str8_lit(""), 0, 10, rect); + rd_watch_view_build(wv, 0, str8_lit("locals"), str8_lit(""), 0, 10, rect); ProfEnd(); } @@ -6210,7 +6201,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(registers) rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Type, 0.15f); rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_ViewRule, 0.30f); } - rd_watch_view_build(wv, str8_lit("registers"), str8_lit("hex"), 0, 16, rect); + rd_watch_view_build(wv, 0, str8_lit("registers"), str8_lit("hex"), 0, 16, rect); ProfEnd(); } @@ -6229,7 +6220,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(globals) rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Type, 0.15f); rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_ViewRule, 0.30f); } - rd_watch_view_build(wv, str8_lit("globals"), str8_lit(""), 0, 10, rect); + rd_watch_view_build(wv, 0, str8_lit("globals"), str8_lit(""), 0, 10, rect); ProfEnd(); } @@ -6248,7 +6239,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(thread_locals) rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Type, 0.15f); rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_ViewRule, 0.30f); } - rd_watch_view_build(wv, str8_lit("thread_locals"), str8_lit(""), 0, 10, rect); + rd_watch_view_build(wv, 0, str8_lit("thread_locals"), str8_lit(""), 0, 10, rect); ProfEnd(); } @@ -6267,7 +6258,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(types) rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Type, 0.15f); rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_ViewRule, 0.30f); } - rd_watch_view_build(wv, str8_lit("types"), str8_lit(""), 0, 10, rect); + rd_watch_view_build(wv, 0, str8_lit("types"), str8_lit(""), 0, 10, rect); ProfEnd(); } @@ -6285,7 +6276,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(procedures) rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Value, 0.6f); rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_ViewRule, 0.2f); } - rd_watch_view_build(wv, str8_lit("procedures"), str8_lit(""), 0, 10, rect); + rd_watch_view_build(wv, 0, str8_lit("procedures"), str8_lit(""), 0, 10, rect); ProfEnd(); } diff --git a/src/raddbg/raddbg_views.h b/src/raddbg/raddbg_views.h index 761c27de..a00ad2b6 100644 --- a/src/raddbg/raddbg_views.h +++ b/src/raddbg/raddbg_views.h @@ -41,6 +41,12 @@ struct RD_CodeViewBuildResult //////////////////////////////// //~ rjf: Watch View Types +typedef U32 RD_WatchViewFlags; +enum +{ + RD_WatchViewFlag_NoHeader = (1<<0), +}; + typedef enum RD_WatchViewColumnKind { RD_WatchViewColumnKind_Expr, @@ -158,6 +164,6 @@ internal void rd_watch_view_column_release(RD_WatchViewState *wv, RD_WatchViewCo //- rjf: watch view main hooks internal void rd_watch_view_init(RD_WatchViewState *ewv); -internal void rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view_rule, B32 modifiable, U32 default_radix, Rng2F32 rect); +internal void rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 root_expr, String8 root_view_rule, B32 modifiable, U32 default_radix, Rng2F32 rect); #endif // RADDBG_VIEWS_H