pass over row info building

This commit is contained in:
Ryan Fleury
2025-04-18 15:51:27 -07:00
parent f99d560b40
commit 225ac267f0
2 changed files with 361 additions and 317 deletions
+99 -54
View File
@@ -934,31 +934,54 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
.group_entity = &ctrl_entity_nil, .group_entity = &ctrl_entity_nil,
.callstack_thread = &ctrl_entity_nil, .callstack_thread = &ctrl_entity_nil,
.view_ui_rule = &rd_nil_view_ui_rule, .view_ui_rule = &rd_nil_view_ui_rule,
.view_ui_tag = &e_expr_nil,
}; };
{ {
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
DI_Scope *di_scope = di_scope_open();
// rjf: unpack key & block ////////////////////////////
EV_Block *block = row->block; //- rjf: unpack row's evaluation, key, & block info
//
E_Type *row_type = e_type_from_key__cached(row->eval.irtree.type_key);
EV_Key key = row->key; EV_Key key = row->key;
EV_Block *block = row->block;
E_Eval block_eval = row->block->eval; E_Eval block_eval = row->block->eval;
E_TypeKey block_type_key = block_eval.irtree.type_key; E_TypeKey block_type_key = block_eval.irtree.type_key;
E_TypeKind block_type_kind = e_type_kind_from_key(block_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); E_Type *block_type = e_type_from_key__cached(block_type_key);
RD_Cfg *evalled_cfg = rd_cfg_from_eval_space(row->eval.space);
CTRL_Entity *evalled_entity = (row->eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity ? rd_ctrl_entity_from_eval_space(row->eval.space) : &ctrl_entity_nil);
// rjf: determine if row's expression is editable ////////////////////////////
//- rjf: determine if this cfg/entity evaluation is top-level - e.g. if we
// are evaluating a cfg tree, or some descendant of it
//
B32 is_top_level = 0;
if(evalled_cfg != &rd_nil_cfg)
{
E_TypeKey top_level_type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, evalled_cfg->string);
is_top_level = (row->eval.value.u64 == 0 && e_type_key_match(top_level_type_key, row->eval.irtree.type_key));
}
if(evalled_entity != &ctrl_entity_nil)
{
String8 top_level_name = ctrl_entity_kind_code_name_table[evalled_entity->kind];
E_TypeKey top_level_type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, top_level_name);
is_top_level = (row->eval.value.u64 == 0 && e_type_key_match(top_level_type_key, row->eval.irtree.type_key));
}
////////////////////////////
//- rjf: fill if row's expression is editable
//
if(block_type->flags & E_TypeFlag_EditableChildren || row->eval.expr == &e_expr_nil) if(block_type->flags & E_TypeFlag_EditableChildren || row->eval.expr == &e_expr_nil)
{ {
info.expr_is_editable = 1; info.expr_is_editable = 1;
} }
// rjf: determine row's module ////////////////////////////
CTRL_Entity *row_ctrl_entity = rd_ctrl_entity_from_eval_space(row->eval.space); //- rjf: fill row's module
CTRL_Entity *row_module = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->module); //
if(row->eval.space.kind == RD_EvalSpaceKind_CtrlEntity) if(row->eval.space.kind == RD_EvalSpaceKind_CtrlEntity)
{ {
CTRL_Entity *row_ctrl_entity = rd_ctrl_entity_from_eval_space(row->eval.space);
switch(row_ctrl_entity->kind) switch(row_ctrl_entity->kind)
{ {
default: default:
@@ -976,12 +999,15 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
} }
} }
// rjf: determine call stack info ////////////////////////////
//- rjf: fill row's call stack info
//
if(block_eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity && str8_match(str8_lit("call_stack"), block_type->name, 0)) if(block_eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity && str8_match(str8_lit("call_stack"), block_type->name, 0))
{ {
CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(block_eval.space); CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(block_eval.space);
if(entity->kind == CTRL_EntityKind_Thread) if(entity->kind == CTRL_EntityKind_Thread)
{ {
DI_Scope *di_scope = di_scope_open();
info.callstack_thread = entity; info.callstack_thread = entity;
U64 frame_num = ev_block_num_from_id(block, key.child_id); U64 frame_num = ev_block_num_from_id(block, key.child_id);
CTRL_Unwind unwind = d_query_cached_unwind_from_thread(entity); CTRL_Unwind unwind = d_query_cached_unwind_from_thread(entity);
@@ -993,24 +1019,31 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
info.callstack_inline_depth = f->inline_depth; info.callstack_inline_depth = f->inline_depth;
info.callstack_vaddr = regs_rip_from_arch_block(entity->arch, f->regs); info.callstack_vaddr = regs_rip_from_arch_block(entity->arch, f->regs);
} }
di_scope_close(di_scope);
} }
} }
// rjf: determine ctrl entity ////////////////////////////
//- rjf: fill row's ctrl entity
//
if(block_type_kind == E_TypeKind_Set && (block_eval.space.kind == RD_EvalSpaceKind_MetaQuery || if(block_type_kind == E_TypeKind_Set && (block_eval.space.kind == RD_EvalSpaceKind_MetaQuery ||
block_eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity)) block_eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity))
{ {
info.group_entity = rd_ctrl_entity_from_eval_space(row->eval.space); info.group_entity = rd_ctrl_entity_from_eval_space(row->eval.space);
} }
// rjf: determine cfg group name / parent ////////////////////////////
//- rjf: fill row's cfg group name / parent
//
if(block_type_kind == E_TypeKind_Set && (block_eval.space.kind == RD_EvalSpaceKind_MetaQuery || if(block_type_kind == E_TypeKind_Set && (block_eval.space.kind == RD_EvalSpaceKind_MetaQuery ||
block_eval.space.kind == RD_EvalSpaceKind_MetaCfg)) block_eval.space.kind == RD_EvalSpaceKind_MetaCfg))
{ {
info.group_cfg_parent = rd_cfg_from_eval_space(block_eval.space); info.group_cfg_parent = rd_cfg_from_eval_space(block_eval.space);
} }
// rjf: determine group cfg name ////////////////////////////
//- rjf: fill row's group cfg name
//
if(block_type_kind == E_TypeKind_Set) if(block_type_kind == E_TypeKind_Set)
{ {
String8 singular_name = rd_singular_from_code_name_plural(block_type->name); String8 singular_name = rd_singular_from_code_name_plural(block_type->name);
@@ -1024,7 +1057,9 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
} }
} }
// rjf: determine row's group cfg ////////////////////////////
//- rjf: fill row's group cfg
//
if(info.group_cfg_name.size != 0 && (block_type->expand.id_from_num == E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(cfgs) || if(info.group_cfg_name.size != 0 && (block_type->expand.id_from_num == E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(cfgs) ||
block_type->expand.id_from_num == E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(watches) || block_type->expand.id_from_num == E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(watches) ||
block_type->expand.id_from_num == E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(environment))) block_type->expand.id_from_num == E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(environment)))
@@ -1033,29 +1068,14 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
info.group_cfg_child = rd_cfg_from_id(id); info.group_cfg_child = rd_cfg_from_id(id);
} }
// rjf: determine cfgs/entities that this row is evaluating ////////////////////////////
RD_Cfg *evalled_cfg = rd_cfg_from_eval_space(row->eval.space); //- rjf: fill row's view ui rule
CTRL_Entity *evalled_entity = (row->eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity ? rd_ctrl_entity_from_eval_space(row->eval.space) : &ctrl_entity_nil); //
// rjf: determine if this cfg/entity evaluation is top-level - e.g. if we
// are evaluating a cfg tree, or some descendant of it
B32 is_top_level = 0;
if(evalled_cfg != &rd_nil_cfg)
{
E_TypeKey top_level_type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, evalled_cfg->string);
is_top_level = (row->eval.value.u64 == 0 && e_type_key_match(top_level_type_key, row->eval.irtree.type_key));
}
if(evalled_entity != &ctrl_entity_nil)
{
String8 top_level_name = ctrl_entity_kind_code_name_table[evalled_entity->kind];
E_TypeKey top_level_type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, top_level_name);
is_top_level = (row->eval.value.u64 == 0 && e_type_key_match(top_level_type_key, row->eval.irtree.type_key));
}
// rjf: determine view ui rule
info.view_ui_rule = rd_view_ui_rule_from_string(row->block->viz_expand_rule->string); info.view_ui_rule = rd_view_ui_rule_from_string(row->block->viz_expand_rule->string);
// rjf: find possible table type ////////////////////////////
//- rjf: find possible table type
//
E_Type *maybe_table_type = block_type; E_Type *maybe_table_type = block_type;
for(;;) for(;;)
{ {
@@ -1075,11 +1095,10 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
} }
} }
// rjf: fill row's cells ////////////////////////////
{ //- rjf: @watch_row_build_cells table rows
//
if(0){} if(0){}
// rjf: table rows
else if(block->parent != &ev_nil_block && maybe_table_type->kind == E_TypeKind_Lens && str8_match(maybe_table_type->name, str8_lit("table"), 0) && maybe_table_type->count >= 1) else if(block->parent != &ev_nil_block && maybe_table_type->kind == E_TypeKind_Lens && str8_match(maybe_table_type->name, str8_lit("table"), 0) && maybe_table_type->count >= 1)
{ {
U64 column_count = maybe_table_type->count; U64 column_count = maybe_table_type->count;
@@ -1101,7 +1120,9 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
#undef take_pct #undef take_pct
} }
// rjf: folder / file rows ////////////////////////////
//- rjf: @watch_row_build_cells files / folders
//
else if(row->eval.space.kind == E_SpaceKind_FileSystem) else if(row->eval.space.kind == E_SpaceKind_FileSystem)
{ {
E_Type *type = e_type_from_key__cached(row->eval.irtree.type_key); E_Type *type = e_type_from_key__cached(row->eval.irtree.type_key);
@@ -1132,7 +1153,9 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
} }
} }
// rjf: singular button for unattached processes ////////////////////////////
//- rjf: @watch_row_build_cells unattached processes
//
else if(row->eval.space.kind == RD_EvalSpaceKind_MetaUnattachedProcess) else if(row->eval.space.kind == RD_EvalSpaceKind_MetaUnattachedProcess)
{ {
E_Type *type = e_type_from_key__cached(row->eval.irtree.type_key); E_Type *type = e_type_from_key__cached(row->eval.irtree.type_key);
@@ -1158,14 +1181,18 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
} }
} }
// rjf: lister rows ////////////////////////////
//- rjf: @watch_row_build_cells lister rows
//
else if(rd_cfg_child_from_string(rd_cfg_from_id(rd_regs()->view), str8_lit("lister")) != &rd_nil_cfg) else if(rd_cfg_child_from_string(rd_cfg_from_id(rd_regs()->view), str8_lit("lister")) != &rd_nil_cfg)
{ {
info.can_expand = 0; info.can_expand = 0;
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Expr, .flags = RD_WatchCellFlag_Button|RD_WatchCellFlag_Indented, .pct = 1.f); rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Expr, .flags = RD_WatchCellFlag_Button|RD_WatchCellFlag_Indented, .pct = 1.f);
} }
// rjf: top-level cfg rows ////////////////////////////
//- rjf: @watch_row_build_cells top-level cfg evaluations
//
else if(is_top_level && evalled_cfg != &rd_nil_cfg) else if(is_top_level && evalled_cfg != &rd_nil_cfg)
{ {
RD_Cfg *cfg = evalled_cfg; RD_Cfg *cfg = evalled_cfg;
@@ -1230,7 +1257,9 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
} }
} }
// rjf: top-level entity rows ////////////////////////////
//- rjf: @watch_row_build_cells ctrl entity evaluations
//
else if(is_top_level && evalled_entity != &ctrl_entity_nil) else if(is_top_level && evalled_entity != &ctrl_entity_nil)
{ {
CTRL_Entity *entity = evalled_entity; CTRL_Entity *entity = evalled_entity;
@@ -1255,13 +1284,17 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
} }
} }
// rjf: singular row for queries ////////////////////////////
//- rjf: @watch_row_build_cells queries
//
else if(row->eval.space.kind == RD_EvalSpaceKind_MetaQuery) else if(row->eval.space.kind == RD_EvalSpaceKind_MetaQuery)
{ {
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Expr, .flags = RD_WatchCellFlag_Indented, .pct = 1.f); rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Expr, .flags = RD_WatchCellFlag_Indented, .pct = 1.f);
} }
// rjf: singular button for commands ////////////////////////////
//- rjf: @watch_row_build_cells commands
//
else if(row->eval.space.kind == RD_EvalSpaceKind_MetaCmd) else if(row->eval.space.kind == RD_EvalSpaceKind_MetaCmd)
{ {
E_Type *type = e_type_from_key__cached(row->eval.irtree.type_key); E_Type *type = e_type_from_key__cached(row->eval.irtree.type_key);
@@ -1277,19 +1310,25 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
} }
} }
// rjf: singular cell for view ui ////////////////////////////
//- rjf: @watch_row_build_cells view UI escape hatch
//
else if(info.view_ui_rule != &rd_nil_view_ui_rule) else if(info.view_ui_rule != &rd_nil_view_ui_rule)
{ {
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_ViewUI, .pct = 1.f); rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_ViewUI, .pct = 1.f);
} }
// rjf: for 'add-new' rows in meta-cfg evaluation spaces, only do expr ////////////////////////////
//- rjf: @watch_row_build_cells "add new" expression rows
//
else if(row->eval.expr == &e_expr_nil && info.group_cfg_name.size != 0 && info.group_cfg_child == &rd_nil_cfg) else if(row->eval.expr == &e_expr_nil && info.group_cfg_name.size != 0 && info.group_cfg_child == &rd_nil_cfg)
{ {
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Expr, .flags = RD_WatchCellFlag_Indented, .pct = 1.f); rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Expr, .flags = RD_WatchCellFlag_Indented, .pct = 1.f);
} }
// rjf: for meta-evaluation space booleans, only do expr ////////////////////////////
//- rjf: @watch_row_build_cells meta-evaluation booleans
//
else if(e_type_kind_from_key(row->eval.irtree.type_key) == E_TypeKind_Bool && else if(e_type_kind_from_key(row->eval.irtree.type_key) == E_TypeKind_Bool &&
(row->eval.space.kind == RD_EvalSpaceKind_MetaCfg || (row->eval.space.kind == RD_EvalSpaceKind_MetaCfg ||
row->eval.space.kind == RD_EvalSpaceKind_MetaCmd || row->eval.space.kind == RD_EvalSpaceKind_MetaCmd ||
@@ -1298,7 +1337,9 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Expr, .flags = RD_WatchCellFlag_Indented, .pct = 1.f); rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Expr, .flags = RD_WatchCellFlag_Indented, .pct = 1.f);
} }
// rjf: for meta-cfg evaluation spaces, only do expr/value ////////////////////////////
//- rjf: @watch_row_build_cells meta-evaluation catch-all: expression / value
//
else if(row->eval.space.kind == RD_EvalSpaceKind_MetaCfg || else if(row->eval.space.kind == RD_EvalSpaceKind_MetaCfg ||
row->eval.space.kind == RD_EvalSpaceKind_MetaCmd || row->eval.space.kind == RD_EvalSpaceKind_MetaCmd ||
row->eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity || row->eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity ||
@@ -1320,7 +1361,9 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
#undef take_pct #undef take_pct
} }
// rjf: procedures collections get only expr/value ////////////////////////////
//- rjf: @watch_row_build_cells procedures (expr & eval, mostly expr)
//
else if(block_type->kind == E_TypeKind_Set && str8_match(block_type->name, str8_lit("procedures"), 0)) else if(block_type->kind == E_TypeKind_Set && str8_match(block_type->name, str8_lit("procedures"), 0))
{ {
info.cell_style_key = str8_lit("procedure_expr_eval"); info.cell_style_key = str8_lit("procedure_expr_eval");
@@ -1334,7 +1377,9 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
#undef take_pct #undef take_pct
} }
// rjf: callstack frames ////////////////////////////
//- rjf: @watch_row_build_cells call stack frames
//
else if(info.callstack_thread != &ctrl_entity_nil) else if(info.callstack_thread != &ctrl_entity_nil)
{ {
info.cell_style_key = str8_lit("call_stack_frame"); info.cell_style_key = str8_lit("call_stack_frame");
@@ -1361,7 +1406,9 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
#undef take_pct #undef take_pct
} }
// rjf: default cells ////////////////////////////
//- rjf: @watch_row_build_cells catchall (normal rows)
//
else else
{ {
info.cell_style_key = str8_lit("normal"); info.cell_style_key = str8_lit("normal");
@@ -1375,9 +1422,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .string = str8_lit("typeof(raw($expr))"), .default_pct = 0.25f, .pct = take_pct()); rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .string = str8_lit("typeof(raw($expr))"), .default_pct = 0.25f, .pct = take_pct());
#undef take_pct #undef take_pct
} }
}
di_scope_close(di_scope);
scratch_end(scratch); scratch_end(scratch);
} }
return info; return info;
-1
View File
@@ -103,7 +103,6 @@ struct RD_WatchRowInfo
String8 cell_style_key; String8 cell_style_key;
RD_WatchCellList cells; RD_WatchCellList cells;
RD_ViewUIRule *view_ui_rule; RD_ViewUIRule *view_ui_rule;
E_Expr *view_ui_tag;
}; };
typedef struct RD_WatchRowCellInfo RD_WatchRowCellInfo; typedef struct RD_WatchRowCellInfo RD_WatchRowCellInfo;