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

This commit is contained in:
Ryan Fleury
2025-04-10 14:29:57 -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)) #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); 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_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)) #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); 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_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)) #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); 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->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_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->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; 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 //- rjf: basic type key functions
internal B32 internal B32
@@ -2128,7 +2160,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(default)
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
{ {
//- rjf: unpack type of expression //- 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_TypeKey lhs_type_key = lhs_irtree.type_key;
E_TypeKind lhs_type_kind = e_type_kind_from_key(lhs_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)); 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_TYPE_EXPAND_INFO_FUNCTION_DEF(file)
{ {
E_FileAccel *accel = push_array(arena, E_FileAccel, 1); E_FileAccel *accel = (E_FileAccel *)irtree->user_data;
{
Temp scratch = scratch_begin(&arena, 1);
scratch_end(scratch);
}
E_TypeExpandInfo info = {accel, accel->fields.count}; E_TypeExpandInfo info = {accel, accel->fields.count};
return info; return info;
} }
+30
View File
@@ -164,6 +164,10 @@ struct E_TypeState
E_ConsTypeSlot *cons_content_slots; E_ConsTypeSlot *cons_content_slots;
E_ConsTypeSlot *cons_key_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 // rjf: member cache table
U64 member_cache_slots_count; U64 member_cache_slots_count;
E_MemberCacheSlot *member_cache_slots; 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_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_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_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 //- rjf: basic type key functions
internal B32 e_type_key_match(E_TypeKey l, E_TypeKey r); 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_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); 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 #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 //- rjf: generate root block
tree.root = push_array(arena, EV_Block, 1); tree.root = push_array(arena, EV_Block, 1);
MemoryCopyStruct(tree.root, &ev_nil_block); MemoryCopyStruct(tree.root, &ev_nil_block);
tree.root->key = root_key; tree.root->key = root_key;
tree.root->string = str8_zero(); tree.root->string = str8_zero();
tree.root->eval = e_eval_from_expr(arena, root_expr); 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.root->row_count = 1;
tree.total_row_count += 1; tree.total_row_count += 1;
tree.total_item_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 // 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); EV_ExpandInfo viz_expand_info = viz_expand_rule->info(arena, view, filter, t->eval.expr, viz_expand_rule_tag);
// rjf: determine expansion info // 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); Rng1U64 child_range = r1u64(split_relative_idx, split_relative_idx+1);
E_Expr *child_expr = &e_expr_nil; E_Expr *child_expr = &e_expr_nil;
String8 child_string = {0}; 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) if(child_expr != &e_expr_nil)
{ {
E_Eval child_eval = e_eval_from_expr(arena, child_expr); 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 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 // 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; U32 min_digits = 0;
B32 no_addr = 0; B32 no_addr = 0;
B32 no_string = 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) for(E_Expr *tag = root_eval.exprs.last->first_tag; tag != &e_expr_nil; tag = tag->next)
{ {
if(0){} 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; min_digits = (U32)num_value_eval.value.u64;
} }
} }
#endif
//- rjf: force no_addr in non-address-spaces //- rjf: force no_addr in non-address-spaces
if(eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity || 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_IRTreeAndType irtree = eval.irtree;
E_LookupRule *lookup_rule = &e_lookup_rule__default; E_LookupRule *lookup_rule = &e_lookup_rule__default;
E_Expr *lookup_rule_tag = &e_expr_nil; E_Expr *lookup_rule_tag = &e_expr_nil;
#if 0 // TODO(rjf): @eval
E_LookupRule *lookup_rule = eval.lookup_rule_tag.rule; E_LookupRule *lookup_rule = eval.lookup_rule_tag.rule;
E_Expr *lookup_rule_tag = eval.lookup_rule_tag.tag; E_Expr *lookup_rule_tag = eval.lookup_rule_tag.tag;
if(lookup_rule == &e_lookup_rule__default) 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 = root_eval.lookup_rule_tag.rule;
lookup_rule_tag = root_eval.lookup_rule_tag.tag; lookup_rule_tag = root_eval.lookup_rule_tag.tag;
} }
#endif
E_LookupInfo lookup_info = lookup_rule->info(arena, &irtree, lookup_rule_tag, filter); 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); U64 total_possible_child_count = Max(lookup_info.idxed_expr_count, lookup_info.named_expr_count);
String8 opener_string = str8_lit("["); 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_IRTreeAndType irtree = eval.irtree;
E_LookupRule *lookup_rule = &e_lookup_rule__default; E_LookupRule *lookup_rule = &e_lookup_rule__default;
E_Expr *lookup_rule_tag = &e_expr_nil; E_Expr *lookup_rule_tag = &e_expr_nil;
#if 0 // TODO(rjf): @eval
E_LookupRule *lookup_rule = eval.lookup_rule_tag.rule; E_LookupRule *lookup_rule = eval.lookup_rule_tag.rule;
E_Expr *lookup_rule_tag = eval.lookup_rule_tag.tag; E_Expr *lookup_rule_tag = eval.lookup_rule_tag.tag;
if(lookup_rule == &e_lookup_rule__default) 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 = root_eval.lookup_rule_tag.rule;
lookup_rule_tag = root_eval.lookup_rule_tag.tag; lookup_rule_tag = root_eval.lookup_rule_tag.tag;
} }
#endif
E_LookupInfo lookup_info = lookup_rule->info(arena, &irtree, lookup_rule_tag, filter); 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); U64 total_possible_child_count = Max(lookup_info.idxed_expr_count, lookup_info.named_expr_count);
String8 opener_string = str8_lit("{"); 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) //- rjf: add macro for collections with specific lookup rules (but no unique id rules)
#if 0 // TODO(rjf): @eval
{ {
struct struct
{ {
String8 name; String8 name;
E_LookupInfoFunctionType *lookup_info; E_TypeExpandInfoFunctionType *info;
E_LookupRangeFunctionType *lookup_range; E_TypeExpandRangeFunctionType *range;
} }
collection_infos[] = 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(locals),
Collection(registers), Collection(registers),
#undef Collection #undef Collection
@@ -12478,14 +12471,17 @@ rd_frame(void)
{ {
String8 collection_name = collection_infos[idx].name; String8 collection_name = collection_infos[idx].name;
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
expr->type_key = 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_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 //- rjf: add macros for debug info table collections
#if 0 // TODO(rjf): @eval #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), .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)); .num_from_id = E_LOOKUP_NUM_FROM_ID_FUNCTION_NAME(debug_info_table));
} }
#endif
//- rjf: add macros for all config collections //- rjf: add macros for all config collections
for EachElement(cfg_name_idx, evallable_cfg_names) for EachElement(cfg_name_idx, evallable_cfg_names)
{ {
String8 cfg_name = evallable_cfg_names[cfg_name_idx]; String8 cfg_name = evallable_cfg_names[cfg_name_idx];
String8 collection_name = rd_plural_from_code_name(cfg_name); 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); E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
expr->type_key = collection_type_key; expr->type_key = collection_type_key;
expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery);
e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr); e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr);
e_lookup_rule_map_insert_new(scratch.arena, ctx->lookup_rule_map, collection_name,
.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 //- rjf: add macros for all ctrl entity collections
for EachElement(ctrl_name_idx, evallable_ctrl_names) 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 //~ 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) 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}; E_IRTreeAndType irtree = {&e_irnode_nil};
if(kind == E_ExprKind_MemberAccess) if(expr->kind == E_ExprKind_MemberAccess)
{ {
MD_Node *child_schema = &md_nil_node; 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; child_schema = child;
break; break;
@@ -296,8 +323,8 @@ E_TYPE_ACCESS_FUNCTION_DEF(schema)
} }
if(child_schema != &md_nil_node) if(child_schema != &md_nil_node)
{ {
RD_Cfg *cfg = accel->cfg; RD_Cfg *cfg = ext->cfg;
CTRL_Entity *entity = accel->entity; CTRL_Entity *entity = ext->entity;
RD_Cfg *child = rd_cfg_child_from_string(cfg, child_schema->string); RD_Cfg *child = rd_cfg_child_from_string(cfg, child_schema->string);
E_TypeKey child_type_key = zero_struct; E_TypeKey child_type_key = zero_struct;
if(0){} if(0){}
@@ -380,16 +407,12 @@ E_TYPE_ACCESS_FUNCTION_DEF(schema)
irtree.mode = E_Mode_Offset; irtree.mode = E_Mode_Offset;
} }
} }
E_LookupAccess access = {irtree}; return irtree;
return access;
} }
typedef struct RD_SchemaLookupAccel RD_SchemaLookupAccel; typedef struct RD_SchemaExpandAccel RD_SchemaExpandAccel;
struct RD_SchemaLookupAccel struct RD_SchemaExpandAccel
{ {
RD_Cfg *cfg;
CTRL_Entity *entity;
MD_Node *schema;
MD_Node **children; MD_Node **children;
U64 children_count; U64 children_count;
}; };
@@ -401,12 +424,8 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(schema)
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
// rjf: unpack // rjf: unpack
E_OpList oplist = e_oplist_from_irtree(scratch.arena, lhs->root); RD_SchemaIRExt *ext = (RD_SchemaIRExt *)irtree->user_data;
String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist); MD_Node *schema = ext->schema;
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);
// rjf: gather expansion children // rjf: gather expansion children
typedef struct ExpandChildNode ExpandChildNode; typedef struct ExpandChildNode ExpandChildNode;
@@ -444,10 +463,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(schema)
} }
// rjf: build accelerator for lookups // rjf: build accelerator for lookups
RD_SchemaLookupAccel *accel = push_array(arena, RD_SchemaLookupAccel, 1); RD_SchemaExpandAccel *accel = push_array(arena, RD_SchemaExpandAccel, 1);
accel->cfg = rd_cfg_from_eval_space(interpret.space);
accel->entity = rd_ctrl_entity_from_eval_space(interpret.space);
accel->schema = schema;
accel->children = children; accel->children = children;
accel->children_count = child_count; accel->children_count = child_count;
@@ -460,17 +476,16 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(schema)
return result; 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_SchemaExpandAccel *accel = (RD_SchemaExpandAccel *)user_data;
RD_SchemaLookupAccel *accel = (RD_SchemaLookupAccel *)user_data;
U64 out_idx = 0; U64 out_idx = 0;
for(U64 idx = idx_range.min; idx < idx_range.max; idx += 1, out_idx += 1) for(U64 idx = idx_range.min; idx < idx_range.max; idx += 1, out_idx += 1)
{ {
if(0 <= idx && idx < accel->children_count) if(0 <= idx && idx < accel->children_count)
{ {
MD_Node *child_schema = accel->children[idx]; 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 //~ rjf: Config Collection Type Hooks
typedef struct RD_CfgCollectionLookupAccel RD_CfgCollectionLookupAccel; typedef struct RD_CfgsIRExt RD_CfgsIRExt;
struct RD_CfgCollectionLookupAccel struct RD_CfgsIRExt
{ {
String8 cfg_name;
String8Array cmds; String8Array cmds;
RD_CfgArray cfgs; RD_CfgArray cfgs;
Rng1U64 cmds_idx_range; Rng1U64 cmds_idx_range;
Rng1U64 cfgs_idx_range; Rng1U64 cfgs_idx_range;
}; };
E_LOOKUP_INFO_FUNCTION_DEF(cfgs) E_TYPE_IRGEN_FUNCTION_DEF(cfgs)
{ {
E_LookupInfo result = {0}; E_IRTreeAndType result = *irtree;
Temp scratch = scratch_begin(&arena, 1); RD_CfgsIRExt *ext = push_array(arena, RD_CfgsIRExt, 1);
{ {
//- rjf: determine which cfg we'll use to scope the lookups Temp scratch = scratch_begin(&arena, 1);
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);
//- rjf: determine which kind of child we'll be gathering //- rjf: determine which key we'll be gathering
E_TypeKey lhs_type_key = lhs->type_key; E_TypeKey type_key = irtree->type_key;
E_Type *lhs_type = e_type_from_key__cached(lhs_type_key); E_Type *type = e_type_from_key__cached(type_key);
String8 cfg_name = rd_singular_from_code_name_plural(lhs_type->name); String8 cfg_name = rd_singular_from_code_name_plural(type->name);
//- rjf: gather cfgs //- rjf: gather cfgs
RD_CfgList cfgs_list = {0}; RD_CfgList cfgs_list = rd_cfg_top_level_list_from_string(scratch.arena, cfg_name);
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);
}
}
}
//- rjf: gather commands //- rjf: gather commands
String8List cmds_list = {0}; String8List cmds_list = {0};
if(filter.size == 0)
{ {
MD_Node *schema = rd_schema_from_name(cfg_name); MD_Node *schema = rd_schema_from_name(cfg_name);
MD_Node *collection_cmds_root = md_tag_from_string(schema, str8_lit("collection_commands"), 0); 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 //- rjf: package & fill
RD_CfgCollectionLookupAccel *accel = push_array(arena, RD_CfgCollectionLookupAccel, 1); ext->cfg_name = cfg_name;
accel->cfgs = rd_cfg_array_from_list(arena, &cfgs_list__filtered); ext->cfgs = rd_cfg_array_from_list(arena, &cfgs_list);
accel->cmds = str8_array_from_list(arena, &cmds_list); ext->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); scratch_end(scratch);
result.user_data = accel;
result.idxed_expr_count = accel->cfgs.count + accel->cmds.count;
} }
scratch_end(scratch); result.user_data = ext;
return result; return result;
} }
E_LOOKUP_ACCESS_FUNCTION_DEF(cfgs) E_TYPE_ACCESS_FUNCTION_DEF(cfgs)
{ {
Temp scratch = scratch_begin(&arena, 1); E_IRTreeAndType result = {&e_irnode_nil};
E_LookupAccess result = {{&e_irnode_nil}};
RD_Cfg *cfg = &rd_nil_cfg; 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; default:{}break;
RD_CfgID id = 0; case E_ExprKind_ArrayIndex:
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); 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)
else if(kind == E_ExprKind_ArrayIndex) {
{ cfg = ext->cfgs.v[rhs_idx];
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); }break;
String8 rhs_bytecode = e_bytecode_from_oplist(scratch.arena, &rhs_oplist); case E_ExprKind_MemberAccess:
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)
{ {
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) if(cfg != &rd_nil_cfg)
{ {
E_Space cfg_space = rd_eval_space_from_cfg(cfg); result.root = e_irtree_set_space(arena, rd_eval_space_from_cfg(cfg), e_irtree_const_u(arena, 0));
String8 cfg_name = cfg->string; result.mode = E_Mode_Offset;
E_TypeKey cfg_type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, cfg_name); result.type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, ext->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;
} }
scratch_end(scratch);
return result; 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 cmds_idx_range = accel->cmds_idx_range;
Rng1U64 cfgs_idx_range = accel->cfgs_idx_range; Rng1U64 cfgs_idx_range = accel->cfgs_idx_range;
U64 dst_idx = 0; U64 dst_idx = 0;
E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(arena, lhs);
// rjf: fill commands // 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) 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]; 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) 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]; 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; U64 id = 0;
RD_CfgCollectionLookupAccel *accel = (RD_CfgCollectionLookupAccel *)user_data; RD_CfgsExpandAccel *accel = (RD_CfgsExpandAccel *)user_data;
if(num != 0) if(num != 0)
{ {
U64 idx = num-1; U64 idx = num-1;
@@ -652,10 +678,10 @@ E_LOOKUP_ID_FROM_NUM_FUNCTION_DEF(cfgs)
return id; return id;
} }
E_LOOKUP_NUM_FROM_ID_FUNCTION_DEF(cfgs) E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(cfgs)
{ {
U64 num = 0; U64 num = 0;
RD_CfgCollectionLookupAccel *accel = (RD_CfgCollectionLookupAccel *)user_data; RD_CfgsExpandAccel *accel = (RD_CfgsExpandAccel *)user_data;
if(id != 0) if(id != 0)
{ {
if(id & (1ull<<63)) if(id & (1ull<<63))
@@ -675,6 +701,7 @@ E_LOOKUP_NUM_FROM_ID_FUNCTION_DEF(cfgs)
return num; return num;
} }
#if 0 // TODO(rjf): @eval
//////////////////////////////// ////////////////////////////////
//~ rjf: `call_stack` Type Hooks //~ 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 //~ rjf: `locals` Type Hooks
E_TYPE_EXPAND_INFO_FUNCTION_DEF(locals); E_TYPE_EXPAND_INFO_FUNCTION_DEF(locals);
E_LOOKUP_RANGE_FUNCTION_DEF(locals); E_TYPE_EXPAND_RANGE_FUNCTION_DEF(locals);
//////////////////////////////// ////////////////////////////////
//~ rjf: `registers` Type Hooks //~ rjf: `registers` Type Hooks
E_LOOKUP_INFO_FUNCTION_DEF(registers); E_TYPE_EXPAND_INFO_FUNCTION_DEF(registers);
E_LOOKUP_RANGE_FUNCTION_DEF(registers); E_TYPE_EXPAND_RANGE_FUNCTION_DEF(registers);
//////////////////////////////// ////////////////////////////////
//~ rjf: Schema Type Hooks //~ rjf: Schema Type Hooks
#if 0 // TODO(rjf): @eval
E_TYPE_ACCESS_FUNCTION_DEF(schema); E_TYPE_ACCESS_FUNCTION_DEF(schema);
E_TYPE_EXPAND_INFO_FUNCTION_DEF(schema); E_TYPE_EXPAND_INFO_FUNCTION_DEF(schema);
E_TYPE_EXPAND_RANGE_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 //~ rjf: Config Collection Type Hooks
E_LOOKUP_INFO_FUNCTION_DEF(cfgs); E_TYPE_IRGEN_FUNCTION_DEF(cfgs);
E_LOOKUP_ACCESS_FUNCTION_DEF(cfgs); E_TYPE_ACCESS_FUNCTION_DEF(cfgs);
E_LOOKUP_RANGE_FUNCTION_DEF(cfgs); E_TYPE_EXPAND_INFO_FUNCTION_DEF(cfgs);
E_LOOKUP_ID_FROM_NUM_FUNCTION_DEF(cfgs); E_TYPE_EXPAND_RANGE_FUNCTION_DEF(cfgs);
E_LOOKUP_NUM_FROM_ID_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 //~ rjf: `call_stack` Type Hooks