more progress on new expanded watch path; mostly feature convergent for procedures & callstack

This commit is contained in:
Ryan Fleury
2024-08-16 15:28:16 -07:00
parent 2d1adaf932
commit 04b38eb405
5 changed files with 136 additions and 50 deletions
+19 -7
View File
@@ -1354,7 +1354,7 @@ df_search_tags_from_entity(Arena *arena, DF_Entity *entity)
DF_Entity *module = df_module_from_process_vaddr(process, rip_vaddr);
U64 rip_voff = df_voff_from_vaddr(module, rip_vaddr);
DI_Key dbgi_key = df_dbgi_key_from_module(module);
String8 procedure_name = df_symbol_name_from_dbgi_key_voff(scratch.arena, &dbgi_key, rip_voff);
String8 procedure_name = df_symbol_name_from_dbgi_key_voff(scratch.arena, &dbgi_key, rip_voff, 0);
if(procedure_name.size != 0)
{
str8_list_push(scratch.arena, &strings, procedure_name);
@@ -2957,7 +2957,7 @@ df_vaddr_range_from_voff_range(DF_Entity *module, Rng1U64 voff_rng)
//- rjf: symbol lookups
internal String8
df_symbol_name_from_dbgi_key_voff(Arena *arena, DI_Key *dbgi_key, U64 voff)
df_symbol_name_from_dbgi_key_voff(Arena *arena, DI_Key *dbgi_key, U64 voff, B32 decorated)
{
String8 result = {0};
{
@@ -2970,9 +2970,21 @@ df_symbol_name_from_dbgi_key_voff(Arena *arena, DI_Key *dbgi_key, U64 voff)
RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx);
U64 proc_idx = scope->proc_idx;
RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, proc_idx);
U64 name_size = 0;
U8 *name_ptr = rdi_string_from_idx(rdi, procedure->name_string_idx, &name_size);
result = push_str8_copy(arena, str8(name_ptr, name_size));
E_TypeKey type = e_type_key_ext(E_TypeKind_Function, procedure->type_idx, e_parse_ctx_module_idx_from_rdi(rdi));
String8 name = {0};
name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &name.size);
if(decorated && procedure->type_idx != 0)
{
String8List list = {0};
e_type_lhs_string_from_key(scratch.arena, type, &list, 0, 0);
str8_list_push(scratch.arena, &list, name);
e_type_rhs_string_from_key(scratch.arena, type, &list, 0);
result = str8_list_join(arena, &list, 0);
}
else
{
result = push_str8_copy(arena, name);
}
}
if(result.size == 0)
{
@@ -2989,14 +3001,14 @@ df_symbol_name_from_dbgi_key_voff(Arena *arena, DI_Key *dbgi_key, U64 voff)
}
internal String8
df_symbol_name_from_process_vaddr(Arena *arena, DF_Entity *process, U64 vaddr)
df_symbol_name_from_process_vaddr(Arena *arena, DF_Entity *process, U64 vaddr, B32 decorated)
{
String8 result = {0};
{
DF_Entity *module = df_module_from_process_vaddr(process, vaddr);
DI_Key dbgi_key = df_dbgi_key_from_module(module);
U64 voff = df_voff_from_vaddr(module, vaddr);
result = df_symbol_name_from_dbgi_key_voff(arena, &dbgi_key, voff);
result = df_symbol_name_from_dbgi_key_voff(arena, &dbgi_key, voff, decorated);
}
return result;
}
+2 -2
View File
@@ -1521,8 +1521,8 @@ internal Rng1U64 df_vaddr_range_from_voff_range(DF_Entity *module, Rng1U64 voff_
//~ rjf: Debug Info Lookups
//- rjf: voff|vaddr -> symbol lookups
internal String8 df_symbol_name_from_dbgi_key_voff(Arena *arena, DI_Key *dbgi_key, U64 voff);
internal String8 df_symbol_name_from_process_vaddr(Arena *arena, DF_Entity *process, U64 vaddr);
internal String8 df_symbol_name_from_dbgi_key_voff(Arena *arena, DI_Key *dbgi_key, U64 voff, B32 decorated);
internal String8 df_symbol_name_from_process_vaddr(Arena *arena, DF_Entity *process, U64 vaddr, B32 decorated);
//- rjf: symbol -> voff lookups
internal U64 df_voff_from_dbgi_key_symbol_name(DI_Key *dbgi_key, String8 symbol_name);
+9 -3
View File
@@ -8396,7 +8396,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags
(E_TypeKind_Char8 <= direct_type_kind && direct_type_kind <= E_TypeKind_UChar32));
DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread);
DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process);
String8 symbol_name = df_symbol_name_from_process_vaddr(arena, process, value_eval.value.u64);
String8 symbol_name = df_symbol_name_from_process_vaddr(arena, process, value_eval.value.u64, 1);
// rjf: display ptr value
B32 did_ptr_value = 0;
@@ -10717,7 +10717,7 @@ df_entity_desc_button(DF_Window *ws, DF_Entity *entity, FuzzyMatchRangeList *nam
DF_Entity *module = df_module_from_process_vaddr(process, rip_vaddr);
U64 rip_voff = df_voff_from_vaddr(module, rip_vaddr);
DI_Key dbgi_key = df_dbgi_key_from_module(module);
String8 procedure_name = df_symbol_name_from_dbgi_key_voff(scratch.arena, &dbgi_key, rip_voff);
String8 procedure_name = df_symbol_name_from_dbgi_key_voff(scratch.arena, &dbgi_key, rip_voff, 0);
if(procedure_name.size != 0)
{
FuzzyMatchRangeList fuzzy_matches = {0};
@@ -12753,11 +12753,17 @@ df_fancy_string_list_from_code_string(Arena *arena, F32 alpha, B32 indirection_s
}break;
case TXT_TokenKind_Identifier:
{
E_TypeKey type = e_leaf_type_from_name(token_string);
Vec4F32 color = base_color;
if(!e_type_key_match(e_type_key_zero(), type))
{
color = df_rgba_from_theme_color(DF_ThemeColor_CodeType);
}
D_FancyString fancy_string =
{
ui_top_font(),
token_string,
base_color,
color,
ui_top_font_size() * (1.f - !!indirection_size_change*(indirection_counter/10.f)),
};
d_fancy_string_list_push(arena, &fancy_strings, &fancy_string);
+103 -37
View File
@@ -1224,16 +1224,54 @@ df_tbl_from_watch_view_point(DF_EvalVizBlockList *blocks, DF_WatchViewPoint pt)
//- rjf: table coordinates -> strings
internal String8
df_string_from_eval_viz_row_column_kind(Arena *arena, DF_EvalView *ev, DF_EvalVizRow *row, DF_WatchViewColumnKind col_kind, B32 editable)
df_string_from_eval_viz_row_column(Arena *arena, DF_EvalView *ev, DF_EvalVizRow *row, DF_WatchViewColumn *col, B32 editable)
{
String8 result = {0};
switch(col_kind)
switch(col->kind)
{
default:{}break;
case DF_WatchViewColumnKind_Expr: {result = editable ? row->edit_expr : row->display_expr;}break;
case DF_WatchViewColumnKind_Value: {result = editable ? row->edit_value : row->display_value;}break;
case DF_WatchViewColumnKind_Type: {result = !e_type_key_match(row->eval.type_key, e_type_key_zero()) ? e_type_string_from_key(arena, row->eval.type_key) : str8_zero();}break;
case DF_WatchViewColumnKind_ViewRule:{result = df_eval_view_rule_from_key(ev, row->key);}break;
case DF_WatchViewColumnKind_Expr:
{
result = editable ? row->edit_expr : row->display_expr;
if(row->inherited_type_key_chain.first != 0)
{
Temp scratch = scratch_begin(&arena, 1);
String8List inheritance_chain_type_names = {0};
for(E_TypeKeyNode *n = row->inherited_type_key_chain.first; n != 0; n = n->next)
{
String8 inherited_type_name = e_type_string_from_key(scratch.arena, n->v);
inherited_type_name = str8_skip_chop_whitespace(inherited_type_name);
str8_list_push(scratch.arena, &inheritance_chain_type_names, inherited_type_name);
}
if(inheritance_chain_type_names.node_count != 0)
{
StringJoin join = {0};
join.sep = str8_lit("::");
String8 inheritance_type = str8_list_join(scratch.arena, &inheritance_chain_type_names, &join);
result = push_str8f(scratch.arena, "%S::%S", inheritance_type, result);
}
scratch_end(scratch);
}
}break;
case DF_WatchViewColumnKind_Value:
{
result = editable ? row->edit_value : row->display_value;
}break;
case DF_WatchViewColumnKind_Type:
{
result = !e_type_key_match(row->eval.type_key, e_type_key_zero()) ? e_type_string_from_key(arena, row->eval.type_key) : str8_zero();
result = str8_skip_chop_whitespace(result);
}break;
case DF_WatchViewColumnKind_ViewRule:
{
result = df_eval_view_rule_from_key(ev, row->key);
}break;
case DF_WatchViewColumnKind_Module:
{
DF_Entity *process = df_entity_from_handle(df_interact_regs()->process);
DF_Entity *module = df_module_from_process_vaddr(process, row->eval.value.u64);
result = df_display_string_from_entity(arena, module);
}break;
}
return result;
}
@@ -1998,7 +2036,8 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS
{
for(S64 x = selection_tbl.min.x; x <= selection_tbl.max.x; x += 1)
{
String8 string = df_string_from_eval_viz_row_column_kind(scratch.arena, eval_view, row, (DF_WatchViewColumnKind)x, 1);
DF_WatchViewColumn *col = df_watch_view_column_from_x(ewv, x);
String8 string = df_string_from_eval_viz_row_column(scratch.arena, eval_view, row, col, 1);
string.size = Min(string.size, sizeof(ewv->dummy_text_edit_state.input_buffer));
DF_WatchViewPoint pt = {x, row->parent_key, row->key};
U64 hash = df_hash_from_expand_key(pt.key);
@@ -2246,7 +2285,8 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS
{
for(S64 x = selection_tbl.min.x; x <= selection_tbl.max.x; x += 1)
{
String8 cell_string = df_string_from_eval_viz_row_column_kind(scratch.arena, eval_view, row, (DF_WatchViewColumnKind)x, 0);
DF_WatchViewColumn *col = df_watch_view_column_from_x(ewv, x);
String8 cell_string = df_string_from_eval_viz_row_column(scratch.arena, eval_view, row, col, 0);
cell_string = str8_skip_chop_whitespace(cell_string);
U64 comma_pos = str8_find_needle(cell_string, 0, str8_lit(","), 0);
if(selection_tbl.min.x != selection_tbl.max.x || selection_tbl.min.y != selection_tbl.max.y)
@@ -2311,7 +2351,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS
new_cursor_parent_key = df_parent_expand_key_from_entity(fallback_watch);
}
}
DF_WatchViewPoint new_cursor_pt = {DF_WatchViewColumnKind_Expr, new_cursor_parent_key, new_cursor_key};
DF_WatchViewPoint new_cursor_pt = {0, new_cursor_parent_key, new_cursor_key};
df_entity_mark_for_deletion(watch);
ewv->cursor = ewv->mark = ewv->next_cursor = ewv->next_mark = new_cursor_pt;
}
@@ -2537,6 +2577,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS
case DF_WatchViewColumnKind_Value: {name = str8_lit("Value");}break;
case DF_WatchViewColumnKind_Type: {name = str8_lit("Type");}break;
case DF_WatchViewColumnKind_ViewRule:{name = str8_lit("View Rule");}break;
case DF_WatchViewColumnKind_Module: {name = str8_lit("Module");}break;
}
switch(col->kind)
{
@@ -2685,7 +2726,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS
//- rjf: do canvas row interactions
{
DF_WatchViewPoint pt = {DF_WatchViewColumnKind_Expr, row->parent_key, row->key};
DF_WatchViewPoint pt = {0, row->parent_key, row->key};
UI_Signal sig = ui_signal_from_box(row_box);
// rjf: press -> focus
@@ -2770,16 +2811,17 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS
DF_WatchViewPoint cell_pt = {x, row->parent_key, row->key};
DF_WatchViewTextEditState *cell_edit_state = df_watch_view_text_edit_state_from_pt(ewv, cell_pt);
B32 cell_selected = (row_selected && selection_tbl.min.x <= cell_pt.x && cell_pt.x <= selection_tbl.max.x);
String8 cell_pre_edit_string = df_string_from_eval_viz_row_column(scratch.arena, eval_view, row, col, 0);
//- rjf: unpack column-kind-specific info
B32 cell_can_edit = 0;
FuzzyMatchRangeList cell_matches = {0};
String8 cell_pre_edit_string = {0};
String8 cell_error_string = {0};
String8 cell_error_tooltip_string = {0};
DF_AutoCompListerFlags cell_autocomp_flags = 0;
DF_GfxViewRuleRowUIFunctionType *cell_ui_hook = 0;
Vec4F32 cell_base_color = ui_top_palette()->text;
DF_IconKind cell_icon = DF_IconKind_Null;
switch(col->kind)
{
default:{}break;
@@ -2790,21 +2832,6 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS
{
cell_matches = fuzzy_match_find(scratch.arena, filter, row->display_expr);
}
cell_pre_edit_string = row->display_expr;
if(row_is_inherited)
{
String8List inheritance_chain_type_names = {0};
for(E_TypeKeyNode *n = row->inherited_type_key_chain.first; n != 0; n = n->next)
{
String8 inherited_type_name = e_type_string_from_key(scratch.arena, n->v);
inherited_type_name = str8_skip_chop_whitespace(inherited_type_name);
str8_list_push(scratch.arena, &inheritance_chain_type_names, inherited_type_name);
}
StringJoin join = {0};
join.sep = str8_lit("::");
String8 inheritance_type = str8_list_join(scratch.arena, &inheritance_chain_type_names, &join);
cell_pre_edit_string = push_str8f(scratch.arena, "%S::%S", inheritance_type, cell_pre_edit_string);
}
cell_autocomp_flags = DF_AutoCompListerFlag_Locals;
}break;
case DF_WatchViewColumnKind_Value:
@@ -2828,20 +2855,29 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS
{
cell_ui_hook = row->value_ui_rule_spec->info.row_ui;
}
cell_pre_edit_string = row->display_value;
if(row->eval.space >= E_Space_FIXED_COUNT)
{
cell_base_color = df_rgba_from_theme_color(DF_ThemeColor_CodeSymbol);
}
}break;
case DF_WatchViewColumnKind_Type:
{
cell_can_edit = 0;
E_TypeKey key = row->eval.type_key;
cell_pre_edit_string = str8_skip_chop_whitespace(e_type_string_from_key(scratch.arena, key));
cell_base_color = df_rgba_from_theme_color(DF_ThemeColor_CodeType);
}break;
case DF_WatchViewColumnKind_ViewRule:
{
cell_can_edit = 1;
cell_autocomp_flags = DF_AutoCompListerFlag_ViewRules;
cell_pre_edit_string = df_eval_view_rule_from_key(eval_view, row->key);
}break;
case DF_WatchViewColumnKind_FrameSelection:
{
if(semantic_idx == df_interact_regs()->unwind_count - df_interact_regs()->inline_depth)
{
cell_icon = DF_IconKind_RightArrow;
cell_base_color = df_rgba_from_entity(df_entity_from_handle(df_interact_regs()->thread));
}
}break;
}
@@ -2890,6 +2926,17 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS
sig = ui_signal_from_box(box);
}
// rjf: cell has icon? build icon
else if(cell_icon != DF_IconKind_Null)
{
UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, "###cell_%I64x", row_hash);
UI_Parent(box) DF_Font(ws, DF_FontSlot_Icons) UI_WidthFill UI_TextAlignment(UI_TextAlign_Center)
{
ui_label(df_g_icon_kind_text_table[cell_icon]);
}
sig = ui_signal_from_box(box);
}
// rjf: build cell line edit
else
{
@@ -2898,7 +2945,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS
DF_LineEditFlag_NoBackground|
DF_LineEditFlag_DisableEdit*(!cell_can_edit)|
DF_LineEditFlag_Expander*!!(x == 0 && row->flags & DF_EvalVizRowFlag_CanExpand)|
DF_LineEditFlag_ExpanderPlaceholder*(x == 0 && row->depth==0)|
DF_LineEditFlag_ExpanderPlaceholder*(x == 0 && row->depth==0 && col->kind == DF_WatchViewColumnKind_Expr)|
DF_LineEditFlag_ExpanderSpace*(x == 0 && row->depth!=0)),
x == 0 ? row->depth : 0,
&cell_matches,
@@ -2941,6 +2988,25 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS
df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Edit));
}
// rjf: double-click, not editable -> go-to-location
if(ui_double_clicked(sig) && !cell_can_edit)
{
U64 vaddr = row->eval.value.u64;
DF_Entity *module = df_module_from_process_vaddr(process, vaddr);
DI_Key dbgi_key = df_dbgi_key_from_module(module);
U64 voff = df_voff_from_vaddr(module, vaddr);
DF_LineList lines = df_lines_from_dbgi_key_voff(scratch.arena, &dbgi_key, voff);
DF_CmdParams p = df_cmd_params_from_view(ws, panel, view);
p.entity = df_handle_from_entity(process);
p.vaddr = vaddr;
if(lines.first != 0)
{
p.file_path = lines.first->v.file_path;
p.text_point = lines.first->v.pt;
}
df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindCodeLocation));
}
// rjf: hovering with error tooltip -> show tooltip
if(ui_hovering(sig) && cell_error_tooltip_string.size != 0) UI_Tooltip
{
@@ -6261,8 +6327,9 @@ DF_VIEW_SETUP_FUNCTION_DEF(CallStack)
{
DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState);
df_watch_view_init(wv, view, DF_WatchViewFillKind_CallStack);
df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.5f);
df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Type, 0.5f);
df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_FrameSelection, 0.05f);
df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.7f);
df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Module, 0.25f);
}
DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(CallStack) {return str8_zero();}
DF_VIEW_CMD_FUNCTION_DEF(CallStack){}
@@ -7656,10 +7723,9 @@ DF_VIEW_SETUP_FUNCTION_DEF(Procedures)
{
DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState);
df_watch_view_init(wv, view, DF_WatchViewFillKind_Procedures);
df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.25f);
df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.3f);
df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Type, 0.15f);
df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_ViewRule, 0.30f);
df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.2f);
df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.6f);
df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_ViewRule, 0.2f);
}
DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Procedures) { return str8_zero(); }
DF_VIEW_CMD_FUNCTION_DEF(Procedures) {}
@@ -8132,7 +8198,7 @@ DF_VIEW_UI_FUNCTION_DEF(Memory)
DF_Entity *module = df_module_from_process_vaddr(process, f_rip);
DI_Key dbgi_key = df_dbgi_key_from_module(module);
U64 rip_voff = df_voff_from_vaddr(module, f_rip);
String8 symbol_name = df_symbol_name_from_dbgi_key_voff(scratch.arena, &dbgi_key, rip_voff);
String8 symbol_name = df_symbol_name_from_dbgi_key_voff(scratch.arena, &dbgi_key, rip_voff, 1);
Annotation *annotation = push_array(scratch.arena, Annotation, 1);
annotation->name_string = symbol_name.size != 0 ? symbol_name : str8_lit("[external code]");
annotation->kind_string = str8_lit("Call Stack Frame");
+3 -1
View File
@@ -276,6 +276,8 @@ typedef enum DF_WatchViewColumnKind
DF_WatchViewColumnKind_Value,
DF_WatchViewColumnKind_Type,
DF_WatchViewColumnKind_ViewRule,
DF_WatchViewColumnKind_Module,
DF_WatchViewColumnKind_FrameSelection,
DF_WatchViewColumnKind_COUNT
}
DF_WatchViewColumnKind;
@@ -546,7 +548,7 @@ internal DF_WatchViewPoint df_watch_view_point_from_tbl(DF_EvalVizBlockList *blo
internal Vec2S64 df_tbl_from_watch_view_point(DF_EvalVizBlockList *blocks, DF_WatchViewPoint pt);
//- rjf: table coordinates -> strings
internal String8 df_string_from_eval_viz_row_column_kind(Arena *arena, DF_EvalView *ev, DF_EvalVizRow *row, DF_WatchViewColumnKind col_kind, B32 editable);
internal String8 df_string_from_eval_viz_row_column(Arena *arena, DF_EvalView *ev, DF_EvalVizRow *row, DF_WatchViewColumn *col, B32 editable);
//- rjf: table coordinates -> text edit state
internal DF_WatchViewTextEditState *df_watch_view_text_edit_state_from_pt(DF_WatchViewState *wv, DF_WatchViewPoint pt);