mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-14 17:28:07 +00:00
setting for preferring displaying pointer addresses before contents
This commit is contained in:
@@ -1812,6 +1812,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)
|
|||||||
B32 did_prefix_content;
|
B32 did_prefix_content;
|
||||||
B32 did_prefix_string;
|
B32 did_prefix_string;
|
||||||
B32 did_redirect;
|
B32 did_redirect;
|
||||||
|
B32 did_pre_prefix_ptr;
|
||||||
};
|
};
|
||||||
EV_StringPtrData *ptr_data = it->top_task->user_data;
|
EV_StringPtrData *ptr_data = it->top_task->user_data;
|
||||||
if(ptr_data == 0)
|
if(ptr_data == 0)
|
||||||
@@ -1833,10 +1834,29 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)
|
|||||||
{
|
{
|
||||||
default:{}break;
|
default:{}break;
|
||||||
|
|
||||||
//- rjf: step 0 -> try "prefix content", which we want to print before the pointer value,
|
//- rjf: step 0: do pre-prefix pointer value if requested
|
||||||
// like strings or symbol names
|
|
||||||
case 0:
|
case 0:
|
||||||
{
|
{
|
||||||
|
if(!(params->flags & EV_StringFlag_DisableAddresses) &&
|
||||||
|
params->flags & EV_StringFlag_AddressesBeforeContent)
|
||||||
|
{
|
||||||
|
*out_string = str8_from_u64(arena, ptr_data->value_eval.value.u64, 16, 0, 0);
|
||||||
|
ptr_data->did_pre_prefix_ptr = 1;
|
||||||
|
}
|
||||||
|
need_pop = 0;
|
||||||
|
}break;
|
||||||
|
|
||||||
|
//- rjf: step 1 -> try "prefix content", which we want to print before the pointer value,
|
||||||
|
// like strings or symbol names
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
// rjf: choose prefix
|
||||||
|
String8 pre_prefix = {0};
|
||||||
|
if(ptr_data->did_pre_prefix_ptr)
|
||||||
|
{
|
||||||
|
pre_prefix = str8_lit(" -> ");
|
||||||
|
}
|
||||||
|
|
||||||
// rjf: try strings
|
// rjf: try strings
|
||||||
if(!(ptr_data->type->flags & E_TypeFlag_IsNotText) &&
|
if(!(ptr_data->type->flags & E_TypeFlag_IsNotText) &&
|
||||||
!ptr_data->did_prefix_content && ptr_data->ptee_has_string &&
|
!ptr_data->did_prefix_content && ptr_data->ptee_has_string &&
|
||||||
@@ -1899,7 +1919,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// rjf: report
|
// rjf: report
|
||||||
*out_string = push_str8_copy(arena, string__escaped_and_quoted);
|
*out_string = str8f(arena, "%S%S", pre_prefix, string__escaped_and_quoted);
|
||||||
ptr_data->did_prefix_content = 1;
|
ptr_data->did_prefix_content = 1;
|
||||||
ptr_data->did_prefix_string = 1;
|
ptr_data->did_prefix_string = 1;
|
||||||
|
|
||||||
@@ -2017,11 +2037,12 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)
|
|||||||
e_type_lhs_string_from_key(scratch.arena, type, &list, 0, 0);
|
e_type_lhs_string_from_key(scratch.arena, type, &list, 0, 0);
|
||||||
str8_list_push(scratch.arena, &list, name);
|
str8_list_push(scratch.arena, &list, name);
|
||||||
e_type_rhs_string_from_key(scratch.arena, type, &list, 0);
|
e_type_rhs_string_from_key(scratch.arena, type, &list, 0);
|
||||||
*out_string = str8_list_join(arena, &list, 0);
|
String8 joined = str8_list_join(scratch.arena, &list, 0);
|
||||||
|
*out_string = str8f(arena, "%S%S", pre_prefix, joined);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*out_string = push_str8_copy(arena, name);
|
*out_string = str8f(arena, "%S%S", pre_prefix, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
good_symbol_match = (out_string->size != 0);
|
good_symbol_match = (out_string->size != 0);
|
||||||
@@ -2031,7 +2052,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)
|
|||||||
// rjf: if we have a function type, but we did not generate any name, then just put a ???
|
// rjf: if we have a function type, but we did not generate any name, then just put a ???
|
||||||
if(out_string->size == 0 && e_type_kind_from_key(ptr_data->type->direct_type_key) == E_TypeKind_Function)
|
if(out_string->size == 0 && e_type_kind_from_key(ptr_data->type->direct_type_key) == E_TypeKind_Function)
|
||||||
{
|
{
|
||||||
*out_string = str8_lit("???");
|
*out_string = str8f(arena, "%S???", pre_prefix);
|
||||||
good_symbol_match = 1;
|
good_symbol_match = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2048,7 +2069,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)
|
|||||||
String8 procedure_name = {0};
|
String8 procedure_name = {0};
|
||||||
procedure_name.str = rdi_name_from_procedure(rdi, procedure, &procedure_name.size);
|
procedure_name.str = rdi_name_from_procedure(rdi, procedure, &procedure_name.size);
|
||||||
|
|
||||||
*out_string = procedure_name;
|
*out_string = str8f(arena, "%S%S", pre_prefix, procedure_name);
|
||||||
good_symbol_match = (procedure_name.size != 0);
|
good_symbol_match = (procedure_name.size != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2081,8 +2102,8 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)
|
|||||||
}
|
}
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
//- rjf: step 1 -> do pointer value + descend if needed
|
//- rjf: step 2 -> do pointer value + descend if needed
|
||||||
case 1:
|
case 2:
|
||||||
{
|
{
|
||||||
Temp scratch = scratch_begin(&arena, 1);
|
Temp scratch = scratch_begin(&arena, 1);
|
||||||
String8 ptr_value_string = str8_from_u64(scratch.arena, ptr_data->value_eval.value.u64, 16, 0, 0);
|
String8 ptr_value_string = str8_from_u64(scratch.arena, ptr_data->value_eval.value.u64, 16, 0, 0);
|
||||||
@@ -2093,7 +2114,8 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)
|
|||||||
//
|
//
|
||||||
|
|
||||||
// rjf: [read only] if we did prefix content, do a parenthesized pointer value
|
// rjf: [read only] if we did prefix content, do a parenthesized pointer value
|
||||||
if(!(params->flags & EV_StringFlag_DisableAddresses) && params->flags & EV_StringFlag_ReadOnlyDisplayRules &&
|
if(!ptr_data->did_pre_prefix_ptr &&
|
||||||
|
!(params->flags & EV_StringFlag_DisableAddresses) && params->flags & EV_StringFlag_ReadOnlyDisplayRules &&
|
||||||
ptr_data->did_prefix_content)
|
ptr_data->did_prefix_content)
|
||||||
{
|
{
|
||||||
*out_string = push_str8f(arena, " (%S)", ptr_value_string);
|
*out_string = push_str8f(arena, " (%S)", ptr_value_string);
|
||||||
@@ -2101,7 +2123,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)
|
|||||||
|
|
||||||
// rjf: [read only] if we did *not* do any prefix content, but we have content,
|
// rjf: [read only] if we did *not* do any prefix content, but we have content,
|
||||||
// do "<pointer value> -> " then descend
|
// do "<pointer value> -> " then descend
|
||||||
else if(params->flags & EV_StringFlag_ReadOnlyDisplayRules && !ptr_data->did_prefix_content && ptr_data->ptee_has_content)
|
else if(!ptr_data->did_pre_prefix_ptr && params->flags & EV_StringFlag_ReadOnlyDisplayRules && !ptr_data->did_prefix_content && ptr_data->ptee_has_content)
|
||||||
{
|
{
|
||||||
if(!(params->flags & EV_StringFlag_DisableAddresses))
|
if(!(params->flags & EV_StringFlag_DisableAddresses))
|
||||||
{
|
{
|
||||||
@@ -2126,7 +2148,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// rjf: [writeable, catchall] if we did *not* do any prefix content, do "<pointer value>"
|
// rjf: [writeable, catchall] if we did *not* do any prefix content, do "<pointer value>"
|
||||||
else if(!ptr_data->did_prefix_content)
|
else if(!ptr_data->did_pre_prefix_ptr && !ptr_data->did_prefix_content)
|
||||||
{
|
{
|
||||||
*out_string = push_str8_copy(arena, ptr_value_string);
|
*out_string = push_str8_copy(arena, ptr_value_string);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -227,12 +227,13 @@ struct EV_WindowedRowList
|
|||||||
typedef U32 EV_StringFlags;
|
typedef U32 EV_StringFlags;
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
EV_StringFlag_ReadOnlyDisplayRules = (1<<0),
|
EV_StringFlag_ReadOnlyDisplayRules = (1<<0),
|
||||||
EV_StringFlag_PrettyNames = (1<<1),
|
EV_StringFlag_PrettyNames = (1<<1),
|
||||||
EV_StringFlag_DisableAddresses = (1<<2),
|
EV_StringFlag_DisableAddresses = (1<<2),
|
||||||
EV_StringFlag_DisableStrings = (1<<3),
|
EV_StringFlag_DisableStrings = (1<<3),
|
||||||
EV_StringFlag_DisableChars = (1<<4),
|
EV_StringFlag_DisableChars = (1<<4),
|
||||||
EV_StringFlag_DisableStringQuotes = (1<<5),
|
EV_StringFlag_DisableStringQuotes = (1<<5),
|
||||||
|
EV_StringFlag_AddressesBeforeContent = (1<<6),
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct EV_StringParams EV_StringParams;
|
typedef struct EV_StringParams EV_StringParams;
|
||||||
|
|||||||
@@ -404,6 +404,15 @@ few_params1(Pair *pairs, int count, Function_No_Params_Type *no_params_type){
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// NOTE(rjf): this doesn't work because MSVC - despite GENERATING DEBUG INFO
|
||||||
|
// FOR THE MyByte TYPEDEF - does not actually *reference* this typedef
|
||||||
|
// anywhere, and instead treats all `MyByte *`s as `char *`s, thus completely
|
||||||
|
// eliminating the point of the typedef and view. :(
|
||||||
|
//
|
||||||
|
typedef char MyByte;
|
||||||
|
raddbg_type_view(MyByte *, no_string($));
|
||||||
|
|
||||||
static void
|
static void
|
||||||
type_coverage_eval_tests(void)
|
type_coverage_eval_tests(void)
|
||||||
{
|
{
|
||||||
@@ -440,6 +449,8 @@ type_coverage_eval_tests(void)
|
|||||||
const char const_string_array[] = "Hello, World!";
|
const char const_string_array[] = "Hello, World!";
|
||||||
const char *const const_ptr_const_string = "Hello, World!";
|
const char *const const_ptr_const_string = "Hello, World!";
|
||||||
|
|
||||||
|
MyByte *non_string_byte_ptr = "Hello, World!";
|
||||||
|
|
||||||
void *pointer = &basics;
|
void *pointer = &basics;
|
||||||
Basics *pointer_to_basics = &basics;
|
Basics *pointer_to_basics = &basics;
|
||||||
Basics **pointer_to_pointer_to_basics = &pointer_to_basics;
|
Basics **pointer_to_pointer_to_basics = &pointer_to_basics;
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -228,8 +228,8 @@ RD_VocabTable:
|
|||||||
{
|
{
|
||||||
//- rjf: users / projects
|
//- rjf: users / projects
|
||||||
{
|
{
|
||||||
user
|
user,
|
||||||
```
|
```
|
||||||
@expand_commands(edit_user_theme) x:
|
@expand_commands(edit_user_theme) x:
|
||||||
{
|
{
|
||||||
//- rjf: animations
|
//- rjf: animations
|
||||||
@@ -317,6 +317,8 @@ RD_VocabTable:
|
|||||||
@default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,
|
@default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,
|
||||||
|
|
||||||
//- rjf: visualizers
|
//- rjf: visualizers
|
||||||
|
@display_name('Display Pointer Addresses Before Contents') @description("When visualizing pointers, always shows the address first, before showing contents at the pointer's address.")
|
||||||
|
@default(0) display_pointer_addresses_before_contents: bool,
|
||||||
@display_name('Use Default C++ STL Type Visualizers') @description("Enables the built-in type views for C++ STL types.")
|
@display_name('Use Default C++ STL Type Visualizers') @description("Enables the built-in type views for C++ STL types.")
|
||||||
@default(1) use_default_stl_type_views: bool,
|
@default(1) use_default_stl_type_views: bool,
|
||||||
@display_name('Use Default Unreal Engine Type Visualizers') @description("Enables the built-in type views for Unreal Engine types.")
|
@display_name('Use Default Unreal Engine Type Visualizers') @description("Enables the built-in type views for Unreal Engine types.")
|
||||||
|
|||||||
@@ -1972,7 +1972,7 @@ rd_view_ui(Rng2F32 rect)
|
|||||||
F32 row_height_px = ui_top_px_height();
|
F32 row_height_px = ui_top_px_height();
|
||||||
S64 num_possible_visible_rows = (S64)(dim_2f32(rect).y/row_height_px);
|
S64 num_possible_visible_rows = (S64)(dim_2f32(rect).y/row_height_px);
|
||||||
F32 row_string_max_size_px = dim_2f32(rect).x;
|
F32 row_string_max_size_px = dim_2f32(rect).x;
|
||||||
EV_StringFlags string_flags = EV_StringFlag_ReadOnlyDisplayRules;
|
EV_StringFlags string_flags = EV_StringFlag_ReadOnlyDisplayRules|rd_state->eval_viz_base_string_flags;
|
||||||
String8 filter = rd_view_query_input();
|
String8 filter = rd_view_query_input();
|
||||||
Vec4F32 pop_background_rgba = {0};
|
Vec4F32 pop_background_rgba = {0};
|
||||||
UI_TagF("pop") pop_background_rgba = ui_color_from_name(str8_lit("background"));
|
UI_TagF("pop") pop_background_rgba = ui_color_from_name(str8_lit("background"));
|
||||||
@@ -5559,7 +5559,7 @@ rd_window_frame(void)
|
|||||||
{
|
{
|
||||||
ui_spacer(ui_em(1.5f, 1.f));
|
ui_spacer(ui_em(1.5f, 1.f));
|
||||||
}
|
}
|
||||||
EV_StringParams string_params = {EV_StringFlag_ReadOnlyDisplayRules, .radix = 16};
|
EV_StringParams string_params = {EV_StringFlag_ReadOnlyDisplayRules|rd_state->eval_viz_base_string_flags, .radix = 16};
|
||||||
String8 thread_handle_string = ctrl_string_from_handle(scratch.arena, ctrl_entity->handle);
|
String8 thread_handle_string = ctrl_string_from_handle(scratch.arena, ctrl_entity->handle);
|
||||||
for(U64 idx = 0; idx < 16; idx += 1)
|
for(U64 idx = 0; idx < 16; idx += 1)
|
||||||
{
|
{
|
||||||
@@ -5589,7 +5589,7 @@ rd_window_frame(void)
|
|||||||
E_Eval eval = e_eval_from_string(rd_state->drag_drop_regs->expr);
|
E_Eval eval = e_eval_from_string(rd_state->drag_drop_regs->expr);
|
||||||
if(eval.irtree.mode != E_Mode_Null)
|
if(eval.irtree.mode != E_Mode_Null)
|
||||||
{
|
{
|
||||||
EV_StringParams string_params = {.flags = EV_StringFlag_ReadOnlyDisplayRules, .radix = 10};
|
EV_StringParams string_params = {.flags = EV_StringFlag_ReadOnlyDisplayRules|rd_state->eval_viz_base_string_flags, .radix = 10};
|
||||||
String8 value_string = rd_value_string_from_eval(scratch.arena, str8_zero(), &string_params, ui_top_font(), ui_top_font_size(), ui_top_font_size()*20.f, eval);
|
String8 value_string = rd_value_string_from_eval(scratch.arena, str8_zero(), &string_params, ui_top_font(), ui_top_font_size(), ui_top_font_size()*20.f, eval);
|
||||||
if(value_string.size != 0)
|
if(value_string.size != 0)
|
||||||
{
|
{
|
||||||
@@ -12013,6 +12013,11 @@ rd_frame(void)
|
|||||||
rd_state->alt_menu_bar_enabled = rd_setting_b32_from_name(str8_lit("focus_menu_bar_with_alt"));
|
rd_state->alt_menu_bar_enabled = rd_setting_b32_from_name(str8_lit("focus_menu_bar_with_alt"));
|
||||||
rd_state->use_default_stl_type_views = rd_setting_b32_from_name(str8_lit("use_default_stl_type_views"));
|
rd_state->use_default_stl_type_views = rd_setting_b32_from_name(str8_lit("use_default_stl_type_views"));
|
||||||
rd_state->use_default_ue_type_views = rd_setting_b32_from_name(str8_lit("use_default_ue_type_views"));
|
rd_state->use_default_ue_type_views = rd_setting_b32_from_name(str8_lit("use_default_ue_type_views"));
|
||||||
|
rd_state->eval_viz_base_string_flags = 0;
|
||||||
|
if(rd_setting_b32_from_name(str8_lit("display_pointer_addresses_before_contents")))
|
||||||
|
{
|
||||||
|
rd_state->eval_viz_base_string_flags |= EV_StringFlag_AddressesBeforeContent;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////
|
////////////////////////////
|
||||||
//- rjf: autosave if needed
|
//- rjf: autosave if needed
|
||||||
|
|||||||
@@ -403,6 +403,7 @@ struct RD_State
|
|||||||
B32 alt_menu_bar_enabled;
|
B32 alt_menu_bar_enabled;
|
||||||
B32 use_default_stl_type_views;
|
B32 use_default_stl_type_views;
|
||||||
B32 use_default_ue_type_views;
|
B32 use_default_ue_type_views;
|
||||||
|
EV_StringFlags eval_viz_base_string_flags;
|
||||||
|
|
||||||
// rjf: animation rates
|
// rjf: animation rates
|
||||||
F32 catchall_animation_rate;
|
F32 catchall_animation_rate;
|
||||||
|
|||||||
@@ -3778,7 +3778,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory)
|
|||||||
{
|
{
|
||||||
EV_StringParams params =
|
EV_StringParams params =
|
||||||
{
|
{
|
||||||
.flags = EV_StringFlag_ReadOnlyDisplayRules,
|
.flags = EV_StringFlag_ReadOnlyDisplayRules|rd_state->eval_viz_base_string_flags,
|
||||||
.radix = rd_view_setting_u64_from_name(str8_lit("default_radix")),
|
.radix = rd_view_setting_u64_from_name(str8_lit("default_radix")),
|
||||||
};
|
};
|
||||||
String8 value_string = rd_value_string_from_eval(scratch.arena, str8_zero(), ¶ms, ui_top_font(), ui_top_font_size(), ui_top_font_size()*40.f, peek_eval);
|
String8 value_string = rd_value_string_from_eval(scratch.arena, str8_zero(), ¶ms, ui_top_font(), ui_top_font_size(), ui_top_font_size()*40.f, peek_eval);
|
||||||
|
|||||||
@@ -2119,7 +2119,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
|
|||||||
String8 eval_string = {0};
|
String8 eval_string = {0};
|
||||||
if(!e_type_key_match(e_type_key_zero(), eval.irtree.type_key))
|
if(!e_type_key_match(e_type_key_zero(), eval.irtree.type_key))
|
||||||
{
|
{
|
||||||
EV_StringParams string_params = {.flags = EV_StringFlag_ReadOnlyDisplayRules, .radix = 10};
|
EV_StringParams string_params = {.flags = EV_StringFlag_ReadOnlyDisplayRules|rd_state->eval_viz_base_string_flags, .radix = 10};
|
||||||
eval_string = rd_value_string_from_eval(scratch.arena, str8_zero(), &string_params, params->font, params->font_size, params->font_size*60.f, eval);
|
eval_string = rd_value_string_from_eval(scratch.arena, str8_zero(), &string_params, params->font, params->font_size, params->font_size*60.f, eval);
|
||||||
}
|
}
|
||||||
ui_spacer(ui_em(1.5f, 1.f));
|
ui_spacer(ui_em(1.5f, 1.f));
|
||||||
|
|||||||
Reference in New Issue
Block a user