first pass of watch window macros; fix active-but-disabled line edit rendering; other minor fixes

This commit is contained in:
Ryan Fleury
2024-02-06 11:47:52 -08:00
parent c2d96a8df6
commit 6296d2bd96
23 changed files with 688 additions and 405 deletions
+58 -19
View File
@@ -633,7 +633,7 @@ df_string_from_eval_root(DF_EvalRoot *root)
//- rjf: windowed watch tree visualization (both single-line and multi-line)
internal DF_EvalVizBlockList
df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_View *view, DF_EvalWatchViewState *ews)
df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_View *view, DF_EvalWatchViewState *ews)
{
ProfBeginFunction();
Temp scratch = scratch_begin(&arena, 1);
@@ -657,7 +657,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF
FuzzyMatchRangeList matches = fuzzy_match_find(arena, filter, root_expr_string);
if(matches.count == matches.needle_part_count)
{
DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_num(arena, scope, ctrl_ctx, parse_ctx, eval_view, root_expr_string, num);
DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_num(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval_view, root_expr_string, num);
df_eval_viz_block_list_concat__in_place(&blocks, &root_blocks);
}
}
@@ -681,7 +681,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF
FuzzyMatchRangeList matches = fuzzy_match_find(arena, filter, root_expr_string);
if(matches.count == matches.needle_part_count)
{
DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_num(arena, scope, ctrl_ctx, parse_ctx, eval_view, root_expr_string, num);
DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_num(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval_view, root_expr_string, num);
df_eval_viz_block_list_concat__in_place(&blocks, &root_blocks);
}
}
@@ -691,7 +691,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF
FuzzyMatchRangeList matches = fuzzy_match_find(arena, filter, root_expr_string);
if(matches.count == matches.needle_part_count)
{
DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_num(arena, scope, ctrl_ctx, parse_ctx, eval_view, root_expr_string, num);
DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_num(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval_view, root_expr_string, num);
df_eval_viz_block_list_concat__in_place(&blocks, &root_blocks);
}
}
@@ -709,7 +709,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF
FuzzyMatchRangeList matches = fuzzy_match_find(arena, filter, root_expr_string);
if(matches.count == matches.needle_part_count)
{
DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_num(arena, scope, ctrl_ctx, parse_ctx, eval_view, root_expr_string, num);
DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_num(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval_view, root_expr_string, num);
df_eval_viz_block_list_concat__in_place(&blocks, &root_blocks);
}
}
@@ -835,8 +835,8 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF
df_cfg_table_push_unparsed_string(arena, &child_cfg, view_rule_string, DF_CfgSrc_User);
}
}
DF_Eval eval = df_eval_from_string(arena, scope, ctrl_ctx, parse_ctx, name);
df_append_viz_blocks_for_parent__rec(arena, scope, eval_view, ctrl_ctx, parse_ctx, parent_key, sub_expand_keys[sub_expand_idx], name, eval, 0, &child_cfg, 0, &blocks);
DF_Eval eval = df_eval_from_string(arena, scope, ctrl_ctx, parse_ctx, macro_map, name);
df_append_viz_blocks_for_parent__rec(arena, scope, eval_view, ctrl_ctx, parse_ctx, macro_map, parent_key, sub_expand_keys[sub_expand_idx], name, eval, 0, &child_cfg, 0, &blocks);
}
}
df_eval_viz_block_end(&blocks, last_vb);
@@ -920,10 +920,49 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW
//
EVAL_ParseCtx parse_ctx = df_eval_parse_ctx_from_process_vaddr(scope, process, thread_ip_vaddr);
//////////////////////////////
//- rjf: state -> macro map
//
EVAL_String2ExprMap macro_map = eval_string2expr_map_make(scratch.arena, 256);
for(DF_EvalRoot *root = ewv->first_root; root != 0; root = root->next)
{
String8 root_expr = str8(root->expr_buffer, root->expr_buffer_string_size);
//- rjf: unpack arguments
DF_Entity *process = thread->parent;
U64 unwind_count = ctrl_ctx.unwind_count;
CTRL_Unwind unwind = df_query_cached_unwind_from_thread(thread);
Architecture arch = df_architecture_from_entity(thread);
U64 reg_size = regs_block_size_from_architecture(arch);
U64 thread_unwind_ip_vaddr = 0;
void *thread_unwind_regs_block = push_array(scratch.arena, U8, reg_size);
{
U64 idx = 0;
for(CTRL_UnwindFrame *f = unwind.first; f != 0; f = f->next, idx += 1)
{
if(idx == unwind_count)
{
thread_unwind_ip_vaddr = f->rip;
thread_unwind_regs_block = f->regs;
break;
}
}
}
//- rjf: lex & parse
EVAL_TokenArray tokens = eval_token_array_from_text(scratch.arena, root_expr);
EVAL_ParseResult parse = eval_parse_expr_from_text_tokens(scratch.arena, &parse_ctx, root_expr, &tokens);
EVAL_ErrorList errors = parse.errors;
if(errors.count == 0)
{
eval_push_leaf_ident_exprs_from_expr__in_place(scratch.arena, &macro_map, parse.expr, &errors);
}
}
//////////////////////////////
//- rjf: state -> viz blocks
//
DF_EvalVizBlockList blocks = df_eval_viz_block_list_from_watch_view_state(scratch.arena, scope, &ctrl_ctx, &parse_ctx, view, ewv);
DF_EvalVizBlockList blocks = df_eval_viz_block_list_from_watch_view_state(scratch.arena, scope, &ctrl_ctx, &parse_ctx, &macro_map, view, ewv);
//////////////////////////////
//- rjf: does this eval watch view allow mutation? -> add extra block for editable empty row
@@ -1098,7 +1137,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW
//- rjf: viz blocks -> rows
DF_EvalVizWindowedRowList rows = {0};
{
rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, scope, &ctrl_ctx, &parse_ctx, eval_view, default_radix, code_font, code_font_size, r1s64(visible_row_rng.min-1, visible_row_rng.max), &blocks);
rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, scope, &ctrl_ctx, &parse_ctx, &macro_map, eval_view, default_radix, code_font, code_font_size, r1s64(visible_row_rng.min-1, visible_row_rng.max), &blocks);
}
//- rjf: build table
@@ -1165,7 +1204,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW
{
Vec2F32 canvas_dim = v2f32(scroll_list_params.dim_px.x - ui_top_font_size()*1.5f,
(row->skipped_size_in_rows+row->size_in_rows+row->chopped_size_in_rows)*scroll_list_params.row_height_px - scroll_list_params.row_height_px);
row->expand_ui_rule_spec->info.block_ui(ws, row->key, row->eval, scope, &ctrl_ctx, &parse_ctx, row->expand_ui_rule_node, canvas_dim);
row->expand_ui_rule_spec->info.block_ui(ws, row->key, row->eval, scope, &ctrl_ctx, &parse_ctx, &macro_map, row->expand_ui_rule_node, canvas_dim);
}
}
}
@@ -1341,7 +1380,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW
if(parse.expr != &eval_expr_nil && errors.count == 0)
{
ui_labelf("Type:");
ir_tree_and_type = eval_irtree_and_type_from_expr(scratch.arena, parse_ctx.type_graph, parse_ctx.rdbg, parse.expr, &errors);
ir_tree_and_type = eval_irtree_and_type_from_expr(scratch.arena, parse_ctx.type_graph, parse_ctx.rdbg, &eval_string2expr_map_nil, parse.expr, &errors);
TG_Key type_key = ir_tree_and_type.type_key;
String8 type_string = tg_string_from_key(scratch.arena, parse_ctx.type_graph, parse_ctx.rdbg, type_key);
UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText))
@@ -1428,7 +1467,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW
}
StringJoin join = {str8_lit(""), str8_lit(" "), str8_lit("")};
String8 error_string = str8_list_join(scratch.arena, &strings, &join);
df_error_label(error_string);
sig = df_error_label(error_string);
}
// rjf: hook -> call hook
@@ -1437,7 +1476,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW
UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_Clickable, "###val_%I64x", row_hash);
UI_Parent(box)
{
row->value_ui_rule_spec->info.row_ui(row->key, row->eval, scope, &ctrl_ctx, &parse_ctx, row->value_ui_rule_node);
row->value_ui_rule_spec->info.row_ui(row->key, row->eval, scope, &ctrl_ctx, &parse_ctx, &macro_map, row->value_ui_rule_node);
}
sig = ui_signal_from_box(box);
}
@@ -1628,7 +1667,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW
case DF_EvalWatchViewColumnKind_Value:
{
Temp scratch = scratch_begin(0, 0);
DF_Eval write_eval = df_eval_from_string(scratch.arena, scope, &ctrl_ctx, &parse_ctx, commit_string);
DF_Eval write_eval = df_eval_from_string(scratch.arena, scope, &ctrl_ctx, &parse_ctx, &macro_map, commit_string);
B32 success = df_commit_eval_value(parse_ctx.type_graph, parse_ctx.rdbg, &ctrl_ctx, commit_row->eval, write_eval);
if(success == 0)
{
@@ -1671,7 +1710,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW
//
if(edit_commit)
{
blocks = df_eval_viz_block_list_from_watch_view_state(scratch.arena, scope, &ctrl_ctx, &parse_ctx, view, ewv);
blocks = df_eval_viz_block_list_from_watch_view_state(scratch.arena, scope, &ctrl_ctx, &parse_ctx, &macro_map, view, ewv);
if(modifiable)
{
DF_EvalVizBlock *b = df_eval_viz_block_begin(scratch.arena, DF_EvalVizBlockKind_Null, empty_row_parent_key, empty_row_key, 0);
@@ -5403,7 +5442,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code)
String8 expr = txti_string_from_handle_txt_rng(scratch.arena, txti_handle, expr_rng);
if(expr.size != 0)
{
DF_Eval eval = df_eval_from_string(scratch.arena, scope, &ctrl_ctx, &parse_ctx, expr);
DF_Eval eval = df_eval_from_string(scratch.arena, scope, &ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, expr);
if(eval.mode != EVAL_EvalMode_NULL)
{
df_set_hover_eval(ws, sig.mouse_expr_baseline_pos, ctrl_ctx, entity, sig.mouse_pt, 0, expr);
@@ -6311,7 +6350,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly)
String8 expr = str8_substr(code_slice_params.line_text[line_idx], r1u64(sig.mouse_expr_rng.min.column-1, sig.mouse_expr_rng.max.column-1));
if(expr.size != 0)
{
DF_Eval eval = df_eval_from_string(scratch.arena, scope, &ctrl_ctx, &parse_ctx, expr);
DF_Eval eval = df_eval_from_string(scratch.arena, scope, &ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, expr);
if(eval.mode != EVAL_EvalMode_NULL)
{
U64 off = dasm_inst_array_off_from_idx(&insts, sig.mouse_expr_rng.min.line-1);
@@ -7207,7 +7246,7 @@ DF_VIEW_UI_FUNCTION_DEF(Output)
String8 expr = txti_string_from_handle_txt_rng(scratch.arena, txti_handle, expr_rng);
if(expr.size != 0)
{
DF_Eval eval = df_eval_from_string(scratch.arena, scope, &ctrl_ctx, &parse_ctx, expr);
DF_Eval eval = df_eval_from_string(scratch.arena, scope, &ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, expr);
if(eval.mode != EVAL_EvalMode_NULL)
{
df_set_hover_eval(ws, sig.mouse_expr_baseline_pos, ctrl_ctx, entity, sig.mouse_pt, 0, expr);
@@ -7843,7 +7882,7 @@ DF_VIEW_UI_FUNCTION_DEF(Memory)
for(EVAL_String2NumMapNode *n = parse_ctx.locals_map->first; n != 0; n = n->order_next)
{
String8 local_name = n->string;
DF_Eval local_eval = df_eval_from_string(scratch.arena, scope, &ctrl_ctx, &parse_ctx, local_name);
DF_Eval local_eval = df_eval_from_string(scratch.arena, scope, &ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, local_name);
if(local_eval.mode == EVAL_EvalMode_Addr)
{
TG_Kind local_eval_type_kind = tg_kind_from_key(local_eval.type_key);