progress on mixing control (command, insertion) rows in cfg-list evaluation, for watch windows; e.g. empty row in watch window, add-new buttons in targets/breakpoints/watchpins/etc.

This commit is contained in:
Ryan Fleury
2025-02-04 16:44:04 -08:00
parent de16c9cdef
commit a003a11425
6 changed files with 58 additions and 35 deletions
+1 -1
View File
@@ -87,7 +87,7 @@ RD_NameSchemaInfo rd_name_schema_info_table[10] =
{str8_lit_comp("auto_view_rule"), str8_lit_comp("x:{'source':code_string, 'dest':code_string}"), str8_lit_comp("remove_cfg")}, {str8_lit_comp("auto_view_rule"), str8_lit_comp("x:{'source':code_string, 'dest':code_string}"), str8_lit_comp("remove_cfg")},
{str8_lit_comp("machine"), str8_lit_comp("x:{'frozen':bool, 'label':code_string}"), str8_lit_comp("")}, {str8_lit_comp("machine"), str8_lit_comp("x:{'frozen':bool, 'label':code_string}"), str8_lit_comp("")},
{str8_lit_comp("process"), str8_lit_comp("x:{'frozen':bool, 'label':code_string, 'id':u64}"), str8_lit_comp("")}, {str8_lit_comp("process"), str8_lit_comp("x:{'frozen':bool, 'label':code_string, 'id':u64}"), str8_lit_comp("")},
{str8_lit_comp("module"), str8_lit_comp("x:{'label':code_string, 'exe':path, 'dbg':path, 'vaddr_range':vaddr_range}"), str8_lit_comp("")}, {str8_lit_comp("module"), str8_lit_comp("x:{'exe':path, 'dbg':path, 'vaddr_range':vaddr_range}"), str8_lit_comp("")},
{str8_lit_comp("thread"), str8_lit_comp("x:{'frozen':bool, 'label':code_string, 'id':u64}"), str8_lit_comp("")}, {str8_lit_comp("thread"), str8_lit_comp("x:{'frozen':bool, 'label':code_string, 'id':u64}"), str8_lit_comp("")},
}; };
+1 -1
View File
@@ -221,7 +221,7 @@ RD_VocabularyMap:
//- rjf: modules //- rjf: modules
{ {
module, module,
```x:{'label':code_string, 'exe':path, 'dbg':path, 'vaddr_range':vaddr_range}```, ```x:{'exe':path, 'dbg':path, 'vaddr_range':vaddr_range}```,
} }
//- rjf: threads //- rjf: threads
+54 -15
View File
@@ -8878,7 +8878,7 @@ E_LOOKUP_INFO_FUNCTION_DEF(watches)
RD_CfgArray *cfgs = push_array(arena, RD_CfgArray, 1); RD_CfgArray *cfgs = push_array(arena, RD_CfgArray, 1);
cfgs[0] = rd_cfg_array_from_list(arena, &cfgs_list__filtered); cfgs[0] = rd_cfg_array_from_list(arena, &cfgs_list__filtered);
result.user_data = cfgs; result.user_data = cfgs;
result.idxed_expr_count = cfgs->count; result.idxed_expr_count = cfgs->count + 1;
} }
scratch_end(scratch); scratch_end(scratch);
return result; return result;
@@ -8893,9 +8893,12 @@ E_LOOKUP_RANGE_FUNCTION_DEF(watches)
for(U64 idx = 0; idx < read_range_count; idx += 1) for(U64 idx = 0; idx < read_range_count; idx += 1)
{ {
U64 cfg_idx = read_range.min + idx; U64 cfg_idx = read_range.min + idx;
String8 expr_string = rd_cfg_child_from_string(cfgs->v[idx], str8_lit("expression"))->first->string; if(cfg_idx < cfgs->count)
exprs[idx] = e_parse_expr_from_text(arena, expr_string); {
exprs_strings[idx] = push_str8_copy(arena, expr_string); String8 expr_string = rd_cfg_child_from_string(cfgs->v[idx], str8_lit("expression"))->first->string;
exprs[idx] = e_parse_expr_from_text(arena, expr_string);
exprs_strings[idx] = push_str8_copy(arena, expr_string);
}
} }
} }
@@ -8987,6 +8990,13 @@ E_LOOKUP_RANGE_FUNCTION_DEF(registers)
} }
} }
typedef struct RD_TopLevelCfgLookupAccel RD_TopLevelCfgLookupAccel;
struct RD_TopLevelCfgLookupAccel
{
String8Array cmds;
RD_CfgArray cfgs;
};
E_LOOKUP_INFO_FUNCTION_DEF(top_level_cfg) E_LOOKUP_INFO_FUNCTION_DEF(top_level_cfg)
{ {
E_LookupInfo result = {0}; E_LookupInfo result = {0};
@@ -8995,11 +9005,28 @@ E_LOOKUP_INFO_FUNCTION_DEF(top_level_cfg)
E_TypeKey lhs_type_key = lhs->type_key; E_TypeKey lhs_type_key = lhs->type_key;
E_Type *lhs_type = e_type_from_key__cached(lhs_type_key); E_Type *lhs_type = e_type_from_key__cached(lhs_type_key);
String8 cfg_name = rd_singular_from_code_name_plural(lhs_type->name); String8 cfg_name = rd_singular_from_code_name_plural(lhs_type->name);
RD_CfgList cfgs_list = rd_cfg_top_level_list_from_string(scratch.arena, cfg_name); RD_CfgList cfgs_list = rd_cfg_top_level_list_from_string(scratch.arena, cfg_name);\
RD_CfgArray *cfgs = push_array(arena, RD_CfgArray, 1); String8List cmds_list = {0};
cfgs[0] = rd_cfg_array_from_list(arena, &cfgs_list); // TODO(rjf): @cfg hack - probably want to table-drive this
result.user_data = cfgs; if(str8_match(cfg_name, str8_lit("target"), 0))
result.idxed_expr_count = cfgs_list.count; {
str8_list_push(arena, &cmds_list, rd_cmd_kind_info_table[RD_CmdKind_AddTarget].string);
}
else if(str8_match(cfg_name, str8_lit("breakpoint"), 0))
{
str8_list_push(arena, &cmds_list, rd_cmd_kind_info_table[RD_CmdKind_AddBreakpoint].string);
str8_list_push(arena, &cmds_list, rd_cmd_kind_info_table[RD_CmdKind_AddAddressBreakpoint].string);
str8_list_push(arena, &cmds_list, rd_cmd_kind_info_table[RD_CmdKind_AddFunctionBreakpoint].string);
}
else if(str8_match(cfg_name, str8_lit("watch_pin"), 0))
{
str8_list_push(arena, &cmds_list, rd_cmd_kind_info_table[RD_CmdKind_AddWatchPin].string);
}
RD_TopLevelCfgLookupAccel *accel = push_array(arena, RD_TopLevelCfgLookupAccel, 1);
accel->cfgs = rd_cfg_array_from_list(arena, &cfgs_list);
accel->cmds = str8_array_from_list(arena, &cmds_list);
result.user_data = accel;
result.idxed_expr_count = accel->cfgs.count + accel->cmds.count;
} }
scratch_end(scratch); scratch_end(scratch);
return result; return result;
@@ -9011,15 +9038,27 @@ E_LOOKUP_ACCESS_FUNCTION_DEF(top_level_cfg)
if(kind == E_ExprKind_ArrayIndex) if(kind == E_ExprKind_ArrayIndex)
{ {
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
RD_CfgArray *cfgs = (RD_CfgArray *)user_data; RD_TopLevelCfgLookupAccel *accel = (RD_TopLevelCfgLookupAccel *)user_data;
Rng1U64 cmds_idx_range = r1u64(0, accel->cmds.count);
Rng1U64 cfgs_idx_range = r1u64(accel->cmds.count, accel->cmds.count + accel->cfgs.count);
E_IRTreeAndType rhs_irtree = e_irtree_and_type_from_expr(scratch.arena, rhs); E_IRTreeAndType rhs_irtree = e_irtree_and_type_from_expr(scratch.arena, rhs);
E_OpList rhs_oplist = e_oplist_from_irtree(scratch.arena, rhs_irtree.root); E_OpList rhs_oplist = e_oplist_from_irtree(scratch.arena, rhs_irtree.root);
String8 rhs_bytecode = e_bytecode_from_oplist(scratch.arena, &rhs_oplist); String8 rhs_bytecode = e_bytecode_from_oplist(scratch.arena, &rhs_oplist);
E_Interpretation rhs_interp = e_interpret(rhs_bytecode); E_Interpretation rhs_interp = e_interpret(rhs_bytecode);
E_Value rhs_value = rhs_interp.value; E_Value rhs_value = rhs_interp.value;
if(0 <= rhs_value.u64 && rhs_value.u64 < cfgs->count) if(contains_1u64(cmds_idx_range, rhs_value.u64))
{ {
RD_Cfg *cfg = cfgs->v[rhs_value.u64]; String8 cmd_name = accel->cmds.v[rhs_value.u64 - cmds_idx_range.min];
RD_CmdKind cmd_kind = rd_cmd_kind_from_string(cmd_name);
E_TypeKey type_key = e_type_key_basic(E_TypeKind_U64);
E_Space cmd_space = e_space_make(RD_EvalSpaceKind_MetaCmd);
result.irtree_and_type.root = e_irtree_set_space(arena, cmd_space, e_irtree_const_u(arena, cmd_kind));
result.irtree_and_type.type_key = type_key;
result.irtree_and_type.mode = E_Mode_Value;
}
else if(contains_1u64(cfgs_idx_range, rhs_value.u64))
{
RD_Cfg *cfg = accel->cfgs.v[rhs_value.u64 - cfgs_idx_range.min];
E_Space cfg_space = rd_eval_space_from_cfg(cfg); E_Space cfg_space = rd_eval_space_from_cfg(cfg);
String8 cfg_name = cfg->string; String8 cfg_name = cfg->string;
E_TypeKey cfg_type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, cfg_name); E_TypeKey cfg_type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, cfg_name);
@@ -12854,12 +12893,12 @@ rd_frame(void)
E_TypeKey location_type_key = {0}; E_TypeKey location_type_key = {0};
{ {
E_MemberList vaddr_range_members_list = {0}; E_MemberList vaddr_range_members_list = {0};
e_member_list_push_new(scratch.arena, &vaddr_range_members_list, .type_key = e_type_key_basic(E_TypeKind_U64), .name = str8_lit("min")); e_member_list_push_new(scratch.arena, &vaddr_range_members_list, .type_key = e_type_key_basic(E_TypeKind_U64), .name = str8_lit("min"), .off = 0);
e_member_list_push_new(scratch.arena, &vaddr_range_members_list, .type_key = e_type_key_basic(E_TypeKind_U64), .name = str8_lit("max")); e_member_list_push_new(scratch.arena, &vaddr_range_members_list, .type_key = e_type_key_basic(E_TypeKind_U64), .name = str8_lit("max"), .off = 8);
E_MemberArray vaddr_range_members = e_member_array_from_list(scratch.arena, &vaddr_range_members_list); E_MemberArray vaddr_range_members = e_member_array_from_list(scratch.arena, &vaddr_range_members_list);
bool_type_key = e_type_key_basic(E_TypeKind_Bool); bool_type_key = e_type_key_basic(E_TypeKind_Bool);
u64_type_key = e_type_key_basic(E_TypeKind_U64); u64_type_key = e_type_key_basic(E_TypeKind_U64);
vaddr_range_type_key = e_type_key_cons(E_TypeKind_Struct, .name = str8_lit("vaddr_range"), .count = vaddr_range_members.count, .members = vaddr_range_members.v); vaddr_range_type_key = e_type_key_cons(.kind = E_TypeKind_Struct, .name = str8_lit("vaddr_range"), .count = vaddr_range_members.count, .members = vaddr_range_members.v);
code_string_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), 1, E_TypeFlag_IsCodeText); code_string_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), 1, E_TypeFlag_IsCodeText);
path_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), 1, E_TypeFlag_IsPathText); path_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), 1, E_TypeFlag_IsPathText);
string_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), 1, E_TypeFlag_IsPlainText); string_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), 1, E_TypeFlag_IsPlainText);
+1
View File
@@ -96,6 +96,7 @@ enum
RD_EvalSpaceKind_CtrlEntity = E_SpaceKind_FirstUserDefined, RD_EvalSpaceKind_CtrlEntity = E_SpaceKind_FirstUserDefined,
RD_EvalSpaceKind_MetaCfg, RD_EvalSpaceKind_MetaCfg,
RD_EvalSpaceKind_MetaCtrlEntity, RD_EvalSpaceKind_MetaCtrlEntity,
RD_EvalSpaceKind_MetaCmd,
}; };
//////////////////////////////// ////////////////////////////////
+1 -1
View File
@@ -2497,7 +2497,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view
//- rjf: determine row's flags & color palette //- rjf: determine row's flags & color palette
// //
ProfBegin("determine row's flags & color palette"); ProfBegin("determine row's flags & color palette");
UI_BoxFlags row_flags = 0; UI_BoxFlags row_flags = UI_BoxFlag_DisableFocusOverlay;
UI_Palette *palette = ui_top_palette(); UI_Palette *palette = ui_top_palette();
{ {
if(row_is_fresh) if(row_is_fresh)
-17
View File
@@ -136,23 +136,6 @@ struct RD_WatchViewColumn
B32 rangify_braces; B32 rangify_braces;
}; };
typedef struct RD_WatchViewRowCtrl RD_WatchViewRowCtrl;
struct RD_WatchViewRowCtrl
{
RD_EntityKind entity_kind;
CTRL_EntityKind ctrl_entity_kind;
RD_CmdKind kind;
};
typedef enum RD_WatchViewRowKind
{
RD_WatchViewRowKind_Normal,
RD_WatchViewRowKind_Header,
RD_WatchViewRowKind_Canvas,
RD_WatchViewRowKind_PrettyEntityControls,
}
RD_WatchViewRowKind;
typedef struct RD_WatchPt RD_WatchPt; typedef struct RD_WatchPt RD_WatchPt;
struct RD_WatchPt struct RD_WatchPt
{ {