call stack info extraction in watch row building; special style for call stack frames

This commit is contained in:
Ryan Fleury
2025-02-12 17:39:17 -08:00
parent f165eb7b8e
commit 374317abd7
3 changed files with 55 additions and 17 deletions
+4 -2
View File
@@ -8630,7 +8630,7 @@ E_LOOKUP_ACCESS_FUNCTION_DEF(thread)
{ {
E_Eval eval = e_eval_from_expr(scratch.arena, lhs); E_Eval eval = e_eval_from_expr(scratch.arena, lhs);
CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(eval.space); CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(eval.space);
result.irtree_and_type.root = e_irtree_set_space(arena, eval.space, e_irtree_leaf_u128(arena, u128_make(entity->handle.machine_id, entity->handle.dmn_handle.u64[0]))); result.irtree_and_type.root = e_irtree_set_space(arena, e_space_make(RD_EvalSpaceKind_MetaCtrlEntity), e_irtree_leaf_u128(arena, u128_make(entity->handle.machine_id, entity->handle.dmn_handle.u64[0])));
result.irtree_and_type.type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = str8_lit("call_stack")); result.irtree_and_type.type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = str8_lit("call_stack"));
result.irtree_and_type.mode = E_Mode_Offset; result.irtree_and_type.mode = E_Mode_Offset;
} }
@@ -8734,7 +8734,7 @@ E_LOOKUP_ACCESS_FUNCTION_DEF(target)
{ {
E_Eval eval = e_eval_from_expr(scratch.arena, lhs); E_Eval eval = e_eval_from_expr(scratch.arena, lhs);
RD_Cfg *cfg = rd_cfg_from_eval_space(eval.space); RD_Cfg *cfg = rd_cfg_from_eval_space(eval.space);
result.irtree_and_type.root = e_irtree_set_space(arena, eval.space, e_irtree_const_u(arena, cfg->id)); result.irtree_and_type.root = e_irtree_set_space(arena, e_space_make(RD_EvalSpaceKind_MetaCfgCollection), e_irtree_const_u(arena, cfg->id));
result.irtree_and_type.type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = str8_lit("environment")); result.irtree_and_type.type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = str8_lit("environment"));
result.irtree_and_type.mode = E_Mode_Offset; result.irtree_and_type.mode = E_Mode_Offset;
} }
@@ -12487,6 +12487,7 @@ rd_frame(void)
String8 collection_name = str8_lit("watches"); String8 collection_name = str8_lit("watches");
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name); expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name);
expr->space = e_space_make(RD_EvalSpaceKind_MetaCfgCollection);
e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr); e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr);
e_lookup_rule_map_insert_new(scratch.arena, ctx->lookup_rule_map, collection_name, e_lookup_rule_map_insert_new(scratch.arena, ctx->lookup_rule_map, collection_name,
.info = E_LOOKUP_INFO_FUNCTION_NAME(watches), .info = E_LOOKUP_INFO_FUNCTION_NAME(watches),
@@ -12564,6 +12565,7 @@ rd_frame(void)
E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name); E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name);
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
expr->type_key = collection_type_key; expr->type_key = collection_type_key;
expr->space = e_space_make(RD_EvalSpaceKind_MetaCfgCollection);
e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr); e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr);
e_lookup_rule_map_insert_new(scratch.arena, ctx->lookup_rule_map, collection_name, e_lookup_rule_map_insert_new(scratch.arena, ctx->lookup_rule_map, collection_name,
.info = E_LOOKUP_INFO_FUNCTION_NAME(top_level_cfg), .info = E_LOOKUP_INFO_FUNCTION_NAME(top_level_cfg),
+1
View File
@@ -83,6 +83,7 @@ enum
{ {
RD_EvalSpaceKind_CtrlEntity = E_SpaceKind_FirstUserDefined, RD_EvalSpaceKind_CtrlEntity = E_SpaceKind_FirstUserDefined,
RD_EvalSpaceKind_MetaCfg, RD_EvalSpaceKind_MetaCfg,
RD_EvalSpaceKind_MetaCfgCollection,
RD_EvalSpaceKind_MetaCtrlEntity, RD_EvalSpaceKind_MetaCtrlEntity,
RD_EvalSpaceKind_MetaCmd, RD_EvalSpaceKind_MetaCmd,
}; };
+43 -8
View File
@@ -908,6 +908,10 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
EV_Key key = row->key; EV_Key key = row->key;
E_IRTreeAndType parent_irtree = e_irtree_and_type_from_expr(scratch.arena, block->expr); E_IRTreeAndType parent_irtree = e_irtree_and_type_from_expr(scratch.arena, block->expr);
E_Type *parent_type = e_type_from_key__cached(parent_irtree.type_key); E_Type *parent_type = e_type_from_key__cached(parent_irtree.type_key);
E_Eval block_eval = e_eval_from_expr(scratch.arena, row->block->expr);
E_TypeKey block_type_key = block_eval.type_key;
E_TypeKind block_type_kind = e_type_kind_from_key(block_type_key);
E_Type *block_type = e_type_from_key__cached(block_type_key);
// rjf: fill row's eval // rjf: fill row's eval
info.eval = e_eval_from_expr(arena, row->expr); info.eval = e_eval_from_expr(arena, row->expr);
@@ -934,15 +938,32 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
} }
} }
// rjf: determine cfg group name / parent // rjf: determine call stack info
if(block_eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity && block_type_kind == E_TypeKind_Set)
{ {
E_Eval block_eval = e_eval_from_expr(scratch.arena, row->block->expr); CTRL_Handle handle = {0};
E_TypeKey block_type_key = block_eval.type_key; handle.machine_id = (CTRL_MachineID)block_eval.value.u128.u64[0];
E_TypeKind block_type_kind = e_type_kind_from_key(block_type_key); handle.dmn_handle.u64[0] = (U64)block_eval.value.u128.u64[1];
if(block_type_kind == E_TypeKind_Set) CTRL_Entity *entity = ctrl_entity_from_handle(d_state->ctrl_entity_store, handle);
if(entity->kind == CTRL_EntityKind_Thread)
{
info.callstack_thread = entity;
U64 frame_num = block->lookup_rule->num_from_id(key.child_id, block->lookup_rule_user_data);
CTRL_Unwind unwind = d_query_cached_unwind_from_thread(entity);
CTRL_CallStack call_stack = ctrl_call_stack_from_unwind(scratch.arena, di_scope, ctrl_process_from_entity(entity), &unwind);
if(1 <= frame_num && frame_num <= call_stack.count)
{
CTRL_CallStackFrame *f = &call_stack.frames[frame_num-1];
info.callstack_unwind_index = f->unwind_count;
info.callstack_inline_depth = f->inline_depth;
}
}
}
// rjf: determine cfg group name / parent
if(block_type_kind == E_TypeKind_Set && block_eval.space.kind == RD_EvalSpaceKind_MetaCfgCollection)
{ {
info.group_cfg_parent = rd_cfg_from_id(block_eval.value.u64); info.group_cfg_parent = rd_cfg_from_id(block_eval.value.u64);
E_Type *block_type = e_type_from_key__cached(block_type_key);
String8 singular_name = rd_singular_from_code_name_plural(block_type->name); String8 singular_name = rd_singular_from_code_name_plural(block_type->name);
if(singular_name.size != 0) if(singular_name.size != 0)
{ {
@@ -953,7 +974,6 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
info.group_cfg_name = block_type->name; info.group_cfg_name = block_type->name;
} }
} }
}
// rjf: determine row's cfg // rjf: determine row's cfg
if(info.group_cfg_name.size != 0) if(info.group_cfg_name.size != 0)
@@ -1023,7 +1043,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
} }
// rjf: for meta-cfg evaluation spaces, only do expr/value // rjf: for meta-cfg evaluation spaces, only do expr/value
else if(info.eval.space.kind == RD_EvalSpaceKind_MetaCfg) else if(info.eval.space.kind == RD_EvalSpaceKind_MetaCfg || info.eval.space.kind == RD_EvalSpaceKind_MetaCfgCollection)
{ {
info.cell_style_key = str8_lit("expr_and_eval"); info.cell_style_key = str8_lit("expr_and_eval");
RD_Cfg *view = rd_cfg_from_id(rd_regs()->view); RD_Cfg *view = rd_cfg_from_id(rd_regs()->view);
@@ -1036,6 +1056,20 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
#undef take_pct #undef take_pct
} }
// rjf: callstack frames
else if(info.callstack_thread != &ctrl_entity_nil)
{
info.cell_style_key = str8_lit("call_stack_frame");
RD_Cfg *view = rd_cfg_from_id(rd_regs()->view);
RD_Cfg *style = rd_cfg_child_from_string(view, info.cell_style_key);
RD_Cfg *w_cfg = style->first;
F32 next_pct = 0;
#define take_pct() (next_pct = (F32)f64_from_str8(w_cfg->string), w_cfg = w_cfg->next, next_pct)
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .default_pct = 0.65f, .pct = take_pct());
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .string = str8_lit("(U64)($expr) => hex"), .default_pct = 0.35f, .pct = take_pct());
#undef take_pct
}
// rjf: default cells // rjf: default cells
else else
{ {
@@ -1239,6 +1273,7 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla
B32 is_non_code = 0; B32 is_non_code = 0;
String8 string = push_str8f(arena, ".%S", member_name); String8 string = push_str8f(arena, ".%S", member_name);
if(row_eval.space.kind == RD_EvalSpaceKind_MetaCfg || if(row_eval.space.kind == RD_EvalSpaceKind_MetaCfg ||
row_eval.space.kind == RD_EvalSpaceKind_MetaCfgCollection ||
row_eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity) row_eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity)
{ {
String8 fancy_name = rd_display_from_code_name(member_name); String8 fancy_name = rd_display_from_code_name(member_name);