mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-15 16:42:23 -07:00
next checkpoint; eval/type-hooks for registers, locals, files/folders, cfgs
This commit is contained in:
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user