diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index ea79a619..78a7021c 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -367,12 +367,12 @@ typedef E_TYPE_IRGEN_FUNCTION_SIG(E_TypeIRGenFunctionType); #define E_TYPE_ACCESS_FUNCTION_DEF(name) internal E_TYPE_ACCESS_FUNCTION_SIG(E_TYPE_ACCESS_FUNCTION_NAME(name)) typedef E_TYPE_ACCESS_FUNCTION_SIG(E_TypeAccessFunctionType); -#define E_TYPE_EXPAND_INFO_FUNCTION_SIG(name) E_TypeExpandInfo name(Arena *arena, E_IRTreeAndType *irtree, String8 filter) +#define E_TYPE_EXPAND_INFO_FUNCTION_SIG(name) E_TypeExpandInfo name(Arena *arena, E_Expr *expr, E_IRTreeAndType *irtree, String8 filter) #define E_TYPE_EXPAND_INFO_FUNCTION_NAME(name) e_type_expand_info__##name #define E_TYPE_EXPAND_INFO_FUNCTION_DEF(name) internal E_TYPE_EXPAND_INFO_FUNCTION_SIG(E_TYPE_EXPAND_INFO_FUNCTION_NAME(name)) typedef E_TYPE_EXPAND_INFO_FUNCTION_SIG(E_TypeExpandInfoFunctionType); -#define E_TYPE_EXPAND_RANGE_FUNCTION_SIG(name) void name(Arena *arena, void *user_data, E_Expr *expr, String8 filter, Rng1U64 idx_range, E_Expr **exprs_out, String8 *exprs_strings_out) +#define E_TYPE_EXPAND_RANGE_FUNCTION_SIG(name) void name(Arena *arena, void *user_data, E_Expr *expr, E_IRTreeAndType *irtree, String8 filter, Rng1U64 idx_range, E_Expr **exprs_out, String8 *exprs_strings_out) #define E_TYPE_EXPAND_RANGE_FUNCTION_NAME(name) e_type_expand_range__##name #define E_TYPE_EXPAND_RANGE_FUNCTION_DEF(name) internal E_TYPE_EXPAND_RANGE_FUNCTION_SIG(E_TYPE_EXPAND_RANGE_FUNCTION_NAME(name)) typedef E_TYPE_EXPAND_RANGE_FUNCTION_SIG(E_TypeExpandRangeFunctionType); diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index 69d66116..b393266b 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -248,6 +248,24 @@ e_select_type_ctx(E_TypeCtx *ctx) e_type_state->member_cache_slots = push_array(e_type_state->arena, E_MemberCacheSlot, e_type_state->member_cache_slots_count); e_type_state->type_cache_slots_count = 1024; e_type_state->type_cache_slots = push_array(e_type_state->arena, E_TypeCacheSlot, e_type_state->type_cache_slots_count); + e_type_state->file_type_key = e_type_key_cons(.kind = E_TypeKind_Set, + .name = str8_lit("file"), + .irgen = E_TYPE_IRGEN_FUNCTION_NAME(file), + .access = E_TYPE_ACCESS_FUNCTION_NAME(file), + .expand = + { + .info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(file), + .range= E_TYPE_EXPAND_RANGE_FUNCTION_NAME(file), + }); + e_type_state->folder_type_key = e_type_key_cons(.kind = E_TypeKind_Set, + .name = str8_lit("folder"), + .expand = + { + .info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(folder), + .range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(folder), + .id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(folder), + .num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(folder), + }); } //////////////////////////////// @@ -519,6 +537,20 @@ e_type_key_cons_base(Type *type) return result; } +internal E_TypeKey +e_type_key_file(void) +{ + E_TypeKey key = e_type_state->file_type_key; + return key; +} + +internal E_TypeKey +e_type_key_folder(void) +{ + E_TypeKey key = e_type_state->folder_type_key; + return key; +} + //- rjf: basic type key functions internal B32 @@ -2128,7 +2160,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(default) Temp scratch = scratch_begin(&arena, 1); { //- rjf: unpack type of expression - E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(scratch.arena, expr); + E_IRTreeAndType lhs_irtree = *irtree; E_TypeKey lhs_type_key = lhs_irtree.type_key; E_TypeKind lhs_type_kind = e_type_kind_from_key(lhs_type_key); E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(lhs_type_key)); @@ -2482,12 +2514,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(file) E_TYPE_EXPAND_INFO_FUNCTION_DEF(file) { - E_FileAccel *accel = push_array(arena, E_FileAccel, 1); - { - Temp scratch = scratch_begin(&arena, 1); - - scratch_end(scratch); - } + E_FileAccel *accel = (E_FileAccel *)irtree->user_data; E_TypeExpandInfo info = {accel, accel->fields.count}; return info; } diff --git a/src/eval/eval_types.h b/src/eval/eval_types.h index d57d3e37..8217065c 100644 --- a/src/eval/eval_types.h +++ b/src/eval/eval_types.h @@ -164,6 +164,10 @@ struct E_TypeState E_ConsTypeSlot *cons_content_slots; E_ConsTypeSlot *cons_key_slots; + // rjf: build-in constructed type keys + E_TypeKey file_type_key; + E_TypeKey folder_type_key; + // rjf: member cache table U64 member_cache_slots_count; E_MemberCacheSlot *member_cache_slots; @@ -235,6 +239,8 @@ internal E_TypeKey e_type_key_cons_(E_ConsTypeParams *params); internal E_TypeKey e_type_key_cons_array(E_TypeKey element_type_key, U64 count, E_TypeFlags flags); internal E_TypeKey e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key, U64 count, E_TypeFlags flags); internal E_TypeKey e_type_key_cons_base(Type *type); +internal E_TypeKey e_type_key_file(void); +internal E_TypeKey e_type_key_folder(void); //- rjf: basic type key functions internal B32 e_type_key_match(E_TypeKey l, E_TypeKey r); @@ -275,4 +281,28 @@ internal E_MemberArray e_type_data_members_from_key_filter__cached(E_TypeKey key internal E_MemberArray e_type_data_members_from_key__cached(E_TypeKey key); internal E_Member e_type_member_from_key_name__cached(E_TypeKey key, String8 name); +//////////////////////////////// +//~ rjf: (Built-In Type Hooks) Default Hooks + +E_TYPE_EXPAND_INFO_FUNCTION_DEF(default); +E_TYPE_EXPAND_RANGE_FUNCTION_DEF(default); +E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(identity); +E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(identity); + +//////////////////////////////// +//~ rjf: (Built-In Type Hooks) `folder` type + +E_TYPE_EXPAND_INFO_FUNCTION_DEF(folder); +E_TYPE_EXPAND_RANGE_FUNCTION_DEF(folder); +E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(folder); +E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(folder); + +//////////////////////////////// +//~ rjf: (Built-In Type Hooks) `file` type + +E_TYPE_IRGEN_FUNCTION_DEF(file); +E_TYPE_ACCESS_FUNCTION_DEF(file); +E_TYPE_EXPAND_INFO_FUNCTION_DEF(file); +E_TYPE_EXPAND_RANGE_FUNCTION_DEF(file); + #endif // EVAL_TYPES_H diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index d94cd5cb..f4dc6cc8 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -553,9 +553,11 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, E_Expr *exp //- rjf: generate root block tree.root = push_array(arena, EV_Block, 1); MemoryCopyStruct(tree.root, &ev_nil_block); - tree.root->key = root_key; - tree.root->string = str8_zero(); - tree.root->eval = e_eval_from_expr(arena, root_expr); + tree.root->key = root_key; + tree.root->string = str8_zero(); + tree.root->eval = e_eval_from_expr(arena, root_expr); + tree.root->type_expand_rule = &e_type_expand_rule__default; + tree.root->viz_expand_rule = &ev_nil_expand_rule; tree.root->row_count = 1; tree.total_row_count += 1; tree.total_item_count += 1; @@ -615,7 +617,7 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, E_Expr *exp } // rjf: get top-level lookup/expansion info - E_TypeExpandInfo type_expand_info = type_expand_rule->info(arena, &t->eval.irtree, filter); + E_TypeExpandInfo type_expand_info = type_expand_rule->info(arena, t->eval.expr, &t->eval.irtree, filter); EV_ExpandInfo viz_expand_info = viz_expand_rule->info(arena, view, filter, t->eval.expr, viz_expand_rule_tag); // rjf: determine expansion info @@ -731,7 +733,7 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, E_Expr *exp Rng1U64 child_range = r1u64(split_relative_idx, split_relative_idx+1); E_Expr *child_expr = &e_expr_nil; String8 child_string = {0}; - type_expand_rule->range(arena, type_expand_info.user_data, t->eval.expr, filter, r1u64(split_relative_idx, split_relative_idx+1), &child_expr, &child_string); + type_expand_rule->range(arena, type_expand_info.user_data, t->eval.expr, &t->eval.irtree, filter, r1u64(split_relative_idx, split_relative_idx+1), &child_expr, &child_string); if(child_expr != &e_expr_nil) { E_Eval child_eval = e_eval_from_expr(arena, child_expr); @@ -1038,7 +1040,7 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 } else { - n->v.block->type_expand_rule->range(arena, n->v.block->type_expand_info.user_data, n->v.block->eval.expr, filter, block_relative_range__windowed, range_exprs, range_exprs_strings); + n->v.block->type_expand_rule->range(arena, n->v.block->type_expand_info.user_data, n->v.block->eval.expr, &n->v.block->eval.irtree, filter, block_relative_range__windowed, range_exprs, range_exprs_strings); } // rjf: no expansion operator applied -> push row for block expression; pass through block info diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index ed46e37b..a923f1a1 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -9158,7 +9158,6 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f U32 min_digits = 0; B32 no_addr = 0; B32 no_string = 0; -#if 0 // TODO(rjf): @eval for(E_Expr *tag = root_eval.exprs.last->first_tag; tag != &e_expr_nil; tag = tag->next) { if(0){} @@ -9176,7 +9175,6 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f min_digits = (U32)num_value_eval.value.u64; } } -#endif //- rjf: force no_addr in non-address-spaces if(eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity || @@ -9388,7 +9386,6 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f E_IRTreeAndType irtree = eval.irtree; E_LookupRule *lookup_rule = &e_lookup_rule__default; E_Expr *lookup_rule_tag = &e_expr_nil; -#if 0 // TODO(rjf): @eval E_LookupRule *lookup_rule = eval.lookup_rule_tag.rule; E_Expr *lookup_rule_tag = eval.lookup_rule_tag.tag; if(lookup_rule == &e_lookup_rule__default) @@ -9396,7 +9393,6 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f lookup_rule = root_eval.lookup_rule_tag.rule; lookup_rule_tag = root_eval.lookup_rule_tag.tag; } -#endif E_LookupInfo lookup_info = lookup_rule->info(arena, &irtree, lookup_rule_tag, filter); U64 total_possible_child_count = Max(lookup_info.idxed_expr_count, lookup_info.named_expr_count); String8 opener_string = str8_lit("["); @@ -9530,7 +9526,6 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f E_IRTreeAndType irtree = eval.irtree; E_LookupRule *lookup_rule = &e_lookup_rule__default; E_Expr *lookup_rule_tag = &e_expr_nil; -#if 0 // TODO(rjf): @eval E_LookupRule *lookup_rule = eval.lookup_rule_tag.rule; E_Expr *lookup_rule_tag = eval.lookup_rule_tag.tag; if(lookup_rule == &e_lookup_rule__default) @@ -9538,7 +9533,6 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f lookup_rule = root_eval.lookup_rule_tag.rule; lookup_rule_tag = root_eval.lookup_rule_tag.tag; } -#endif E_LookupInfo lookup_info = lookup_rule->info(arena, &irtree, lookup_rule_tag, filter); U64 total_possible_child_count = Max(lookup_info.idxed_expr_count, lookup_info.named_expr_count); String8 opener_string = str8_lit("{"); @@ -12459,17 +12453,16 @@ rd_frame(void) } //- rjf: add macro for collections with specific lookup rules (but no unique id rules) -#if 0 // TODO(rjf): @eval { struct { String8 name; - E_LookupInfoFunctionType *lookup_info; - E_LookupRangeFunctionType *lookup_range; + E_TypeExpandInfoFunctionType *info; + E_TypeExpandRangeFunctionType *range; } collection_infos[] = { -#define Collection(name) {str8_lit_comp(#name), E_LOOKUP_INFO_FUNCTION_NAME(name), E_LOOKUP_RANGE_FUNCTION_NAME(name)} +#define Collection(name) {str8_lit_comp(#name), E_TYPE_EXPAND_INFO_FUNCTION_NAME(name), E_TYPE_EXPAND_RANGE_FUNCTION_NAME(name)} Collection(locals), Collection(registers), #undef Collection @@ -12478,14 +12471,17 @@ rd_frame(void) { String8 collection_name = collection_infos[idx].name; 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, + .expand = + { + .info = collection_infos[idx].info, + .range = collection_infos[idx].range, + }); + expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); 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, - .info = collection_infos[idx].lookup_info, - .range = collection_infos[idx].lookup_range); } } -#endif //- rjf: add macros for debug info table collections #if 0 // TODO(rjf): @eval @@ -12509,25 +12505,30 @@ rd_frame(void) .id_from_num = E_LOOKUP_ID_FROM_NUM_FUNCTION_NAME(debug_info_table), .num_from_id = E_LOOKUP_NUM_FROM_ID_FUNCTION_NAME(debug_info_table)); } +#endif //- rjf: add macros for all config collections for EachElement(cfg_name_idx, evallable_cfg_names) { String8 cfg_name = evallable_cfg_names[cfg_name_idx]; String8 collection_name = rd_plural_from_code_name(cfg_name); - 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, + .irgen = E_TYPE_IRGEN_FUNCTION_NAME(cfgs), + .access = E_TYPE_ACCESS_FUNCTION_NAME(cfgs), + .expand = + { + .info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(cfgs), + .range= E_TYPE_EXPAND_RANGE_FUNCTION_NAME(cfgs), + .id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(cfgs), + .num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(cfgs), + }); E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); expr->type_key = collection_type_key; expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); 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, - .info = E_LOOKUP_INFO_FUNCTION_NAME(cfgs), - .access = E_LOOKUP_ACCESS_FUNCTION_NAME(cfgs), - .range = E_LOOKUP_RANGE_FUNCTION_NAME(cfgs), - .id_from_num = E_LOOKUP_ID_FROM_NUM_FUNCTION_NAME(cfgs), - .num_from_id = E_LOOKUP_NUM_FROM_ID_FUNCTION_NAME(cfgs)); } +#if 0 // TODO(rjf): @eval //- rjf: add macros for all ctrl entity collections for EachElement(ctrl_name_idx, evallable_ctrl_names) { diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index 275b7cd2..80ae6ae1 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -277,18 +277,45 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(registers) //////////////////////////////// //~ rjf: Schema Type Hooks -#if 0 // TODO(rjf): @eval +typedef struct RD_SchemaIRExt RD_SchemaIRExt; +struct RD_SchemaIRExt +{ + RD_Cfg *cfg; + CTRL_Entity *entity; + MD_Node *schema; +}; + +E_TYPE_IRGEN_FUNCTION_DEF(schema) +{ + E_IRTreeAndType result = *irtree; + RD_SchemaIRExt *ext = push_array(arena, RD_SchemaIRExt, 1); + { + Temp scratch = scratch_begin(&arena, 1); + E_OpList oplist = e_oplist_from_irtree(scratch.arena, irtree->root); + String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist); + E_Interpretation interpret = e_interpret(bytecode); + E_TypeKey type_key = irtree->type_key; + E_Type *type = e_type_from_key__cached(type_key); + MD_Node *schema = rd_schema_from_name(type->name); + ext->cfg = rd_cfg_from_eval_space(interpret.space); + ext->entity = rd_ctrl_entity_from_eval_space(interpret.space); + ext->schema = schema; + scratch_end(scratch); + } + result.user_data = ext; + return result; +} E_TYPE_ACCESS_FUNCTION_DEF(schema) { - RD_SchemaLookupAccel *accel = (RD_SchemaLookupAccel *)user_data; + RD_SchemaIRExt *ext = (RD_SchemaIRExt *)lhs_irtree->user_data; E_IRTreeAndType irtree = {&e_irnode_nil}; - if(kind == E_ExprKind_MemberAccess) + if(expr->kind == E_ExprKind_MemberAccess) { MD_Node *child_schema = &md_nil_node; - for MD_EachNode(child, accel->schema->first) + for MD_EachNode(child, ext->schema->first) { - if(str8_match(child->string, rhs->string, 0)) + if(str8_match(child->string, expr->first->next->string, 0)) { child_schema = child; break; @@ -296,8 +323,8 @@ E_TYPE_ACCESS_FUNCTION_DEF(schema) } if(child_schema != &md_nil_node) { - RD_Cfg *cfg = accel->cfg; - CTRL_Entity *entity = accel->entity; + RD_Cfg *cfg = ext->cfg; + CTRL_Entity *entity = ext->entity; RD_Cfg *child = rd_cfg_child_from_string(cfg, child_schema->string); E_TypeKey child_type_key = zero_struct; if(0){} @@ -380,16 +407,12 @@ E_TYPE_ACCESS_FUNCTION_DEF(schema) irtree.mode = E_Mode_Offset; } } - E_LookupAccess access = {irtree}; - return access; + return irtree; } -typedef struct RD_SchemaLookupAccel RD_SchemaLookupAccel; -struct RD_SchemaLookupAccel +typedef struct RD_SchemaExpandAccel RD_SchemaExpandAccel; +struct RD_SchemaExpandAccel { - RD_Cfg *cfg; - CTRL_Entity *entity; - MD_Node *schema; MD_Node **children; U64 children_count; }; @@ -401,12 +424,8 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(schema) Temp scratch = scratch_begin(&arena, 1); // rjf: unpack - E_OpList oplist = e_oplist_from_irtree(scratch.arena, lhs->root); - String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist); - E_Interpretation interpret = e_interpret(bytecode); - E_TypeKey type_key = lhs->type_key; - E_Type *type = e_type_from_key__cached(type_key); - MD_Node *schema = rd_schema_from_name(type->name); + RD_SchemaIRExt *ext = (RD_SchemaIRExt *)irtree->user_data; + MD_Node *schema = ext->schema; // rjf: gather expansion children typedef struct ExpandChildNode ExpandChildNode; @@ -444,10 +463,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(schema) } // rjf: build accelerator for lookups - RD_SchemaLookupAccel *accel = push_array(arena, RD_SchemaLookupAccel, 1); - accel->cfg = rd_cfg_from_eval_space(interpret.space); - accel->entity = rd_ctrl_entity_from_eval_space(interpret.space); - accel->schema = schema; + RD_SchemaExpandAccel *accel = push_array(arena, RD_SchemaExpandAccel, 1); accel->children = children; accel->children_count = child_count; @@ -460,17 +476,16 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(schema) return result; } -E_LOOKUP_RANGE_FUNCTION_DEF(schema) +E_TYPE_EXPAND_RANGE_FUNCTION_DEF(schema) { - E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(arena, lhs); - RD_SchemaLookupAccel *accel = (RD_SchemaLookupAccel *)user_data; + RD_SchemaExpandAccel *accel = (RD_SchemaExpandAccel *)user_data; U64 out_idx = 0; for(U64 idx = idx_range.min; idx < idx_range.max; idx += 1, out_idx += 1) { if(0 <= idx && idx < accel->children_count) { MD_Node *child_schema = accel->children[idx]; - exprs[out_idx] = e_expr_irext_member_access(arena, lhs, &lhs_irtree, child_schema->string); + exprs_out[out_idx] = e_expr_irext_member_access(arena, expr, irtree, child_schema->string); } } } @@ -478,62 +493,33 @@ E_LOOKUP_RANGE_FUNCTION_DEF(schema) //////////////////////////////// //~ rjf: Config Collection Type Hooks -typedef struct RD_CfgCollectionLookupAccel RD_CfgCollectionLookupAccel; -struct RD_CfgCollectionLookupAccel +typedef struct RD_CfgsIRExt RD_CfgsIRExt; +struct RD_CfgsIRExt { + String8 cfg_name; String8Array cmds; RD_CfgArray cfgs; Rng1U64 cmds_idx_range; Rng1U64 cfgs_idx_range; }; -E_LOOKUP_INFO_FUNCTION_DEF(cfgs) +E_TYPE_IRGEN_FUNCTION_DEF(cfgs) { - E_LookupInfo result = {0}; - Temp scratch = scratch_begin(&arena, 1); + E_IRTreeAndType result = *irtree; + RD_CfgsIRExt *ext = push_array(arena, RD_CfgsIRExt, 1); { - //- rjf: determine which cfg we'll use to scope the lookups - E_OpList lhs_oplist = e_oplist_from_irtree(scratch.arena, lhs->root); - String8 lhs_bytecode = e_bytecode_from_oplist(scratch.arena, &lhs_oplist); - E_Interpretation lhs_interp = e_interpret(lhs_bytecode); - RD_Cfg *scoping_cfg = rd_cfg_from_eval_space(lhs_interp.space); + Temp scratch = scratch_begin(&arena, 1); - //- rjf: determine which kind of child we'll be gathering - E_TypeKey lhs_type_key = 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); + //- rjf: determine which key we'll be gathering + E_TypeKey type_key = irtree->type_key; + E_Type *type = e_type_from_key__cached(type_key); + String8 cfg_name = rd_singular_from_code_name_plural(type->name); //- rjf: gather cfgs - RD_CfgList cfgs_list = {0}; - if(scoping_cfg == &rd_nil_cfg) - { - cfgs_list = rd_cfg_top_level_list_from_string(scratch.arena, cfg_name); - } - else - { - cfgs_list = rd_cfg_child_list_from_string(scratch.arena, scoping_cfg, cfg_name); - } - - //- rjf: filter cfgs - RD_CfgList cfgs_list__filtered = cfgs_list; - if(filter.size != 0) - { - MemoryZeroStruct(&cfgs_list__filtered); - for(RD_CfgNode *n = cfgs_list.first; n != 0; n = n->next) - { - DR_FStrList fstrs = rd_title_fstrs_from_cfg(scratch.arena, n->v); - String8 string = dr_string_from_fstrs(scratch.arena, &fstrs); - FuzzyMatchRangeList fuzzy_matches = fuzzy_match_find(scratch.arena, filter, string); - if(fuzzy_matches.count == fuzzy_matches.needle_part_count) - { - rd_cfg_list_push(scratch.arena, &cfgs_list__filtered, n->v); - } - } - } + RD_CfgList cfgs_list = rd_cfg_top_level_list_from_string(scratch.arena, cfg_name); //- rjf: gather commands String8List cmds_list = {0}; - if(filter.size == 0) { MD_Node *schema = rd_schema_from_name(cfg_name); MD_Node *collection_cmds_root = md_tag_from_string(schema, str8_lit("collection_commands"), 0); @@ -544,67 +530,107 @@ E_LOOKUP_INFO_FUNCTION_DEF(cfgs) } //- rjf: package & fill - RD_CfgCollectionLookupAccel *accel = push_array(arena, RD_CfgCollectionLookupAccel, 1); - accel->cfgs = rd_cfg_array_from_list(arena, &cfgs_list__filtered); - accel->cmds = str8_array_from_list(arena, &cmds_list); - accel->cmds_idx_range = r1u64(0, accel->cmds.count); - accel->cfgs_idx_range = r1u64(accel->cmds_idx_range.max, accel->cmds_idx_range.max + accel->cfgs.count); - result.user_data = accel; - result.idxed_expr_count = accel->cfgs.count + accel->cmds.count; + ext->cfg_name = cfg_name; + ext->cfgs = rd_cfg_array_from_list(arena, &cfgs_list); + ext->cmds = str8_array_from_list(arena, &cmds_list); + + scratch_end(scratch); } - scratch_end(scratch); + result.user_data = ext; return result; } -E_LOOKUP_ACCESS_FUNCTION_DEF(cfgs) +E_TYPE_ACCESS_FUNCTION_DEF(cfgs) { - Temp scratch = scratch_begin(&arena, 1); - E_LookupAccess result = {{&e_irnode_nil}}; + E_IRTreeAndType result = {&e_irnode_nil}; RD_Cfg *cfg = &rd_nil_cfg; - if(kind == E_ExprKind_MemberAccess) + RD_CfgsIRExt *ext = (RD_CfgsIRExt *)lhs_irtree->user_data; + switch(expr->kind) { - String8 rhs_name = rhs->string; - RD_CfgID id = 0; - if(str8_match(str8_prefix(rhs_name, 1), str8_lit("$"), 0) && - try_u64_from_str8_c_rules(str8_skip(rhs_name, 1), &id)) + default:{}break; + case E_ExprKind_ArrayIndex: { - cfg = rd_cfg_from_id(id); - } - } - else if(kind == E_ExprKind_ArrayIndex) - { - 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); - String8 rhs_bytecode = e_bytecode_from_oplist(scratch.arena, &rhs_oplist); - E_Interpretation rhs_interp = e_interpret(rhs_bytecode); - E_Value rhs_value = rhs_interp.value; - U64 rhs_idx = rhs_value.u64; - RD_CfgCollectionLookupAccel *accel = (RD_CfgCollectionLookupAccel *)user_data; - if(0 <= rhs_idx && rhs_idx < accel->cfgs.count) + E_Value rhs_value = e_value_from_expr(expr->first->next); + U64 rhs_idx = rhs_value.u64; + if(0 <= rhs_idx && rhs_idx < ext->cfgs.count) + { + cfg = ext->cfgs.v[rhs_idx]; + } + }break; + case E_ExprKind_MemberAccess: { - cfg = accel->cfgs.v[rhs_idx]; - } + String8 rhs_name = expr->first->next->string; + RD_CfgID id = 0; + if(str8_match(str8_prefix(rhs_name, 1), str8_lit("$"), 0) && + try_u64_from_str8_c_rules(str8_skip(rhs_name, 1), &id)) + { + cfg = rd_cfg_from_id(id); + } + }break; } if(cfg != &rd_nil_cfg) { - E_Space cfg_space = rd_eval_space_from_cfg(cfg); - String8 cfg_name = cfg->string; - E_TypeKey cfg_type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, cfg_name); - result.irtree_and_type.root = e_irtree_set_space(arena, cfg_space, e_irtree_const_u(arena, 0)); - result.irtree_and_type.type_key = cfg_type_key; - result.irtree_and_type.mode = E_Mode_Offset; + result.root = e_irtree_set_space(arena, rd_eval_space_from_cfg(cfg), e_irtree_const_u(arena, 0)); + result.mode = E_Mode_Offset; + result.type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, ext->cfg_name); } - scratch_end(scratch); return result; } -E_LOOKUP_RANGE_FUNCTION_DEF(cfgs) +typedef struct RD_CfgsExpandAccel RD_CfgsExpandAccel; +struct RD_CfgsExpandAccel { - RD_CfgCollectionLookupAccel *accel = (RD_CfgCollectionLookupAccel *)user_data; + String8Array cmds; + RD_CfgArray cfgs; + Rng1U64 cmds_idx_range; + Rng1U64 cfgs_idx_range; +}; + +E_TYPE_EXPAND_INFO_FUNCTION_DEF(cfgs) +{ + RD_CfgsExpandAccel *accel = push_array(arena, RD_CfgsExpandAccel, 1); + E_TypeExpandInfo info = {accel}; + Temp scratch = scratch_begin(&arena, 1); + { + //- rjf: unpack + RD_CfgsIRExt *ext = (RD_CfgsIRExt *)irtree->user_data; + + //- rjf: filter cfgs + RD_CfgArray cfgs__filtered = ext->cfgs; + if(filter.size != 0) + { + RD_CfgList cfgs_list__filtered = {0}; + for EachIndex(idx, ext->cfgs.count) + { + RD_Cfg *cfg = ext->cfgs.v[idx]; + DR_FStrList fstrs = rd_title_fstrs_from_cfg(scratch.arena, cfg); + String8 string = dr_string_from_fstrs(scratch.arena, &fstrs); + FuzzyMatchRangeList fuzzy_matches = fuzzy_match_find(scratch.arena, filter, string); + if(fuzzy_matches.count == fuzzy_matches.needle_part_count) + { + rd_cfg_list_push(scratch.arena, &cfgs_list__filtered, cfg); + } + } + cfgs__filtered = rd_cfg_array_from_list(arena, &cfgs_list__filtered); + } + + //- rjf: fill + accel->cmds = ext->cmds; + accel->cfgs = cfgs__filtered; + accel->cmds_idx_range = r1u64(0, accel->cmds.count); + accel->cfgs_idx_range = r1u64(accel->cmds_idx_range.max, accel->cmds_idx_range.max + accel->cfgs.count); + info.expr_count = (accel->cmds.count + accel->cfgs.count); + } + scratch_end(scratch); + return info; +} + +E_TYPE_EXPAND_RANGE_FUNCTION_DEF(cfgs) +{ + RD_CfgsExpandAccel *accel = (RD_CfgsExpandAccel *)user_data; Rng1U64 cmds_idx_range = accel->cmds_idx_range; Rng1U64 cfgs_idx_range = accel->cfgs_idx_range; U64 dst_idx = 0; - E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(arena, lhs); // rjf: fill commands { @@ -615,7 +641,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(cfgs) for(U64 idx = 0; idx < read_count; idx += 1, dst_idx += 1) { String8 cmd_name = accel->cmds.v[idx + read_range.min - cmds_idx_range.min]; - exprs[dst_idx] = e_expr_irext_member_access(arena, commands, &commands_irtree, cmd_name); + exprs_out[dst_idx] = e_expr_irext_member_access(arena, commands, &commands_irtree, cmd_name); } } @@ -626,15 +652,15 @@ E_LOOKUP_RANGE_FUNCTION_DEF(cfgs) for(U64 idx = 0; idx < read_count; idx += 1, dst_idx += 1) { RD_Cfg *cfg = accel->cfgs.v[idx + read_range.min - cfgs_idx_range.min]; - exprs[dst_idx] = e_expr_irext_member_access(arena, lhs, &lhs_irtree, push_str8f(arena, "$%I64d", cfg->id)); + exprs_out[dst_idx] = e_expr_irext_member_access(arena, expr, irtree, push_str8f(arena, "$%I64d", cfg->id)); } } } -E_LOOKUP_ID_FROM_NUM_FUNCTION_DEF(cfgs) +E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(cfgs) { U64 id = 0; - RD_CfgCollectionLookupAccel *accel = (RD_CfgCollectionLookupAccel *)user_data; + RD_CfgsExpandAccel *accel = (RD_CfgsExpandAccel *)user_data; if(num != 0) { U64 idx = num-1; @@ -652,10 +678,10 @@ E_LOOKUP_ID_FROM_NUM_FUNCTION_DEF(cfgs) return id; } -E_LOOKUP_NUM_FROM_ID_FUNCTION_DEF(cfgs) +E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(cfgs) { U64 num = 0; - RD_CfgCollectionLookupAccel *accel = (RD_CfgCollectionLookupAccel *)user_data; + RD_CfgsExpandAccel *accel = (RD_CfgsExpandAccel *)user_data; if(id != 0) { if(id & (1ull<<63)) @@ -675,6 +701,7 @@ E_LOOKUP_NUM_FROM_ID_FUNCTION_DEF(cfgs) return num; } +#if 0 // TODO(rjf): @eval //////////////////////////////// //~ rjf: `call_stack` Type Hooks diff --git a/src/raddbg/raddbg_eval.h b/src/raddbg/raddbg_eval.h index d8c6af28..d53d6b9a 100644 --- a/src/raddbg/raddbg_eval.h +++ b/src/raddbg/raddbg_eval.h @@ -23,18 +23,17 @@ E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(watches); //~ rjf: `locals` Type Hooks E_TYPE_EXPAND_INFO_FUNCTION_DEF(locals); -E_LOOKUP_RANGE_FUNCTION_DEF(locals); +E_TYPE_EXPAND_RANGE_FUNCTION_DEF(locals); //////////////////////////////// //~ rjf: `registers` Type Hooks -E_LOOKUP_INFO_FUNCTION_DEF(registers); -E_LOOKUP_RANGE_FUNCTION_DEF(registers); +E_TYPE_EXPAND_INFO_FUNCTION_DEF(registers); +E_TYPE_EXPAND_RANGE_FUNCTION_DEF(registers); //////////////////////////////// //~ rjf: Schema Type Hooks -#if 0 // TODO(rjf): @eval E_TYPE_ACCESS_FUNCTION_DEF(schema); E_TYPE_EXPAND_INFO_FUNCTION_DEF(schema); E_TYPE_EXPAND_RANGE_FUNCTION_DEF(schema); @@ -42,12 +41,14 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(schema); //////////////////////////////// //~ rjf: Config Collection Type Hooks -E_LOOKUP_INFO_FUNCTION_DEF(cfgs); -E_LOOKUP_ACCESS_FUNCTION_DEF(cfgs); -E_LOOKUP_RANGE_FUNCTION_DEF(cfgs); -E_LOOKUP_ID_FROM_NUM_FUNCTION_DEF(cfgs); -E_LOOKUP_NUM_FROM_ID_FUNCTION_DEF(cfgs); +E_TYPE_IRGEN_FUNCTION_DEF(cfgs); +E_TYPE_ACCESS_FUNCTION_DEF(cfgs); +E_TYPE_EXPAND_INFO_FUNCTION_DEF(cfgs); +E_TYPE_EXPAND_RANGE_FUNCTION_DEF(cfgs); +E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(cfgs); +E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(cfgs); +#if 0 // TODO(rjf): @eval //////////////////////////////// //~ rjf: `call_stack` Type Hooks