next checkpoint; eval/type-hooks for registers, locals, files/folders, cfgs

This commit is contained in:
Ryan Fleury
2025-04-08 19:37:38 -07:00
parent d3f0a9a672
commit c938a6fcfa
7 changed files with 250 additions and 162 deletions
+2 -2
View File
@@ -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);
+34 -7
View File
@@ -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;
}
+30
View File
@@ -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
@@ -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
+23 -22
View File
@@ -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)
{
+143 -116
View File
@@ -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
+10 -9
View File
@@ -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