diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index bd4e9f37..5d487bd6 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -569,6 +569,22 @@ ctrl_entity_list_from_handle_list(Arena *arena, CTRL_EntityStore *store, CTRL_Ha return result; } +//- rjf: entity array data structure + +internal CTRL_EntityArray +ctrl_entity_array_from_list(Arena *arena, CTRL_EntityList *list) +{ + CTRL_EntityArray result = {0}; + result.count = list->count; + result.v = push_array_no_zero(arena, CTRL_Entity *, result.count); + U64 idx = 0; + for(CTRL_EntityNode *n = list->first; n != 0; n = n->next, idx += 1) + { + result.v[idx] = n->v; + } + return result; +} + //- rjf: cache creation/destruction internal CTRL_EntityStore * diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 93ac10c5..5e02713c 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -160,6 +160,13 @@ struct CTRL_EntityList U64 count; }; +typedef struct CTRL_EntityArray CTRL_EntityArray; +struct CTRL_EntityArray +{ + CTRL_Entity **v; + U64 count; +}; + typedef struct CTRL_EntityRec CTRL_EntityRec; struct CTRL_EntityRec { @@ -806,6 +813,9 @@ internal void ctrl_entity_list_push(Arena *arena, CTRL_EntityList *list, CTRL_En internal CTRL_EntityList ctrl_entity_list_from_handle_list(Arena *arena, CTRL_EntityStore *store, CTRL_HandleList *list); #define ctrl_entity_list_first(list) ((list)->first ? (list)->first->v : &ctrl_entity_nil) +//- rjf: entity array data structure +internal CTRL_EntityArray ctrl_entity_array_from_list(Arena *arena, CTRL_EntityList *list); + //- rjf: cache creation/destruction internal CTRL_EntityStore *ctrl_entity_store_alloc(void); internal void ctrl_entity_store_release(CTRL_EntityStore *store); diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 4e0a098c..a08dd1e9 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -1272,7 +1272,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) //- rjf: leaf identifiers case E_ExprKind_LeafIdent: { - E_Expr *macro_expr = e_expr_from_string(e_ir_ctx->macro_map, expr->string); + E_Expr *macro_expr = e_string2expr_lookup(e_ir_ctx->macro_map, expr->string); if(macro_expr == &e_expr_nil) { e_msgf(arena, &result.msgs, E_MsgKind_ResolutionFailure, expr->location, "`%S` could not be found.", expr->string); diff --git a/src/eval/eval_parse.c b/src/eval/eval_parse.c index 7b0d69ec..f73a7061 100644 --- a/src/eval/eval_parse.c +++ b/src/eval/eval_parse.c @@ -190,7 +190,7 @@ e_string2expr_map_dec_poison(E_String2ExprMap *map, String8 string) } internal E_Expr * -e_expr_from_string(E_String2ExprMap *map, String8 string) +e_string2expr_lookup(E_String2ExprMap *map, String8 string) { E_Expr *expr = &e_expr_nil; if(map->slots_count != 0) @@ -2066,3 +2066,13 @@ e_parse_expr_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens) E_Parse parse = e_parse_expr_from_text_tokens__prec(arena, text, tokens, e_max_precedence); return parse; } + +internal E_Expr * +e_parse_expr_from_text(Arena *arena, String8 text) +{ + Temp scratch = scratch_begin(&arena, 1); + E_TokenArray tokens = e_token_array_from_text(scratch.arena, text); + E_Parse parse = e_parse_expr_from_text_tokens(arena, text, &tokens); + scratch_end(scratch); + return parse.expr; +} diff --git a/src/eval/eval_parse.h b/src/eval/eval_parse.h index f1248d8a..6d4ff39d 100644 --- a/src/eval/eval_parse.h +++ b/src/eval/eval_parse.h @@ -185,7 +185,7 @@ internal E_String2ExprMap e_string2expr_map_make(Arena *arena, U64 slot_count); internal void e_string2expr_map_insert(Arena *arena, E_String2ExprMap *map, String8 string, E_Expr *expr); internal void e_string2expr_map_inc_poison(E_String2ExprMap *map, String8 string); internal void e_string2expr_map_dec_poison(E_String2ExprMap *map, String8 string); -internal E_Expr *e_expr_from_string(E_String2ExprMap *map, String8 string); +internal E_Expr *e_string2expr_lookup(E_String2ExprMap *map, String8 string); //////////////////////////////// //~ rjf: Debug-Info-Driven Map Building Functions @@ -239,5 +239,6 @@ internal void e_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, E_String internal E_Parse e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens); internal E_Parse e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *tokens, S64 max_precedence); internal E_Parse e_parse_expr_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens); +internal E_Expr *e_parse_expr_from_text(Arena *arena, String8 text); #endif // EVAL_PARSE_H diff --git a/src/eval_visualization/eval_visualization.mdesk b/src/eval_visualization/eval_visualization.mdesk index 9ce37cca..4b98d606 100644 --- a/src/eval_visualization/eval_visualization.mdesk +++ b/src/eval_visualization/eval_visualization.mdesk @@ -113,12 +113,13 @@ EV_ViewRuleTable: @gen { @expand(EV_ViewRuleTable a) `$(a.xr == "x" -> "EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(" .. a.name_lower .. ");")`; - @expand(EV_ViewRuleTable a) `$(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_DEF(" .. a.name_lower .. ");")`; + @expand(EV_ViewRuleTable a) `$(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(" .. a.name_lower .. ");")`; + @expand(EV_ViewRuleTable a) `$(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(" .. a.name_lower .. ");")`; @expand(EV_ViewRuleTable a) `$(a.vb == "x" -> "EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(" .. a.name_lower .. ");")`; } @data(EV_ViewRuleInfo) @c_file ev_builtin_view_rule_info_table: { @expand(EV_ViewRuleTable a) - ```{str8_lit_comp("$(a.string)"), (EV_ViewRuleInfoFlag_Inherited*$(a.ih == "x"))|(EV_ViewRuleInfoFlag_Expandable*$(a.ex == "x")), $(a.xr == "x" -> "EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME("..a.name_lower..")") $(a.xr != "x" -> 0), $(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_NAME("..a.name_lower..")") $(a.xe != "x" -> 0), $(a.vb == "x" -> "EV_VIEW_RULE_BLOCK_PROD_FUNCTION_NAME("..a.name_lower..")") $(a.vb != "x" -> 0), }```; + ```{str8_lit_comp("$(a.string)"), (EV_ViewRuleInfoFlag_Inherited*$(a.ih == "x"))|(EV_ViewRuleInfoFlag_Expandable*$(a.ex == "x")), $(a.xr == "x" -> "EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME("..a.name_lower..")") $(a.xr != "x" -> 0), $(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME("..a.name_lower..")") $(a.xe != "x" -> 0), $(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME("..a.name_lower..")") $(a.xe != "x" -> 0), $(a.vb == "x" -> "EV_VIEW_RULE_BLOCK_PROD_FUNCTION_NAME("..a.name_lower..")") $(a.vb != "x" -> 0), }```; } diff --git a/src/eval_visualization/eval_visualization_builtin_view_rules.c b/src/eval_visualization/eval_visualization_builtin_view_rules.c index de0a3239..914bb420 100644 --- a/src/eval_visualization/eval_visualization_builtin_view_rules.c +++ b/src/eval_visualization/eval_visualization_builtin_view_rules.c @@ -99,11 +99,21 @@ ev_arch_from_eval_params(E_Eval eval, MD_Node *params) //////////////////////////////// //~ rjf: default -EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_DEF(default) +typedef struct EV_DefaultExpandAccel EV_DefaultExpandAccel; +struct EV_DefaultExpandAccel +{ + E_MemberArray members; + E_EnumValArray enum_vals; + U64 array_count; + B32 array_need_extra_deref; + B32 is_ptr2ptr; +}; + +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(default) { - EV_ExpandResult result = {0}; Temp scratch = scratch_begin(&arena, 1); - U64 needed_row_count = dim_1u64(idx_range); + U64 total_row_count = 0; + EV_DefaultExpandAccel *accel = push_array(arena, EV_DefaultExpandAccel, 1); //////////////////////////// //- rjf: unpack expression type info @@ -124,19 +134,8 @@ EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_DEF(default) direct_type_kind == E_TypeKind_Union || direct_type_kind == E_TypeKind_Class))) { - E_MemberArray members = e_type_data_members_from_key__cached(e_type_kind_is_pointer_or_ref(type_kind) ? direct_type_key : type_key); - result.total_semantic_row_count = result.total_visual_row_count = members.count; - result.row_exprs_count = Min(needed_row_count, members.count); - result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); - result.row_members = push_array(arena, E_Member *, result.row_exprs_count); - result.row_exprs_num_visual_rows = push_array(arena, U64, result.row_exprs_count); - for EachIndex(row_expr_idx, result.row_exprs_count) - { - E_Member *member = &members.v[idx_range.min + row_expr_idx]; - result.row_exprs[row_expr_idx] = e_expr_ref_member_access(arena, expr, member->name); - result.row_members[row_expr_idx] = member; - result.row_exprs_num_visual_rows[row_expr_idx] = 1; - } + accel->members = e_type_data_members_from_key__cached(e_type_kind_is_pointer_or_ref(type_kind) ? direct_type_key : type_key); + total_row_count = accel->members.count; } //////////////////////////// @@ -146,18 +145,9 @@ EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_DEF(default) (e_type_kind_is_pointer_or_ref(type_kind) && direct_type_kind == E_TypeKind_Enum)) { E_Type *type = e_type_from_key(arena, e_type_kind_is_pointer_or_ref(type_kind) ? direct_type_key : type_key); - result.total_semantic_row_count = result.total_visual_row_count = type->count; - result.row_exprs_count = Min(needed_row_count, type->count); - result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); - result.row_members = push_array(arena, E_Member *, result.row_exprs_count); - result.row_exprs_num_visual_rows = push_array(arena, U64, result.row_exprs_count); - for EachIndex(row_expr_idx, result.row_exprs_count) - { - E_EnumVal *enumval = &type->enum_vals[idx_range.min + row_expr_idx]; - result.row_exprs[row_expr_idx] = e_expr_ref_member_access(arena, expr, enumval->name); - result.row_members[row_expr_idx] = &e_member_nil; - result.row_exprs_num_visual_rows[row_expr_idx] = 1; - } + accel->enum_vals.v = type->enum_vals; + accel->enum_vals.count = type->count; + total_row_count = accel->enum_vals.count; } //////////////////////////// @@ -169,8 +159,84 @@ EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_DEF(default) B32 need_extra_deref = e_type_kind_is_pointer_or_ref(type_kind); E_Expr *array_expr = need_extra_deref ? e_expr_ref_deref(arena, expr) : expr; E_Type *type = e_type_from_key(arena, need_extra_deref ? direct_type_key : type_key); - result.total_semantic_row_count = result.total_visual_row_count = type->count; - result.row_exprs_count = Min(needed_row_count, type->count); + total_row_count = type->count; + accel->array_count = type->count; + accel->array_need_extra_deref = need_extra_deref; + } + + //////////////////////////// + //- rjf: pointer-to-pointer -> expansions generate dereference + // + else if(e_type_kind_is_pointer_or_ref(type_kind) && e_type_kind_is_pointer_or_ref(direct_type_kind)) + { + total_row_count = 1; + accel->is_ptr2ptr = 1; + } + + //////////////////////////// + //- rjf: package result + // + EV_ExpandInfo result = {0}; + { + result.user_data = accel; + result.total_semantic_row_count = result.total_visual_row_count = total_row_count; + } + + scratch_end(scratch); + return result; +} + +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(default) +{ + EV_DefaultExpandAccel *accel = (EV_DefaultExpandAccel *)user_data; + EV_ExpandRangeInfo result = {0}; + U64 needed_row_count = dim_1u64(idx_range); + + //////////////////////////// + //- rjf: fill with members + // + if(accel->members.count != 0) + { + E_MemberArray *members = &accel->members; + result.row_exprs_count = Min(needed_row_count, members->count); + result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); + result.row_members = push_array(arena, E_Member *, result.row_exprs_count); + result.row_exprs_num_visual_rows = push_array(arena, U64, result.row_exprs_count); + for EachIndex(row_expr_idx, result.row_exprs_count) + { + E_Member *member = &members->v[idx_range.min + row_expr_idx]; + result.row_exprs[row_expr_idx] = e_expr_ref_member_access(arena, expr, member->name); + result.row_members[row_expr_idx] = member; + result.row_exprs_num_visual_rows[row_expr_idx] = 1; + } + } + + //////////////////////////// + //- rjf: fill with enum vals + // + else if(accel->enum_vals.count != 0) + { + E_EnumValArray *enumvals = &accel->enum_vals; + result.row_exprs_count = Min(needed_row_count, enumvals->count); + result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); + result.row_members = push_array(arena, E_Member *, result.row_exprs_count); + result.row_exprs_num_visual_rows = push_array(arena, U64, result.row_exprs_count); + for EachIndex(row_expr_idx, result.row_exprs_count) + { + E_EnumVal *enumval = &enumvals->v[idx_range.min + row_expr_idx]; + result.row_exprs[row_expr_idx] = e_expr_ref_member_access(arena, expr, enumval->name); + result.row_members[row_expr_idx] = &e_member_nil; + result.row_exprs_num_visual_rows[row_expr_idx] = 1; + } + } + + //////////////////////////// + //- rjf: fill with array indices + // + else if(accel->array_count != 0) + { + E_Expr *array_expr = accel->array_need_extra_deref ? e_expr_ref_deref(arena, expr) : expr; + result.row_exprs_count = Min(needed_row_count, accel->array_count); result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); result.row_members = push_array(arena, E_Member *, result.row_exprs_count); result.row_exprs_num_visual_rows = push_array(arena, U64, result.row_exprs_count); @@ -183,11 +249,11 @@ EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_DEF(default) } //////////////////////////// - //- rjf: pointer-to-pointer -> expansions generate dereference + //- rjf: fill with ptr-to-ptr deref // - else if(e_type_kind_is_pointer_or_ref(type_kind) && e_type_kind_is_pointer_or_ref(direct_type_kind)) + else if(accel->is_ptr2ptr) { - result.total_semantic_row_count = result.total_visual_row_count = result.row_exprs_count = 1; + result.row_exprs_count = 1; result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); result.row_members = push_array(arena, E_Member *, result.row_exprs_count); result.row_exprs_num_visual_rows = push_array(arena, U64, result.row_exprs_count); @@ -196,7 +262,6 @@ EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_DEF(default) result.row_exprs_num_visual_rows[0] = 1; } - scratch_end(scratch); return result; } diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index 601bffb6..6c2c3ada 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -495,7 +495,7 @@ ev_expr_from_expr_view_rules(Arena *arena, E_Expr *expr, EV_ViewRuleList *view_r //~ rjf: Block Building (v2) internal EV2_BlockTree -ev2_block_tree_from_expr(Arena *arena, EV_View *view, String8 string, E_Expr *expr, EV_ViewRuleList *view_rules) +ev2_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 string, E_Expr *expr, EV_ViewRuleList *view_rules) { EV2_BlockTree tree = {&ev2_nil_block}; { @@ -543,7 +543,7 @@ ev2_block_tree_from_expr(Arena *arena, EV_View *view, String8 string, E_Expr *ex for(EV_ViewRuleNode *n = t->view_rules->first; n != 0; n = n->next) { EV_ViewRuleInfo *info = ev_view_rule_info_from_string(n->v.root->string); - if(info->expr_expand != 0) + if(info->expr_expand_info != 0 && info->expr_expand_range_info != 0) { expand_view_rule_info = info; expand_params = n->v.root; @@ -551,7 +551,7 @@ ev2_block_tree_from_expr(Arena *arena, EV_View *view, String8 string, E_Expr *ex } // rjf: get expansion info - EV_ExpandResult expand_result = expand_view_rule_info->expr_expand(arena, t->expr, expand_params, r1u64(0, 0)); + EV_ExpandInfo expand_info = expand_view_rule_info->expr_expand_info(arena, view, filter, t->expr, expand_params); // rjf: generate block for expansion EV2_Block *expansion_block = push_array(arena, EV2_Block, 1); @@ -564,17 +564,18 @@ ev2_block_tree_from_expr(Arena *arena, EV_View *view, String8 string, E_Expr *ex expansion_block->view_rules = t->view_rules; expansion_block->expand_view_rule_info = expand_view_rule_info; expansion_block->expand_view_rule_params = expand_params; - expansion_block->semantic_row_count = expand_result.total_semantic_row_count; - expansion_block->visual_row_count = expand_result.total_visual_row_count; - tree.total_semantic_row_count += expand_result.total_semantic_row_count; - tree.total_visual_row_count += expand_result.total_visual_row_count; + expansion_block->expand_view_rule_info_user_data = expand_info.user_data; + expansion_block->semantic_row_count = expand_info.total_semantic_row_count; + expansion_block->visual_row_count = expand_info.total_visual_row_count; + tree.total_semantic_row_count += expand_info.total_semantic_row_count; + tree.total_visual_row_count += expand_info.total_visual_row_count; // rjf: iterate children expansions, recurse // TODO(rjf): need to iterate these in index order, rather than "child_num" (which needs to be renamed to "child_id") order for(EV_ExpandNode *child = expand_node->first; child != 0; child = child->next) { U64 split_relative_idx = child->key.child_num - 1; // TODO(rjf): key -> index - EV_ExpandResult child_expand = expand_view_rule_info->expr_expand(arena, t->expr, expand_params, r1u64(split_relative_idx, split_relative_idx+1)); + EV_ExpandRangeInfo child_expand = expand_view_rule_info->expr_expand_range_info(arena, view, filter, t->expr, expand_params, r1u64(split_relative_idx, split_relative_idx+1), expand_info.user_data); if(child_expand.row_exprs_count > 0) { EV_ViewRuleList *child_view_rules = ev_view_rule_list_from_inheritance(arena, t->view_rules); @@ -595,7 +596,7 @@ ev2_block_tree_from_expr(Arena *arena, EV_View *view, String8 string, E_Expr *ex } internal EV2_BlockTree -ev2_block_tree_from_string(Arena *arena, EV_View *view, String8 string, EV_ViewRuleList *view_rules) +ev2_block_tree_from_string(Arena *arena, EV_View *view, String8 filter, String8 string, EV_ViewRuleList *view_rules) { EV2_BlockTree tree = {0}; Temp scratch = scratch_begin(&arena, 1); @@ -648,7 +649,7 @@ ev2_block_tree_from_string(Arena *arena, EV_View *view, String8 string, EV_ViewR } // rjf: produce tree - tree = ev2_block_tree_from_expr(arena, view, string, parse.expr, all_view_rules); + tree = ev2_block_tree_from_expr(arena, view, filter, string, parse.expr, all_view_rules); } scratch_end(scratch); return tree; @@ -666,7 +667,7 @@ ev2_depth_from_block(EV2_Block *block) } internal EV2_WindowedRowList -ev2_windowed_row_list_from_block_tree(Arena *arena, EV_View *view, EV2_BlockTree *block_tree, Rng1U64 visible_range) +ev2_windowed_row_list_from_block_tree(Arena *arena, EV_View *view, String8 filter, EV2_BlockTree *block_tree, Rng1U64 visible_range) { EV2_WindowedRowList rows = {0}; { @@ -741,10 +742,10 @@ ev2_windowed_row_list_from_block_tree(Arena *arena, EV_View *view, EV2_BlockTree // rjf: expansion operator applied -> call, and add rows for all expressions in the viewable range else { - EV_ExpandResult expand = t->block->expand_view_rule_info->expr_expand(arena, t->block->expr, t->block->expand_view_rule_params, block_relative_range__windowed); - for EachIndex(idx, expand.row_exprs_count) + EV_ExpandRangeInfo expand_range_info = t->block->expand_view_rule_info->expr_expand_range_info(arena, view, filter, t->block->expr, t->block->expand_view_rule_params, block_relative_range__windowed, t->block->expand_view_rule_info_user_data); + for EachIndex(idx, expand_range_info.row_exprs_count) { - U64 row_visual_size = expand.row_exprs_num_visual_rows[idx]; + U64 row_visual_size = expand_range_info.row_exprs_num_visual_rows[idx]; U64 child_id = block_relative_range.min + idx + 1; // TODO(rjf): index -> key EV2_Row *row = push_array(arena, EV2_Row, 1); SLLQueuePush(rows.first, rows.last, row); @@ -755,8 +756,8 @@ ev2_windowed_row_list_from_block_tree(Arena *arena, EV_View *view, EV2_BlockTree row->visual_size_skipped = 0; // TODO(rjf) row->visual_size_chopped = 0; // TODO(rjf) row->string = t->block->string; - row->expr = expand.row_exprs[idx]; - row->member = expand.row_members[idx]; + row->expr = expand_range_info.row_exprs[idx]; + row->member = expand_range_info.row_members[idx]; row->view_rules = ev_view_rule_list_from_inheritance(arena, t->block->view_rules); // TODO(rjf): mix in view rules based on row's key, row's type } diff --git a/src/eval_visualization/eval_visualization_core.h b/src/eval_visualization/eval_visualization_core.h index d71206cd..9bf9fea9 100644 --- a/src/eval_visualization/eval_visualization_core.h +++ b/src/eval_visualization/eval_visualization_core.h @@ -98,20 +98,6 @@ struct EV_ViewRuleList U64 count; }; -//////////////////////////////// -//~ rjf: Expansion Hook Output - -typedef struct EV_ExpandResult EV_ExpandResult; -struct EV_ExpandResult -{ - U64 total_semantic_row_count; - U64 total_visual_row_count; - U64 row_exprs_count; - E_Expr **row_exprs; - E_Member **row_members; - U64 *row_exprs_num_visual_rows; -}; - //////////////////////////////// //~ rjf: Blocks @@ -174,13 +160,34 @@ struct EV_BlockList //////////////////////////////// //~ rjf: View Rule Info Types +typedef struct EV_ExpandInfo EV_ExpandInfo; +struct EV_ExpandInfo +{ + void *user_data; + U64 total_semantic_row_count; + U64 total_visual_row_count; +}; + +typedef struct EV_ExpandRangeInfo EV_ExpandRangeInfo; +struct EV_ExpandRangeInfo +{ + U64 row_exprs_count; + E_Expr **row_exprs; + E_Member **row_members; + U64 *row_exprs_num_visual_rows; +}; + #define EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_SIG(name) E_Expr *name(Arena *arena, E_Expr *expr, MD_Node *params) #define EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(name) ev_view_rule_expr_resolution__##name #define EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_SIG(EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(name)) -#define EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_SIG(name) EV_ExpandResult name(Arena *arena, E_Expr *expr, MD_Node *params, Rng1U64 idx_range) -#define EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_NAME(name) ev_view_rule_expr_expand__##name -#define EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_SIG(EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_NAME(name)) +#define EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_SIG(name) EV_ExpandInfo name(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params) +#define EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(name) ev_view_rule_expr_expand_info__##name +#define EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_SIG(EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(name)) + +#define EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_SIG(name) EV_ExpandRangeInfo name(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data) +#define EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(name) ev_view_rule_expr_expand_range_info__##name +#define EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_SIG(EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(name)) #define EV_VIEW_RULE_BLOCK_PROD_FUNCTION_SIG(name) void name(Arena *arena, \ EV_View *view, \ @@ -198,7 +205,8 @@ struct EV_BlockList *out) #define EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(name) internal EV_VIEW_RULE_BLOCK_PROD_FUNCTION_SIG(EV_VIEW_RULE_BLOCK_PROD_FUNCTION_NAME(name)) typedef EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_SIG(EV_ViewRuleExprResolutionHookFunctionType); -typedef EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_SIG(EV_ViewRuleExprExpandHookFunctionType); +typedef EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_SIG(EV_ViewRuleExprExpandInfoHookFunctionType); +typedef EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_SIG(EV_ViewRuleExprExpandRangeInfoHookFunctionType); typedef EV_VIEW_RULE_BLOCK_PROD_FUNCTION_SIG(EV_ViewRuleBlockProdHookFunctionType); typedef U32 EV_ViewRuleInfoFlags; // NOTE(rjf): see @view_rule_info @@ -214,7 +222,8 @@ struct EV_ViewRuleInfo String8 string; EV_ViewRuleInfoFlags flags; EV_ViewRuleExprResolutionHookFunctionType *expr_resolution; - EV_ViewRuleExprExpandHookFunctionType *expr_expand; + EV_ViewRuleExprExpandInfoHookFunctionType *expr_expand_info; + EV_ViewRuleExprExpandRangeInfoHookFunctionType *expr_expand_range_info; EV_ViewRuleBlockProdHookFunctionType *block_prod; }; @@ -264,6 +273,7 @@ struct EV2_Block EV_ViewRuleList *view_rules; EV_ViewRuleInfo *expand_view_rule_info; MD_Node *expand_view_rule_params; + void *expand_view_rule_info_user_data; // rjf: expansion info U64 semantic_row_count; @@ -459,10 +469,10 @@ internal E_Expr *ev_expr_from_expr_view_rules(Arena *arena, E_Expr *expr, EV_Vie //////////////////////////////// //~ rjf: Block Building (v2) -internal EV2_BlockTree ev2_block_tree_from_expr(Arena *arena, EV_View *view, String8 string, E_Expr *expr, EV_ViewRuleList *view_rules); -internal EV2_BlockTree ev2_block_tree_from_string(Arena *arena, EV_View *view, String8 string, EV_ViewRuleList *view_rules); +internal EV2_BlockTree ev2_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 string, E_Expr *expr, EV_ViewRuleList *view_rules); +internal EV2_BlockTree ev2_block_tree_from_string(Arena *arena, EV_View *view, String8 filter, String8 string, EV_ViewRuleList *view_rules); internal U64 ev2_depth_from_block(EV2_Block *block); -internal EV2_WindowedRowList ev2_windowed_row_list_from_block_tree(Arena *arena, EV_View *view, EV2_BlockTree *block_tree, Rng1U64 visible_range); +internal EV2_WindowedRowList ev2_windowed_row_list_from_block_tree(Arena *arena, EV_View *view, String8 filter, EV2_BlockTree *block_tree, Rng1U64 visible_range); internal String8 ev2_expr_string_from_row(Arena *arena, EV2_Row *row, EV_StringFlags flags); internal B32 ev2_row_is_expandable(EV2_Row *row); internal B32 ev2_row_is_editable(EV2_Row *row); diff --git a/src/eval_visualization/generated/eval_visualization.meta.c b/src/eval_visualization/generated/eval_visualization.meta.c index b05de641..ce785484 100644 --- a/src/eval_visualization/generated/eval_visualization.meta.c +++ b/src/eval_visualization/generated/eval_visualization.meta.c @@ -6,17 +6,17 @@ C_LINKAGE_BEGIN EV_ViewRuleInfo ev_builtin_view_rule_info_table[11] = { -{str8_lit_comp("default"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), 0, EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_NAME(default) , EV_VIEW_RULE_BLOCK_PROD_FUNCTION_NAME(default) , }, -{str8_lit_comp("array"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(array) , 0, 0, }, -{str8_lit_comp("slice"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(slice) , 0, 0, }, -{str8_lit_comp("bswap"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(bswap) , 0, 0, }, -{str8_lit_comp("cast"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(cast) , 0, 0, }, -{str8_lit_comp("only"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(only) , 0, 0, }, -{str8_lit_comp("omit"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(omit) , 0, 0, }, -{str8_lit_comp("bin"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 0, 0, 0, }, -{str8_lit_comp("oct"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 0, 0, 0, }, -{str8_lit_comp("dec"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 0, 0, 0, }, -{str8_lit_comp("hex"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 0, 0, 0, }, +{str8_lit_comp("default"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), 0, EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(default) , EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(default) , EV_VIEW_RULE_BLOCK_PROD_FUNCTION_NAME(default) , }, +{str8_lit_comp("array"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(array) , 0, 0, 0, }, +{str8_lit_comp("slice"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(slice) , 0, 0, 0, }, +{str8_lit_comp("bswap"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(bswap) , 0, 0, 0, }, +{str8_lit_comp("cast"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(cast) , 0, 0, 0, }, +{str8_lit_comp("only"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(only) , 0, 0, 0, }, +{str8_lit_comp("omit"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(omit) , 0, 0, 0, }, +{str8_lit_comp("bin"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 0, 0, 0, 0, }, +{str8_lit_comp("oct"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 0, 0, 0, 0, }, +{str8_lit_comp("dec"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 0, 0, 0, 0, }, +{str8_lit_comp("hex"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 0, 0, 0, 0, }, }; C_LINKAGE_END diff --git a/src/eval_visualization/generated/eval_visualization.meta.h b/src/eval_visualization/generated/eval_visualization.meta.h index 53e0563c..e9043eb7 100644 --- a/src/eval_visualization/generated/eval_visualization.meta.h +++ b/src/eval_visualization/generated/eval_visualization.meta.h @@ -28,6 +28,7 @@ EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(bswap); EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(cast); EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(only); EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(omit); -EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_DEF(default); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(default); +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(default); EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(default); #endif // EVAL_VISUALIZATION_META_H diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 25e8b4ec..edcf92d2 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -5825,11 +5825,11 @@ rd_window_frame(RD_Window *ws) EV_View *ev_view = rd_ev_view_from_key(d_hash_from_string(ev_view_key_string)); EV_Key parent_key = ev_key_make(5381, 1); EV_Key key = ev_key_make(ev_hash_from_key(parent_key), 1); - EV2_BlockTree block_tree = ev2_block_tree_from_string(scratch.arena, ev_view, expr, &top_level_view_rules); + EV2_BlockTree block_tree = ev2_block_tree_from_string(scratch.arena, ev_view, str8_zero(), expr, &top_level_view_rules); // EV_BlockList viz_blocks = ev_block_list_from_view_expr_keys(scratch.arena, ev_view, str8_zero(), &top_level_view_rules, expr, parent_key, key, 0); CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(eval.space); U32 default_radix = (entity->kind == CTRL_EntityKind_Thread ? 16 : 10); - EV2_WindowedRowList rows = ev2_windowed_row_list_from_block_tree(scratch.arena, ev_view, &block_tree, r1u64(0, 50)); + EV2_WindowedRowList rows = ev2_windowed_row_list_from_block_tree(scratch.arena, ev_view, str8_zero(), &block_tree, r1u64(0, 50)); // EV_WindowedRowList viz_rows = ev_windowed_row_list_from_block_list(scratch.arena, ev_view, r1s64(0, 50), &viz_blocks); //- rjf: animate @@ -7863,6 +7863,55 @@ rd_window_frame(RD_Window *ws) //////////////////////////////// //~ rjf: Eval Visualization +typedef struct RD_EntityExpandAccel RD_EntityExpandAccel; +struct RD_EntityExpandAccel +{ + RD_EntityArray entities; +}; + +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(watches) +{ + RD_EntityExpandAccel *accel = push_array(arena, RD_EntityExpandAccel, 1); + Temp scratch = scratch_begin(&arena, 1); + { + RD_EntityList entities = rd_query_cached_entity_list_with_kind(RD_EntityKind_Watch); + RD_EntityList entities_filtered = {0}; + for(RD_EntityNode *n = entities.first; n != 0; n = n->next) + { + RD_Entity *entity = n->entity; + String8 entity_expr_string = entity->string; + FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, entity_expr_string); + if(matches.count == matches.needle_part_count) + { + rd_entity_list_push(scratch.arena, &entities_filtered, entity); + } + } + accel->entities = rd_entity_array_from_list(arena, &entities_filtered); + } + scratch_end(scratch); + EV_ExpandInfo info = {accel, accel->entities.count, accel->entities.count}; + return info; +} + +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(watches) +{ + RD_EntityExpandAccel *accel = (RD_EntityExpandAccel *)user_data; + EV_ExpandRangeInfo result = {0}; + { + U64 needed_row_count = dim_1u64(idx_range); + result.row_exprs_count = Min(needed_row_count, accel->entities.count); + result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); + result.row_members = push_array(arena, E_Member *, result.row_exprs_count); + for EachIndex(row_expr_idx, result.row_exprs_count) + { + result.row_exprs[row_expr_idx] = e_parse_expr_from_text(arena, accel->entities.v[idx_range.min + row_expr_idx]->string); + result.row_members[row_expr_idx] = &e_member_nil; + result.row_exprs_num_visual_rows[row_expr_idx] = 1; + } + } + return result; +} + EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(watches) { Temp scratch = scratch_begin(&arena, 1); @@ -8052,6 +8101,85 @@ EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(procedures) rd_ev_view_rule_block_prod_collection_debug_tables(arena, RDI_SectionKind_Procedures, view, filter, parent_key, key, expand_node, string, expr, view_rules, view_params, depth, out); } +internal EV_ExpandInfo rd_ev_view_rule_expr_expand_info__meta_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, RD_EntityKind kind); +internal EV_ExpandRangeInfo rd_ev_view_rule_expr_expand_range_info__meta_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data, RD_EntityKind kind); +internal EV_ExpandInfo rd_ev_view_rule_expr_expand_info__meta_ctrl_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, CTRL_EntityKind kind); +internal EV_ExpandRangeInfo rd_ev_view_rule_expr_expand_range_info__meta_ctrl_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data, CTRL_EntityKind kind); + +#if 0 +internal EV_ExpandResult +rd_ev_view_rule_expr_expand_meta_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, RD_EntityKind kind) +{ + Temp scratch = scratch_begin(&arena, 1); + U64 needed_row_count = dim_1u64(idx_range); + RD_EntityList entities = rd_query_cached_entity_list_with_kind(kind); + RD_EntityList entities_filtered = {0}; + for(RD_EntityNode *n = entities.first; n != 0; n = n->next) + { + RD_Entity *entity = n->entity; + FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, entity->string); + if(matches.count == matches.needle_part_count) + { + rd_entity_list_push(scratch.arena, &entities_filtered, entity); + } + } + RD_EntityArray entities_filtered_array = rd_entity_array_from_list(scratch.arena, &entities_filtered); + EV_ExpandResult result = {0}; + { + result.total_semantic_row_count = result.total_visual_row_count = entities_filtered_array.count; + result.row_exprs_count = Min(needed_row_count, entities_filtered_array.count); + result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); + result.row_members = push_array(arena, E_Member *, result.row_exprs_count); + for EachIndex(row_expr_idx, result.row_exprs_count) + { + RD_Entity *entity = entities_filtered_array.v[idx_range.min + row_expr_idx]; + String8 entity_expr_string = push_str8f(arena, "$%I64u", entity->id); + result.row_exprs[row_expr_idx] = e_parse_expr_from_text(arena, entity_expr_string); + result.row_members[row_expr_idx] = &e_member_nil; + result.row_exprs_num_visual_rows[row_expr_idx] = 1; + } + } + scratch_end(scratch); + return result; +} + +internal EV_ExpandResult +rd_ev_view_rule_expr_expand_meta_ctrl_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, CTRL_EntityKind kind) +{ + Temp scratch = scratch_begin(&arena, 1); + U64 needed_row_count = dim_1u64(idx_range); + CTRL_EntityList entities = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, kind); + CTRL_EntityList entities_filtered = {0}; + for(CTRL_EntityNode *n = entities.first; n != 0; n = n->next) + { + CTRL_Entity *entity = n->v; + FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, entity->string); + if(matches.count == matches.needle_part_count) + { + ctrl_entity_list_push(scratch.arena, &entities_filtered, entity); + } + } + CTRL_EntityArray entities_filtered_array = ctrl_entity_array_from_list(scratch.arena, &entities_filtered); + EV_ExpandResult result = {0}; + { + result.total_semantic_row_count = result.total_visual_row_count = entities_filtered_array.count; + result.row_exprs_count = Min(needed_row_count, entities_filtered_array.count); + result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); + result.row_members = push_array(arena, E_Member *, result.row_exprs_count); + for EachIndex(row_expr_idx, result.row_exprs_count) + { + CTRL_Entity *entity = entities_filtered_array.v[idx_range.min + row_expr_idx]; + String8 entity_expr_string = push_str8f(arena, "$_%I64x_%I64x", entity->handle.machine_id, entity->handle.dmn_handle.u64[0]); + result.row_exprs[row_expr_idx] = e_parse_expr_from_text(arena, entity_expr_string); + result.row_members[row_expr_idx] = &e_member_nil; + result.row_exprs_num_visual_rows[row_expr_idx] = 1; + } + } + scratch_end(scratch); + return result; +} +#endif + internal void rd_ev_view_rule_block_prod_collection_debug_tables(Arena *arena, RDI_SectionKind target, EV_View *view, String8 filter, EV_Key parent_key, EV_Key key, EV_ExpandNode *expand_node, String8 string, E_Expr *expr, EV_ViewRuleList *view_rules, MD_Node *view_params, S32 depth, struct EV_BlockList *out) { diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index a86e1d7d..80aedca1 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -1280,6 +1280,11 @@ internal void rd_window_frame(RD_Window *ws); //////////////////////////////// //~ rjf: Eval Visualization +internal EV_ExpandInfo rd_ev_view_rule_expr_expand_info__meta_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, RD_EntityKind kind); +internal EV_ExpandRangeInfo rd_ev_view_rule_expr_expand_range_info__meta_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data, RD_EntityKind kind); +internal EV_ExpandInfo rd_ev_view_rule_expr_expand_info__meta_ctrl_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, CTRL_EntityKind kind); +internal EV_ExpandRangeInfo rd_ev_view_rule_expr_expand_range_info__meta_ctrl_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data, CTRL_EntityKind kind); + internal void rd_ev_view_rule_block_prod_collection_debug_tables(Arena *arena, RDI_SectionKind target, EV_View *view, String8 filter, EV_Key parent_key, EV_Key key, EV_ExpandNode *expand_node, String8 string, E_Expr *expr, EV_ViewRuleList *view_rules, MD_Node *view_params, S32 depth, struct EV_BlockList *out); internal EV_View *rd_ev_view_from_key(U64 key); internal F32 rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval eval, E_Member *member, EV_ViewRuleList *view_rules, String8List *out);