From 5690a9e19bdd49cf04a21ea0578791010c660876 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 23 Sep 2024 16:45:18 -0700 Subject: [PATCH] further enriching of codebase type info & eval type info to encode code-contents of pointers, pretty names for members; further progress on improving watch views to support all needed features for replacing all table uis --- src/base/base_meta.c | 2 +- src/base/base_meta.h | 92 ++++++++++++------- src/ctrl/ctrl_core.h | 44 +++++---- src/eval/eval_types.c | 8 +- src/eval/eval_types.h | 2 + .../eval_visualization_core.c | 28 +++--- src/raddbg/raddbg_views.c | 46 ++++++++-- src/raddbg/raddbg_views.h | 7 +- 8 files changed, 151 insertions(+), 78 deletions(-) diff --git a/src/base/base_meta.c b/src/base/base_meta.c index 65015577..c60dc237 100644 --- a/src/base/base_meta.c +++ b/src/base/base_meta.c @@ -45,7 +45,7 @@ typed_data_rebase_ptrs(Type *type, String8 data, void *base_ptr) { default:{}break; case TypeKind_Ptr: - if(!t->type->is_external) + if(!(t->type->flags & TypeFlag_IsExternal)) { *(U64 *)t->ptr = ((U64)(*(U8 **)t->ptr - (U8 *)base_ptr)); }break; diff --git a/src/base/base_meta.h b/src/base/base_meta.h index 29125097..1e72f676 100644 --- a/src/base/base_meta.h +++ b/src/base/base_meta.h @@ -97,6 +97,13 @@ typedef enum TypeKind } TypeKind; +typedef U32 TypeFlags; +enum +{ + TypeFlag_IsExternal = (1<<0), + TypeFlag_IsCode = (1<<1), +}; + typedef U32 MemberFlags; enum { @@ -108,6 +115,7 @@ typedef struct Member Member; struct Member { String8 name; + String8 pretty_name; Type *type; U64 value; MemberFlags flags; @@ -117,13 +125,13 @@ typedef struct Type Type; struct Type { TypeKind kind; + TypeFlags flags; U64 size; Type *direct; String8 name; String8 count_delimiter_name; // gathered from surrounding members, turns *->[1] into *->[N] U64 count; Member *members; - B32 is_external; }; //////////////////////////////// @@ -154,36 +162,36 @@ struct TypeSerializeParams //////////////////////////////// //~ rjf: Type Info Table Initializer Helpers -#define member_lit_comp(S, ti, m, ...) {str8_lit_comp(#m), (ti), OffsetOf(S, m), __VA_ARGS__} +#define member_lit_comp(S, ti, m, ...) {str8_lit_comp(#m), {0}, (ti), OffsetOf(S, m), __VA_ARGS__} #define struct_members(S) read_only global Member S##__members[] = -#define struct_type(S) read_only global Type S##__type = {TypeKind_Struct, sizeof(S), &type_nil, str8_lit_comp(#S), {0}, ArrayCount(S##__members), S##__members} -#define ptr_type(name, ti, ...) read_only global Type name = {TypeKind_Ptr, sizeof(void *), (ti), __VA_ARGS__} +#define struct_type(S) read_only global Type S##__type = {TypeKind_Struct, 0, sizeof(S), &type_nil, str8_lit_comp(#S), {0}, ArrayCount(S##__members), S##__members} +#define ptr_type(name, ti, ...) read_only global Type name = {TypeKind_Ptr, 0, sizeof(void *), (ti), __VA_ARGS__} //////////////////////////////// //~ rjf: Globals -read_only global Type type_nil = {TypeKind_Null, 0, &type_nil}; -read_only global Member member_nil = {{0}, &type_nil}; +read_only global Type type_nil = {TypeKind_Null, 0, 0, &type_nil}; +read_only global Member member_nil = {{0}, {0}, &type_nil}; //////////////////////////////// //~ rjf: Built-In Types //- rjf: leaves -read_only global Type void__type = {TypeKind_Void, 0, &type_nil, str8_lit_comp("void")}; -read_only global Type U8__type = {TypeKind_U8, sizeof(U8), &type_nil, str8_lit_comp("U8")}; -read_only global Type U16__type = {TypeKind_U16, sizeof(U16), &type_nil, str8_lit_comp("U16")}; -read_only global Type U32__type = {TypeKind_U32, sizeof(U32), &type_nil, str8_lit_comp("U32")}; -read_only global Type U64__type = {TypeKind_U64, sizeof(U64), &type_nil, str8_lit_comp("U64")}; -read_only global Type S8__type = {TypeKind_S8, sizeof(S8), &type_nil, str8_lit_comp("S8")}; -read_only global Type S16__type = {TypeKind_S16, sizeof(S16), &type_nil, str8_lit_comp("S16")}; -read_only global Type S32__type = {TypeKind_S32, sizeof(S32), &type_nil, str8_lit_comp("S32")}; -read_only global Type S64__type = {TypeKind_S64, sizeof(S64), &type_nil, str8_lit_comp("S64")}; -read_only global Type B8__type = {TypeKind_B8, sizeof(B8), &type_nil, str8_lit_comp("B8")}; -read_only global Type B16__type = {TypeKind_B16, sizeof(B16), &type_nil, str8_lit_comp("B16")}; -read_only global Type B32__type = {TypeKind_B32, sizeof(B32), &type_nil, str8_lit_comp("B32")}; -read_only global Type B64__type = {TypeKind_B64, sizeof(B64), &type_nil, str8_lit_comp("B64")}; -read_only global Type F32__type = {TypeKind_F32, sizeof(F32), &type_nil, str8_lit_comp("F32")}; -read_only global Type F64__type = {TypeKind_F64, sizeof(F64), &type_nil, str8_lit_comp("F64")}; +read_only global Type void__type = {TypeKind_Void, 0, 0, &type_nil, str8_lit_comp("void")}; +read_only global Type U8__type = {TypeKind_U8, 0, sizeof(U8), &type_nil, str8_lit_comp("U8")}; +read_only global Type U16__type = {TypeKind_U16, 0, sizeof(U16), &type_nil, str8_lit_comp("U16")}; +read_only global Type U32__type = {TypeKind_U32, 0, sizeof(U32), &type_nil, str8_lit_comp("U32")}; +read_only global Type U64__type = {TypeKind_U64, 0, sizeof(U64), &type_nil, str8_lit_comp("U64")}; +read_only global Type S8__type = {TypeKind_S8, 0, sizeof(S8), &type_nil, str8_lit_comp("S8")}; +read_only global Type S16__type = {TypeKind_S16, 0, sizeof(S16), &type_nil, str8_lit_comp("S16")}; +read_only global Type S32__type = {TypeKind_S32, 0, sizeof(S32), &type_nil, str8_lit_comp("S32")}; +read_only global Type S64__type = {TypeKind_S64, 0, sizeof(S64), &type_nil, str8_lit_comp("S64")}; +read_only global Type B8__type = {TypeKind_B8, 0, sizeof(B8), &type_nil, str8_lit_comp("B8")}; +read_only global Type B16__type = {TypeKind_B16, 0, sizeof(B16), &type_nil, str8_lit_comp("B16")}; +read_only global Type B32__type = {TypeKind_B32, 0, sizeof(B32), &type_nil, str8_lit_comp("B32")}; +read_only global Type B64__type = {TypeKind_B64, 0, sizeof(B64), &type_nil, str8_lit_comp("B64")}; +read_only global Type F32__type = {TypeKind_F32, 0, sizeof(F32), &type_nil, str8_lit_comp("F32")}; +read_only global Type F64__type = {TypeKind_F64, 0, sizeof(F64), &type_nil, str8_lit_comp("F64")}; //- rjf: Rng1U64 struct_members(Rng1U64) @@ -194,15 +202,16 @@ struct_members(Rng1U64) struct_type(Rng1U64); //- rjf: String8 -Type String8__str_ptr_type = {TypeKind_Ptr, sizeof(void *), type(U8), {0}, str8_lit_comp("size")}; +Type String8__str_ptr_type = {TypeKind_Ptr, 0, sizeof(void *), type(U8), {0}, str8_lit_comp("size")}; Member String8__members[] = { - {str8_lit_comp("str"), &String8__str_ptr_type, OffsetOf(String8, str)}, - {str8_lit_comp("size"), type(U64), OffsetOf(String8, size)}, + {str8_lit_comp("str"), {0}, &String8__str_ptr_type, OffsetOf(String8, str)}, + {str8_lit_comp("size"), {0}, type(U64), OffsetOf(String8, size)}, }; Type String8__type = { TypeKind_Struct, + 0, sizeof(String8), &type_nil, str8_lit_comp("String8"), @@ -211,17 +220,37 @@ Type String8__type = String8__members, }; +//- rjf: String8 (code contents) +Type String8__code_str_ptr_type = {TypeKind_Ptr, TypeFlag_IsCode, sizeof(void *), type(U8), {0}, str8_lit_comp("size")}; +Member String8__code_members[] = +{ + {str8_lit_comp("str"), {0}, &String8__code_str_ptr_type, OffsetOf(String8, str)}, + {str8_lit_comp("size"), {0}, type(U64), OffsetOf(String8, size)}, +}; +Type String8__code_type = +{ + TypeKind_Struct, + 0, + sizeof(String8), + &type_nil, + str8_lit_comp("String8"), + {0}, + ArrayCount(String8__code_members), + String8__code_members, +}; + //- rjf: String8Node extern Type String8Node__type; -Type String8Node__ptr_type = {TypeKind_Ptr, sizeof(void *), &String8Node__type}; +Type String8Node__ptr_type = {TypeKind_Ptr, 0, sizeof(void *), &String8Node__type}; Member String8Node__members[] = { - {str8_lit_comp("next"), &String8Node__ptr_type, OffsetOf(String8Node, next)}, - {str8_lit_comp("string"), type(String8), OffsetOf(String8Node, string)}, + {str8_lit_comp("next"), {0}, &String8Node__ptr_type, OffsetOf(String8Node, next)}, + {str8_lit_comp("string"), {0}, type(String8), OffsetOf(String8Node, string)}, }; Type String8Node__type = { TypeKind_Struct, + 0, sizeof(String8Node), &type_nil, str8_lit_comp("String8Node"), @@ -233,14 +262,15 @@ Type String8Node__type = //- rjf: String8List Member String8List__members[] = { - {str8_lit_comp("first"), &String8Node__ptr_type, OffsetOf(String8List, first)}, - {str8_lit_comp("last"), &String8Node__ptr_type, OffsetOf(String8List, last), MemberFlag_DoNotSerialize}, - {str8_lit_comp("node_count"), type(U64), OffsetOf(String8List, node_count)}, - {str8_lit_comp("total_size"), type(U64), OffsetOf(String8List, total_size)}, + {str8_lit_comp("first"), {0}, &String8Node__ptr_type, OffsetOf(String8List, first)}, + {str8_lit_comp("last"), {0}, &String8Node__ptr_type, OffsetOf(String8List, last), MemberFlag_DoNotSerialize}, + {str8_lit_comp("node_count"), {0}, type(U64), OffsetOf(String8List, node_count)}, + {str8_lit_comp("total_size"), {0}, type(U64), OffsetOf(String8List, total_size)}, }; Type String8List__type = { TypeKind_Struct, + 0, sizeof(String8List), &type_nil, str8_lit_comp("String8List"), diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index c43d2951..e641896c 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -21,7 +21,7 @@ struct CTRL_MetaEvalFrame { U64 vaddr; }; -ptr_type(CTRL_MetaEvalFrame__vaddr_type, type(void), .is_external = 1, .size = sizeof(U64)); +ptr_type(CTRL_MetaEvalFrame__vaddr_type, type(void), .flags = TypeFlag_IsExternal, .size = sizeof(U64)); struct_members(CTRL_MetaEvalFrame) { member_lit_comp(CTRL_MetaEvalFrame, &CTRL_MetaEvalFrame__vaddr_type, vaddr), @@ -37,7 +37,7 @@ ptr_type(CTRL_MetaEvalFrameArray__v_ptr_type, &CTRL_MetaEvalFrame__vaddr_type, . struct_members(CTRL_MetaEvalFrameArray) { member_lit_comp(CTRL_MetaEvalFrameArray, type(U64), count), - {str8_lit_comp("v"), &CTRL_MetaEvalFrameArray__v_ptr_type, OffsetOf(CTRL_MetaEvalFrameArray, v)}, + {str8_lit_comp("v"), {0}, &CTRL_MetaEvalFrameArray__v_ptr_type, OffsetOf(CTRL_MetaEvalFrameArray, v)}, }; struct_type(CTRL_MetaEvalFrameArray); @@ -46,30 +46,34 @@ typedef struct CTRL_MetaEval CTRL_MetaEval; struct CTRL_MetaEval { #define CTRL_MetaEval_MemberXList \ -X(B32, enabled)\ -X(B32, frozen)\ -X(U64, hit_count)\ -X(U64, id)\ -X(Rng1U64, vaddr_range)\ -X(U32, color)\ -X(String8, label)\ -X(String8, exe)\ -X(String8, dbg)\ -X(String8, args)\ -X(String8, working_directory)\ -X(String8, entry_point)\ -X(String8, location)\ -X(String8, condition)\ -X(CTRL_MetaEvalFrameArray, callstack) -#define X(T, name) T name; +X(B32, enabled, "Enabled")\ +X(B32, frozen, "Frozen")\ +X(U64, hit_count, "Hit Count")\ +X(U64, id, "ID")\ +X(Rng1U64, vaddr_range, "Address Range")\ +X(U32, color, "Color")\ +Y(String8, String8__code_type, label, "Label")\ +X(String8, exe, "Executable Path")\ +X(String8, dbg, "Debug Info Path")\ +X(String8, args, "Arguments")\ +X(String8, working_directory, "Working Directory")\ +Y(String8, String8__code_type, entry_point, "Custom Entry Point")\ +X(String8, location, "Location")\ +Y(String8, String8__code_type, condition, "Condition")\ +X(CTRL_MetaEvalFrameArray, callstack, "Call Stack") +#define X(T, name, pretty_name) T name; +#define Y(T, ti, name, pretty_name) T name; CTRL_MetaEval_MemberXList #undef X +#undef Y }; struct_members(CTRL_MetaEval) { -#define X(T, name) member_lit_comp(CTRL_MetaEval, type(T), name), +#define X(T, name, pretty_name_) member_lit_comp(CTRL_MetaEval, type(T), name, .pretty_name = str8_lit_comp(pretty_name_)), +#define Y(T, ti, name, pretty_name_) member_lit_comp(CTRL_MetaEval, &(ti), name, .pretty_name = str8_lit_comp(pretty_name_)), CTRL_MetaEval_MemberXList #undef X +#undef Y }; struct_type(CTRL_MetaEval); @@ -83,7 +87,7 @@ struct CTRL_MetaEvalArray ptr_type(CTRL_MetaEvalArray__v_ptr_type, type(CTRL_MetaEval), .count_delimiter_name = str8_lit_comp("count")); struct_members(CTRL_MetaEvalArray) { - {str8_lit_comp("v"), &CTRL_MetaEvalArray__v_ptr_type, OffsetOf(CTRL_MetaEvalArray, v)}, + {str8_lit_comp("v"), {0}, &CTRL_MetaEvalArray__v_ptr_type, OffsetOf(CTRL_MetaEvalArray, v)}, member_lit_comp(CTRL_MetaEvalArray, type(U64), count), }; struct_type(CTRL_MetaEvalArray); diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index 1e5e1cdd..8806ae84 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -453,10 +453,14 @@ e_type_key_cons_base(Type *type) { E_TypeKey direct_type = e_type_key_cons_base(type->direct); E_TypeFlags flags = 0; - if(type->is_external) + if(type->flags & TypeFlag_IsExternal) { flags |= E_TypeFlag_External; } + if(type->flags & TypeFlag_IsCode) + { + flags |= E_TypeFlag_IsCode; + } result = e_type_key_cons_ptr(arch_from_context(), direct_type, flags); }break; case TypeKind_Array: @@ -471,7 +475,7 @@ e_type_key_cons_base(Type *type) for(U64 idx = 0; idx < type->count; idx += 1) { E_TypeKey member_type_key = e_type_key_cons_base(type->members[idx].type); - e_member_list_push_new(scratch.arena, &members, .name = type->members[idx].name, .off = type->members[idx].value, .type_key = member_type_key); + e_member_list_push_new(scratch.arena, &members, .name = type->members[idx].name, .off = type->members[idx].value, .type_key = member_type_key, .pretty_name = type->members[idx].pretty_name); } E_MemberArray members_array = e_member_array_from_list(scratch.arena, &members); result = e_type_key_cons(.arch = arch_from_context(), diff --git a/src/eval/eval_types.h b/src/eval/eval_types.h index 0bdb0b8f..f2e112dd 100644 --- a/src/eval/eval_types.h +++ b/src/eval/eval_types.h @@ -69,6 +69,7 @@ enum E_TypeFlag_Const = (1<<0), E_TypeFlag_Volatile = (1<<1), E_TypeFlag_External = (1<<2), + E_TypeFlag_IsCode = (1<<3), }; typedef struct E_Member E_Member; @@ -77,6 +78,7 @@ struct E_Member E_MemberKind kind; E_TypeKey type_key; String8 name; + String8 pretty_name; U64 off; E_TypeKeyList inheritance_key_chain; }; diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index e3a3f0ab..1178971d 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -950,19 +950,6 @@ ev_row_list_push_new(Arena *arena, EV_View *view, EV_WindowedRowList *rows, EV_B row->size_in_rows = 1; row->string = block->string; row->expr = expr_resolved; - if(row->expr->kind == E_ExprKind_MemberAccess) - { - Temp scratch = scratch_begin(&arena, 1); - E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, row->expr->first); - E_TypeKey type = irtree.type_key; - E_MemberArray data_members = e_type_data_members_from_key(scratch.arena, type); - E_Member *member = e_type_member_from_array_name(&data_members, row->expr->last->string); - if(member != 0) - { - row->member = e_type_member_copy(arena, member); - } - scratch_end(scratch); - } row->view_rules = view_rules; return row; } @@ -1081,7 +1068,11 @@ ev_windowed_row_list_from_block_list(Arena *arena, EV_View *view, Rng1S64 visibl { EV_Key key = ev_key_make(ev_hash_from_key(block->parent_key), idx+1); E_Expr *expr = ev_expr_from_block_index(arena, block, idx); - ev_row_list_push_new(arena, view, &list, block, key, expr); + EV_Row *row = ev_row_list_push_new(arena, view, &list, block, key, expr); + if(block->kind == EV_BlockKind_Members && idx < block->members.count) + { + row->member = e_type_member_copy(arena, &block->members.v[idx]); + } } }break; } @@ -1125,7 +1116,14 @@ ev_expr_string_from_row(Arena *arena, EV_Row *row) }break; case E_ExprKind_MemberAccess: { - result = push_str8f(arena, ".%S", e_string_from_expr(arena, notable_expr->last)); + if(row->member != 0 && row->member->pretty_name.size != 0) + { + result = push_str8_copy(arena, row->member->pretty_name); + } + else + { + result = push_str8f(arena, ".%S", e_string_from_expr(arena, notable_expr->last)); + } }break; } return result; diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 13e501d6..aaf226e4 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -877,6 +877,14 @@ rd_string_from_eval_viz_row_column(Arena *arena, EV_View *ev, EV_Row *row, RD_Wa result = str8_skip(str8_chop(result, 1), 1); result = raw_from_escaped_str8(arena, result); } + if(col->rangify_braces && result.size >= 2 && + result.str[0] == '{' && + result.str[result.size-1] == '}') + { + result = push_str8_copy(arena, result); + result.str[0] = '['; + result.str[result.size-1] = ')'; + } return result; } @@ -926,6 +934,7 @@ rd_watch_view_column_alloc_(RD_WatchViewState *wv, RD_WatchViewColumnKind kind, MemoryCopy(col->view_rule_buffer, params->view_rule.str, col->view_rule_size); col->is_non_code = params->is_non_code; col->dequote_string = params->dequote_string; + col->rangify_braces = params->rangify_braces; return col; } @@ -2232,6 +2241,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo B32 row_selected = (selection_tbl.min.y <= (semantic_idx+1) && (semantic_idx+1) <= selection_tbl.max.y); B32 row_expanded = ev_expansion_from_key(eval_view, row->key); E_Eval row_eval = e_eval_from_expr(scratch.arena, row->expr); + E_Type *row_type = e_type_from_key(scratch.arena, row_eval.type_key); B32 row_is_expandable = ev_row_is_expandable(row); B32 row_is_editable = ev_row_is_editable(row); B32 next_row_expanded = row_expanded; @@ -2428,9 +2438,9 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo { RD_Entity *entity = rd_entity_from_eval_space(row_eval.space); UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|UI_BoxFlag_DrawHotEffects|UI_BoxFlag_DrawActiveEffects, "###entity_%p", entity); - UI_Parent(box) + UI_Parent(box) UI_Focus(UI_FocusKind_Null) { - if(row_is_expandable) UI_PrefWidth(ui_em(2.f, 1.f)) UI_Focus(UI_FocusKind_Off) + if(row_is_expandable) UI_PrefWidth(ui_em(2.f, 1.f)) { if(ui_pressed(ui_expanderf(next_row_expanded, "###expand_%p", entity))) { @@ -2440,6 +2450,12 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo DR_FancyStringList fstrs = rd_title_fstrs_from_entity(scratch.arena, entity, rd_rgba_from_theme_color(RD_ThemeColor_TextWeak), ui_top_font_size()); UI_Box *label = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); ui_box_equip_display_fancy_strings(label, &fstrs); + if(entity->kind == RD_EntityKind_Target) UI_PrefWidth(ui_em(3.f, 1.f)) + { + rd_icon_buttonf(RD_IconKind_Play, 0, "###run"); + rd_icon_buttonf(RD_IconKind_StepInto, 0, "###step_into"); + rd_icon_buttonf(RD_IconKind_CheckHollow, 0, "###selected"); + } } UI_Signal sig = ui_signal_from_box(box); if(ui_pressed(sig)) @@ -2653,12 +2669,23 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo } } + //- rjf: determine if cell is code + B32 cell_is_code = !col->is_non_code; + if(flags & RD_WatchViewFlag_PrettyNameMembers && cell_is_code && row->member != 0 && row->member->pretty_name.size != 0 && col->kind == RD_WatchViewColumnKind_Expr) + { + cell_is_code = 0; + } + if(col->kind == RD_WatchViewColumnKind_Value && row_type->flags & E_TypeFlag_IsCode) + { + cell_is_code = 1; + } + //- rjf: build cell UI_Signal sig = {0}; UI_Palette(palette) UI_TableCell UI_FocusHot(cell_selected ? UI_FocusKind_On : UI_FocusKind_Off) UI_FocusActive((cell_selected && ewv->text_editing) ? UI_FocusKind_On : UI_FocusKind_Off) - RD_Font(col->is_non_code ? RD_FontSlot_Main : RD_FontSlot_Code) + RD_Font(cell_is_code ? RD_FontSlot_Code : RD_FontSlot_Main) UI_FlagsAdd(cell_flags | (row->depth > 0 ? UI_BoxFlag_DrawTextWeak : 0)) { // rjf: cell has errors? -> build error box @@ -2698,7 +2725,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo // rjf: build cell line edit else { - sig = rd_line_editf((RD_LineEditFlag_CodeContents*(!col->is_non_code)| + sig = rd_line_editf((RD_LineEditFlag_CodeContents*(!!cell_is_code)| RD_LineEditFlag_NoBackground| RD_LineEditFlag_DisableEdit*(!cell_can_edit)| RD_LineEditFlag_Expander*!!(x == 0 && row_is_expandable && col->kind == RD_WatchViewColumnKind_Expr)| @@ -5075,9 +5102,14 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(targets) { rd_watch_view_init(wv); 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")); + 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, RD_WatchViewFlag_NoHeader|RD_WatchViewFlag_RootButtons, str8_lit("targets"), str8_lit("collection, only:label exe args working_directory entry_point str"), 0, 10, rect); + rd_watch_view_build(wv, + RD_WatchViewFlag_NoHeader| + RD_WatchViewFlag_RootButtons| + RD_WatchViewFlag_PrettyNameMembers, + str8_lit("targets"), + str8_lit("only:label exe args working_directory entry_point str"), 0, 10, rect); ProfEnd(); } @@ -5863,7 +5895,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(modules) rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Member, 0.20f, .string = str8_lit("label.str"), .display_string = str8_lit("Name"), .dequote_string = 1, .is_non_code = 1); rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Member, 0.30f, .string = str8_lit("exe.str"), .display_string = str8_lit("Executable Path"), .dequote_string = 1, .is_non_code = 1); 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_column_alloc(wv, RD_WatchViewColumnKind_Member, 0.20f, .string = str8_lit("vaddr_range"), .display_string = str8_lit("Address Range"), .rangify_braces = 1, .view_rule = str8_lit("hex")); } rd_watch_view_build(wv, 0, str8_lit("modules"), str8_lit(""), 0, 10, rect); ProfEnd(); diff --git a/src/raddbg/raddbg_views.h b/src/raddbg/raddbg_views.h index 9b1a92bc..996a74a6 100644 --- a/src/raddbg/raddbg_views.h +++ b/src/raddbg/raddbg_views.h @@ -44,8 +44,9 @@ struct RD_CodeViewBuildResult typedef U32 RD_WatchViewFlags; enum { - RD_WatchViewFlag_NoHeader = (1<<0), - RD_WatchViewFlag_RootButtons = (1<<1), + RD_WatchViewFlag_NoHeader = (1<<0), + RD_WatchViewFlag_RootButtons = (1<<1), + RD_WatchViewFlag_PrettyNameMembers = (1<<2), }; typedef enum RD_WatchViewColumnKind @@ -69,6 +70,7 @@ struct RD_WatchViewColumnParams String8 view_rule; B32 is_non_code; B32 dequote_string; + B32 rangify_braces; }; typedef struct RD_WatchViewColumn RD_WatchViewColumn; @@ -86,6 +88,7 @@ struct RD_WatchViewColumn U64 view_rule_size; B32 is_non_code; B32 dequote_string; + B32 rangify_braces; }; typedef struct RD_WatchViewPoint RD_WatchViewPoint;