From c3c9539f9b44e2ad18e2d082d0cb91164fc00936 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 24 Oct 2024 11:25:13 -0700 Subject: [PATCH] prioritize string/symbol content in single-line pointer visualization; only use address-first when descending. also fix signed/unsigned visualization of character numeric values --- .../eval_visualization_core.c | 9 +++- src/raddbg/raddbg_core.c | 54 ++++++++----------- 2 files changed, 30 insertions(+), 33 deletions(-) diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index a49ebedc..8c38feb4 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -1533,12 +1533,15 @@ ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix, case E_TypeKind_UChar16: case E_TypeKind_UChar32: { + B32 type_is_unsigned = (type_kind <= E_TypeKind_UChar8 && type_kind <= E_TypeKind_UChar32); String8 char_str = ev_string_from_ascii_value(arena, eval.value.s64); if(char_str.size != 0) { if(flags & EV_StringFlag_ReadOnlyDisplayRules) { - String8 imm_string = str8_from_s64(arena, eval.value.s64, radix, min_digits, digit_group_separator); + String8 imm_string = (type_is_unsigned + ? str8_from_u64(arena, eval.value.u64, radix, min_digits, digit_group_separator) + : str8_from_s64(arena, eval.value.s64, radix, min_digits, digit_group_separator)); result = push_str8f(arena, "'%S' (%S)", char_str, imm_string); } else @@ -1548,7 +1551,9 @@ ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix, } else { - result = str8_from_s64(arena, eval.value.s64, radix, min_digits, digit_group_separator); + result = (type_is_unsigned + ? str8_from_u64(arena, eval.value.u64, radix, min_digits, digit_group_separator) + : str8_from_s64(arena, eval.value.s64, radix, min_digits, digit_group_separator)); } }break; diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 72c1dafe..327d1e42 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -9620,29 +9620,11 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); String8 symbol_name = d_symbol_name_from_process_vaddr(arena, process, value_eval.value.u64, 1); - // rjf: push pointer value - B32 did_ptr_value = 0; - if(!no_addr || value_eval.value.u64 == 0) - { - did_ptr_value = 1; - String8 string = ev_string_from_simple_typed_eval(arena, flags, radix, min_digits, value_eval); - space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, string).x; - str8_list_push(arena, out, string); - } - // rjf: special case: push strings for textual string content - B32 did_arrow = 0; B32 did_content = 0; B32 did_string = 0; if(!did_content && ptee_has_string && !has_array) { - if(did_ptr_value && !did_arrow) - { - did_arrow = 1; - String8 arrow = str8_lit(" -> "); - space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, arrow).x; - str8_list_push(arena, out, arrow); - } did_content = 1; did_string = 1; U64 string_memory_addr = value_eval.value.u64; @@ -9681,13 +9663,6 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul (type_kind == E_TypeKind_Ptr && direct_type_kind == E_TypeKind_Function) || (type_kind == E_TypeKind_Function))) { - if(did_ptr_value && !did_arrow) - { - did_arrow = 1; - String8 arrow = str8_lit(" -> "); - space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, arrow).x; - str8_list_push(arena, out, arrow); - } did_content = 1; str8_list_push(arena, out, symbol_name); space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, symbol_name).x; @@ -9701,19 +9676,36 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul (type_kind == E_TypeKind_Function)) && (flags & EV_StringFlag_ReadOnlyDisplayRules)) { - if(did_ptr_value) - { - String8 arrow = str8_lit(" -> "); - space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, arrow).x; - str8_list_push(arena, out, arrow); - } did_content = 1; String8 string = str8_lit("???"); str8_list_push(arena, out, string); space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, string).x; } + // rjf: push pointer value + B32 did_ptr_value = 0; + if(!no_addr || value_eval.value.u64 == 0) + { + did_ptr_value = 1; + if(did_content) + { + String8 left_paren = str8_lit(" ("); + space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, left_paren).x; + str8_list_push(arena, out, left_paren); + } + String8 string = ev_string_from_simple_typed_eval(arena, flags, radix, min_digits, value_eval); + space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, string).x; + str8_list_push(arena, out, string); + if(did_content) + { + String8 right_paren = str8_lit(")"); + space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, right_paren).x; + str8_list_push(arena, out, right_paren); + } + } + // rjf: descend for all other cases + B32 did_arrow = 0; if(value_eval.value.u64 != 0 && !did_content && ptee_has_content && (flags & EV_StringFlag_ReadOnlyDisplayRules)) { if(did_ptr_value && !did_arrow)