@@ -9161,6 +9161,45 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(procedures) {return rd_ev_
91619161EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(procedures) {return rd_ev_view_rule_expr_id_from_num__debug_info_tables(num, user_data, RDI_SectionKind_Procedures); }
91629162EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(procedures) {return rd_ev_view_rule_expr_num_from_id__debug_info_tables(id, user_data, RDI_SectionKind_Procedures); }
91639163
9164+ E_LOOKUP_INFO_FUNCTION_DEF(watch_group)
9165+ {
9166+ E_LookupInfo result = {0};
9167+ Temp scratch = scratch_begin(&arena, 1);
9168+ {
9169+ RD_CfgList cfgs_list = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("watch"));
9170+ RD_CfgArray *cfgs = push_array(arena, RD_CfgArray, 1);
9171+ cfgs[0] = rd_cfg_array_from_list(arena, &cfgs_list);
9172+ result.user_data = cfgs;
9173+ result.idxed_expr_count = cfgs_list.count;
9174+ }
9175+ scratch_end(scratch);
9176+ return result;
9177+ }
9178+
9179+ E_LOOKUP_FUNCTION_DEF(watch_group)
9180+ {
9181+ E_Lookup result = {{&e_irnode_nil}};
9182+ if(kind == E_ExprKind_ArrayIndex)
9183+ {
9184+ Temp scratch = scratch_begin(&arena, 1);
9185+ RD_CfgArray *cfgs = (RD_CfgArray *)user_data;
9186+ E_IRTreeAndType rhs_irtree = e_irtree_and_type_from_expr(scratch.arena, rhs);
9187+ E_OpList rhs_oplist = e_oplist_from_irtree(scratch.arena, rhs_irtree.root);
9188+ String8 rhs_bytecode = e_bytecode_from_oplist(scratch.arena, &rhs_oplist);
9189+ E_Interpretation rhs_interp = e_interpret(rhs_bytecode);
9190+ E_Value rhs_value = rhs_interp.value;
9191+ if(0 <= rhs_value.u64 && rhs_value.u64 < cfgs->count)
9192+ {
9193+ RD_Cfg *watch = cfgs->v[rhs_value.u64];
9194+ String8 expr_string = rd_cfg_child_from_string(watch, str8_lit("expression"))->first->string;
9195+ E_Expr *expr = e_parse_expr_from_text(arena, expr_string);
9196+ result.irtree_and_type = e_irtree_and_type_from_expr(arena, expr);
9197+ }
9198+ scratch_end(scratch);
9199+ }
9200+ return result;
9201+ }
9202+
91649203E_LOOKUP_INFO_FUNCTION_DEF(top_level_cfg)
91659204{
91669205 E_LookupInfo result = {0};
@@ -9169,7 +9208,8 @@ E_LOOKUP_INFO_FUNCTION_DEF(top_level_cfg)
91699208 E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(scratch.arena, lhs);
91709209 E_TypeKey lhs_type_key = lhs_irtree.type_key;
91719210 E_Type *lhs_type = e_type_from_key(scratch.arena, lhs_type_key);
9172- RD_CfgList cfgs_list = rd_cfg_top_level_list_from_string(scratch.arena, lhs_type->name);
9211+ String8 cfg_name = rd_singular_from_code_name_plural(lhs_type->name);
9212+ RD_CfgList cfgs_list = rd_cfg_top_level_list_from_string(scratch.arena, cfg_name);
91739213 RD_CfgArray *cfgs = push_array(arena, RD_CfgArray, 1);
91749214 cfgs[0] = rd_cfg_array_from_list(arena, &cfgs_list);
91759215 result.user_data = cfgs;
@@ -9660,22 +9700,11 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul
96609700 }
96619701 }
96629702
9663- //- rjf: member evaluations -> display member info
9664- if(eval.mode == E_Mode_Null && !e_type_key_match(e_type_key_zero(), eval.type_key) && member != &e_member_nil)
9665- {
9666- U64 member_byte_size = e_type_byte_size_from_key(eval.type_key);
9667- String8 offset_string = str8_from_u64(arena, member->off, radix, 0, 0);
9668- String8 size_string = str8_from_u64(arena, member_byte_size, radix, 0, 0);
9669- str8_list_pushf(arena, out, "member (%S offset, %S byte%s)", offset_string, size_string, member_byte_size == 1 ? "" : "s");
9670- }
9671-
9672- //- rjf: type evaluations -> display type basic information
9673- else if(eval.mode == E_Mode_Null && !e_type_key_match(e_type_key_zero(), eval.type_key) && eval.expr->kind != E_ExprKind_MemberAccess)
9703+ //- rjf: type evaluations -> display type string
9704+ if(eval.mode == E_Mode_Null && !e_type_key_match(e_type_key_zero(), eval.type_key))
96749705 {
9675- String8 basic_type_kind_string = e_kind_basic_string_table[e_type_kind_from_key(eval.type_key)];
9676- U64 byte_size = e_type_byte_size_from_key(eval.type_key);
9677- String8 size_string = str8_from_u64(arena, byte_size, radix, 0, 0);
9678- str8_list_pushf(arena, out, "%S (%S byte%s)", basic_type_kind_string, size_string, byte_size == 1 ? "" : "s");
9706+ String8 string = e_type_string_from_key(arena, eval.type_key);
9707+ str8_list_push(arena, out, string);
96799708 }
96809709
96819710 //- rjf: value/offset evaluations
@@ -11945,6 +11974,21 @@ rd_vocabulary_info_from_code_name(String8 code_name)
1194511974 return info;
1194611975}
1194711976
11977+ internal RD_VocabularyInfo *
11978+ rd_vocabulary_info_from_code_name_plural(String8 code_name_plural)
11979+ {
11980+ RD_VocabularyInfo *info = &rd_nil_vocabulary_info;
11981+ for EachElement(idx, rd_vocabulary_info_table)
11982+ {
11983+ if(str8_match(rd_vocabulary_info_table[idx].code_name_plural, code_name_plural, 0))
11984+ {
11985+ info = &rd_vocabulary_info_table[idx];
11986+ break;
11987+ }
11988+ }
11989+ return info;
11990+ }
11991+
1194811992////////////////////////////////
1194911993//~ rjf: Continuous Frame Requests
1195011994
@@ -13163,7 +13207,6 @@ rd_frame(void)
1316313207 //- rjf: choose set of evallable config names
1316413208 String8 evallable_cfg_names[] =
1316513209 {
13166- str8_lit("watch"),
1316713210 str8_lit("breakpoint"),
1316813211 str8_lit("watch_pin"),
1316913212 str8_lit("target"),
@@ -13340,6 +13383,16 @@ rd_frame(void)
1334013383 }
1334113384 }
1334213385
13386+ //- rjf: add macros for watch groups
13387+ {
13388+ String8 collection_name = str8_lit("watches");
13389+ E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name);
13390+ E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
13391+ expr->type_key = collection_type_key;
13392+ e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr);
13393+ e_lookup_rule_map_insert_new(scratch.arena, ctx->lookup_rule_map, collection_name, E_LOOKUP_INFO_FUNCTION_NAME(watch_group), E_LOOKUP_FUNCTION_NAME(watch_group));
13394+ }
13395+
1334313396 //- rjf: add macros for collections (new @cfg)
1334413397 for EachElement(cfg_name_idx, evallable_cfg_names)
1334513398 {
@@ -13835,6 +13888,15 @@ rd_frame(void)
1383513888 rd_cfg_release(recent_projects.last->v);
1383613889 }
1383713890 }
13891+
13892+ //- TODO(rjf): @cfg set up debugging config state
13893+ if(kind == RD_CmdKind_OpenUser)
13894+ {
13895+ RD_Cfg *user = rd_cfg_child_from_string(rd_state->root_cfg, str8_lit("user"));
13896+ RD_Cfg *watch = rd_cfg_new(user, str8_lit("watch"));
13897+ RD_Cfg *expr = rd_cfg_new(watch, str8_lit("expression"));
13898+ rd_cfg_new(expr, str8_lit("basics"));
13899+ }
1383813900 }break;
1383913901
1384013902 //- rjf: writing config changes
0 commit comments