switch type expansion hooks to being eval-based, not expr/irtree-based

This commit is contained in:
Ryan Fleury
2025-04-24 09:36:00 -07:00
parent 9bb592786a
commit a35e483629
6 changed files with 111 additions and 184 deletions
+5 -4
View File
@@ -852,10 +852,11 @@ e_eval_from_bundle(E_CacheBundle *bundle)
{
E_Eval eval =
{
.key = bundle->key,
.expr = e_parse_from_bundle(bundle).expr,
.irtree = e_irtree_from_bundle(bundle),
.bytecode = e_bytecode_from_bundle(bundle),
.key = bundle->key,
.string = bundle->string,
.expr = e_parse_from_bundle(bundle).expr,
.irtree = e_irtree_from_bundle(bundle),
.bytecode = e_bytecode_from_bundle(bundle),
};
E_Interpretation interpretation = e_interpretation_from_bundle(bundle);
eval.code = interpretation.code;
+25 -27
View File
@@ -286,6 +286,16 @@ struct E_ExprList
U64 count;
};
typedef struct E_Parse E_Parse;
struct E_Parse
{
E_TokenArray tokens;
E_Token *last_token;
E_Expr *expr;
E_Expr *last_expr;
E_MsgList msgs;
};
////////////////////////////////
//~ rjf: IR Tree Types
@@ -312,6 +322,17 @@ struct E_IRTreeAndType
E_IRTreeAndType *prev;
};
////////////////////////////////
//~ rjf: Bytecode Interpretation Types
typedef struct E_Interpretation E_Interpretation;
struct E_Interpretation
{
E_Value value;
E_Space space;
E_InterpretationCode code;
};
////////////////////////////////
//~ rjf: Evaluation Artifact Bundle
@@ -319,6 +340,7 @@ typedef struct E_Eval E_Eval;
struct E_Eval
{
E_Key key;
String8 string;
E_Expr *expr;
E_IRTreeAndType irtree;
String8 bytecode;
@@ -432,12 +454,12 @@ typedef E_TYPE_IREXT_FUNCTION_SIG(E_TypeIRExtFunctionType);
#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_Expr *expr, E_IRTreeAndType *irtree, String8 filter)
#define E_TYPE_EXPAND_INFO_FUNCTION_SIG(name) E_TypeExpandInfo name(Arena *arena, E_Eval eval, 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, E_IRTreeAndType *irtree, 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_Eval eval, String8 filter, Rng1U64 idx_range, E_Eval *evals_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);
@@ -698,30 +720,6 @@ struct E_IRCtx
E_AutoHookMap *auto_hook_map;
};
////////////////////////////////
//~ rjf: Parse Results
typedef struct E_Parse E_Parse;
struct E_Parse
{
E_TokenArray tokens;
E_Token *last_token;
E_Expr *expr;
E_Expr *last_expr;
E_MsgList msgs;
};
////////////////////////////////
//~ rjf: Bytecode Interpretation Types
typedef struct E_Interpretation E_Interpretation;
struct E_Interpretation
{
E_Value value;
E_Space space;
E_InterpretationCode code;
};
////////////////////////////////
//~ rjf: Core Evaluation Cache Types
@@ -991,7 +989,7 @@ read_only global E_String2NumMap e_string2num_map_nil = {0};
read_only global E_String2ExprMap e_string2expr_map_nil = {0};
read_only global E_Expr e_expr_nil = {&e_expr_nil, &e_expr_nil, &e_expr_nil, &e_expr_nil, &e_expr_nil};
read_only global E_IRNode e_irnode_nil = {&e_irnode_nil, &e_irnode_nil, &e_irnode_nil};
read_only global E_Eval e_eval_nil = {{0}, &e_expr_nil, {&e_irnode_nil}};
read_only global E_Eval e_eval_nil = {{0}, {0}, &e_expr_nil, {&e_irnode_nil}};
read_only global E_Module e_module_nil = {&rdi_parsed_nil};
read_only global E_CacheBundle e_cache_bundle_nil = {0, {0}, {0}, {0}, {{0}, 0, &e_expr_nil, &e_expr_nil}, {&e_irnode_nil}};
thread_static E_BaseCtx *e_base_ctx = 0;
+25 -51
View File
@@ -2103,7 +2103,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(default)
{
//- rjf: try to extract a struct-like type key, enum-like, or array-like
// type key, for expansion
E_TypeKey expand_type_key = e_default_expansion_type_from_key(irtree->type_key);
E_TypeKey expand_type_key = e_default_expansion_type_from_key(eval.irtree.type_key);
//- rjf: struct type? -> use the struct type for expansion
B32 did_expansion = 0;
@@ -2154,7 +2154,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(default)
{
//- rjf: try to extract a struct-like type key, enum-like, or array-like
// type key, for expansion
E_TypeKey expand_type_key = e_default_expansion_type_from_key(irtree->type_key);
E_TypeKey expand_type_key = e_default_expansion_type_from_key(eval.irtree.type_key);
E_TypeKind expand_type_kind = e_type_kind_from_key(expand_type_key);
//- rjf: struct case -> the lookup-range will return a range of members
@@ -2170,7 +2170,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(default)
{
U64 member_idx = idx + read_range.min;
String8 member_name = data_members.v[member_idx].name;
exprs_out[idx] = e_expr_irext_member_access(arena, expr, irtree, member_name);
evals_out[idx] = e_eval_wrapf(eval, "$.%S", member_name);
}
}
@@ -2185,7 +2185,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(default)
{
U64 member_idx = idx + read_range.min;
String8 member_name = type->enum_vals[member_idx].name;
exprs_out[idx] = e_expr_irext_member_access(arena, expr, irtree, member_name);
evals_out[idx] = e_eval_wrapf(eval, "$.%S", member_name);
}
}
@@ -2197,7 +2197,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(default)
U64 read_range_count = dim_1u64(idx_range);
for(U64 idx = 0; idx < read_range_count; idx += 1)
{
exprs_out[idx] = e_expr_irext_array_index(arena, expr, irtree, idx_range.min + idx);
evals_out[idx] = e_eval_wrapf(eval, "$[%I64u]", idx_range.min + idx);
}
}
}
@@ -2219,21 +2219,21 @@ E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(identity)
E_TYPE_EXPAND_INFO_FUNCTION_DEF(only)
{
E_Type *type = e_type_from_key__cached(irtree->type_key);
E_Type *type = e_type_from_key__cached(eval.irtree.type_key);
E_TypeExpandInfo info = {0, type->count};
return info;
}
E_TYPE_EXPAND_RANGE_FUNCTION_DEF(only)
{
E_Type *type = e_type_from_key__cached(irtree->type_key);
E_Type *type = e_type_from_key__cached(eval.irtree.type_key);
U64 out_idx = 0;
for(U64 idx = idx_range.min; idx < idx_range.max; idx += 1, out_idx += 1)
{
E_Expr *arg = type->args[idx];
if(arg->string.size != 0)
{
exprs_out[out_idx] = e_expr_irext_member_access(arena, expr, irtree, arg->string);
evals_out[out_idx] = e_eval_wrapf(eval, "$.%S", arg->string);
}
}
}
@@ -2243,12 +2243,13 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(only)
E_TYPE_EXPAND_INFO_FUNCTION_DEF(omit)
{
E_Type *type = e_type_from_key__cached(irtree->type_key);
E_Type *type = e_type_from_key__cached(eval.irtree.type_key);
String8Array allowed_children_array = {0};
{
Temp scratch = scratch_begin(&arena, 1);
String8List allowed_children = {0};
{
#if 0 // TODO(rjf): @eval
E_Type *stripped_type = e_type_from_key__cached(type->direct_type_key);
// TODO(rjf): this is kind of ugly due to the need to call irext,
// i wish it was possible to have an easier way to "strip" the current
@@ -2289,6 +2290,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(omit)
}
}
}
#endif
}
allowed_children_array = str8_array_from_list(arena, &allowed_children);
scratch_end(scratch);
@@ -2308,7 +2310,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(omit)
String8 name = ext->v[idx];
if(name.size != 0)
{
exprs_out[out_idx] = e_expr_irext_member_access(arena, expr, irtree, name);
evals_out[out_idx] = e_eval_wrapf(eval, "$.%S", name);
}
}
}
@@ -2318,18 +2320,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(omit)
E_TYPE_EXPAND_INFO_FUNCTION_DEF(sequence)
{
E_Type *type = e_type_from_key__cached(irtree->type_key);
U64 count = 0;
{
Temp scratch = scratch_begin(&arena, 1);
E_OpList count_oplist = e_oplist_from_irtree(scratch.arena, irtree->root);
String8 count_bytecode = e_bytecode_from_oplist(scratch.arena, &count_oplist);
E_Interpretation count_interpret = e_interpret(count_bytecode);
E_Value count_value = count_interpret.value;
count = count_value.u64;
scratch_end(scratch);
}
E_TypeExpandInfo info = {0, count};
E_TypeExpandInfo info = {0, eval.value.u64};
return info;
}
@@ -2338,9 +2329,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(sequence)
U64 read_range_count = dim_1u64(idx_range);
for(U64 idx = 0; idx < read_range_count; idx += 1)
{
E_Expr *expr = e_push_expr(arena, E_ExprKind_LeafU64, 0);
expr->value.u64 = idx_range.min + idx;
exprs_out[idx] = expr;
evals_out[idx] = e_eval_from_stringf("%I64u", idx_range.min + idx);
}
}
@@ -2349,7 +2338,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(sequence)
E_TYPE_EXPAND_INFO_FUNCTION_DEF(array)
{
E_Type *type = e_type_from_key__cached(irtree->type_key);
E_Type *type = e_type_from_key__cached(eval.irtree.type_key);
U64 count = 1;
if(type->args != 0 && type->count > 0)
{
@@ -2366,7 +2355,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(array)
U64 read_range_count = dim_1u64(idx_range);
for(U64 idx = 0; idx < read_range_count; idx += 1)
{
exprs_out[idx] = e_expr_irext_array_index(arena, expr, irtree, idx_range.min + idx);
evals_out[idx] = e_eval_wrapf(eval, "$[I64u]", idx_range.min + idx);
}
}
@@ -2525,7 +2514,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(slice)
E_TYPE_EXPAND_INFO_FUNCTION_DEF(slice)
{
E_SliceAccel *accel = (E_SliceAccel *)irtree->user_data;
E_SliceAccel *accel = (E_SliceAccel *)eval.irtree.user_data;
E_TypeExpandInfo info = {accel, accel->count};
return info;
}
@@ -2535,7 +2524,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(slice)
U64 read_range_count = dim_1u64(idx_range);
for(U64 idx = 0; idx < read_range_count; idx += 1)
{
exprs_out[idx] = e_expr_irext_array_index(arena, expr, irtree, idx_range.min + idx);
evals_out[idx] = e_eval_wrapf(eval, "$[%I64u]", idx_range.min + idx);
}
}
@@ -2557,11 +2546,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(folder)
Temp scratch = scratch_begin(&arena, 1);
//- rjf: evaluate lhs file path ID
E_OpList lhs_oplist = e_oplist_from_irtree(scratch.arena, irtree->root);
String8 lhs_bytecode = e_bytecode_from_oplist(scratch.arena, &lhs_oplist);
E_Interpretation lhs_interp = e_interpret(lhs_bytecode);
E_Value lhs_value = lhs_interp.value;
U64 lhs_string_id = lhs_value.u64;
U64 lhs_string_id = eval.value.u64;
String8 folder_path = e_string_from_id(lhs_string_id);
//- rjf: compute filter - omit common prefixes (common parent paths)
@@ -2621,30 +2606,20 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(folder)
for(U64 idx = idx_range.min; idx < idx_range.max; idx += 1, out_idx += 1)
{
Temp scratch = scratch_begin(&arena, 1);
E_Expr *expr = &e_expr_nil;
String8 expr_string = {0};
String8 path_expr_string = {0};
if(0 <= idx && idx < accel->folders.count)
{
String8 folder_name = accel->folders.v[idx - 0];
String8 folder_path = push_str8f(scratch.arena, "%S%s%S", accel->folder_path, accel->folder_path.size != 0 ? "/" : "", folder_name);
expr = e_push_expr(arena, E_ExprKind_LeafValue, 0);
expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = str8_lit("folder"));
expr->space = e_space_make(E_SpaceKind_FileSystem);
expr->value.u64 = e_id_from_string(folder_path);
expr_string = push_str8f(arena, "\"%S\"", escaped_from_raw_str8(scratch.arena, folder_name));
path_expr_string = push_str8f(arena, "file:\"%S\"", escaped_from_raw_str8(scratch.arena, folder_path));
}
else if(accel->folders.count <= idx && idx < accel->folders.count + accel->files.count)
{
String8 file_name = accel->files.v[idx - accel->folders.count];
String8 file_path = push_str8f(scratch.arena, "%S%s%S", accel->folder_path, accel->folder_path.size != 0 ? "/" : "", file_name);
expr = e_push_expr(arena, E_ExprKind_LeafValue, 0);
expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = str8_lit("file"));
expr->space = e_space_make(E_SpaceKind_FileSystem);
expr->value.u64 = e_id_from_string(file_path);
expr_string = push_str8f(arena, "\"%S\"", escaped_from_raw_str8(scratch.arena, file_name));
path_expr_string = push_str8f(arena, "file:\"%S\"", escaped_from_raw_str8(scratch.arena, file_path));
}
exprs_out[out_idx] = expr;
exprs_strings_out[out_idx] = expr_string;
evals_out[out_idx] = e_eval_from_string(path_expr_string);
scratch_end(scratch);
}
}
@@ -2783,7 +2758,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(file)
E_TYPE_EXPAND_INFO_FUNCTION_DEF(file)
{
E_FileAccel *accel = (E_FileAccel *)irtree->user_data;
E_FileAccel *accel = (E_FileAccel *)eval.irtree.user_data;
E_TypeExpandInfo info = {accel, accel->fields.count};
return info;
}
@@ -2805,8 +2780,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(file)
rhs->string = push_str8_copy(arena, name);
e_expr_push_child(expr, lhs);
e_expr_push_child(expr, rhs);
evals_out[out_idx] = e_eval_wrapf(eval, "$.%S", name);
}
exprs_out[out_idx] = expr;
exprs_strings_out[out_idx] = string;
}
}
@@ -587,7 +587,7 @@ ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval eval
// rjf: get top-level lookup/expansion info
// TODO(rjf): @eval before expanding a type, ALWAYS select the parent key
E_TypeExpandInfo type_expand_info = type_expand_rule->info(arena, t->eval.expr, &t->eval.irtree, filter);
E_TypeExpandInfo type_expand_info = type_expand_rule->info(arena, t->eval, filter);
EV_ExpandInfo viz_expand_info = viz_expand_rule->info(arena, view, filter, t->eval.expr);
// rjf: determine expansion info
@@ -701,21 +701,16 @@ ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval eval
if(viz_expand_info.rows_default_expanded || ev_expansion_from_key(view, child_keys[idx]))
{
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, &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(child_expr);
EV_Key child_key = child_keys[idx];
Task *task = push_array(scratch.arena, Task, 1);
SLLQueuePush(first_task, last_task, task);
task->parent_block = expansion_block;
task->eval = child_eval;
task->child_id = child_key.child_id;
task->split_relative_idx = split_relative_idx;
task->default_expanded = viz_expand_info.rows_default_expanded;
}
E_Eval child_eval = {0};
type_expand_rule->range(arena, type_expand_info.user_data, t->eval, filter, r1u64(split_relative_idx, split_relative_idx+1), &child_eval);
EV_Key child_key = child_keys[idx];
Task *task = push_array(scratch.arena, Task, 1);
SLLQueuePush(first_task, last_task, task);
task->parent_block = expansion_block;
task->eval = child_eval;
task->child_id = child_key.child_id;
task->split_relative_idx = split_relative_idx;
task->default_expanded = viz_expand_info.rows_default_expanded;
}
}
@@ -1009,11 +1004,10 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8
// rjf: get info about expansion range
B32 is_standalone_row = 0;
U64 range_exprs_count = dim_1u64(block_relative_range__windowed);
E_Expr **range_exprs = push_array(arena, E_Expr *, range_exprs_count);
String8 *range_exprs_strings = push_array(arena, String8 ,range_exprs_count);
E_Eval *range_evals = push_array(arena, E_Eval, range_exprs_count);
for EachIndex(idx, range_exprs_count)
{
range_exprs[idx] = &e_expr_nil;
range_evals[idx] = e_eval_nil;
}
if(n->v.block->viz_expand_info.single_item || n->v.block->parent == &ev_nil_block)
{
@@ -1021,7 +1015,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, &n->v.block->eval.irtree, 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, filter, block_relative_range__windowed, range_evals);
}
// rjf: no expansion operator applied -> push row for block expression; pass through block info
@@ -1046,8 +1040,7 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8
U64 child_num = block_relative_range.min + num_skipped + idx + 1;
U64 child_id = ev_block_id_from_num(n->v.block, child_num);
EV_Key row_key = ev_key_make(ev_hash_from_key(n->v.block->key), child_id);
E_Expr *row_expr = range_exprs[idx];
E_Eval row_eval = e_eval_from_expr(row_expr);
E_Eval row_eval = range_evals[idx];
EV_WindowedRowNode *row_node = push_array(arena, EV_WindowedRowNode, 1);
SLLQueuePush(rows.first, rows.last, row_node);
rows.count += 1;
@@ -1055,7 +1048,7 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8
row->block = n->v.block;
row->key = row_key;
row->visual_size = 1;
row->edit_string = range_exprs_strings[idx];
row->edit_string = row_eval.string;
row->eval = row_eval;
}
}
@@ -2107,7 +2100,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)
expand_data->type = e_type_from_key__cached(type_key);
expand_data->expand_rule = e_expand_rule_from_type_key(type_key);
// TODO(rjf): @eval before expanding a type, ALWAYS select the parent key
expand_data->expand_info = expand_data->expand_rule->info(arena, eval.expr, &eval.irtree, params->filter);
expand_data->expand_info = expand_data->expand_rule->info(arena, eval, params->filter);
}
switch(task_idx)
{
@@ -2128,15 +2121,14 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)
//- rjf: middle step -> generate new task for next thing in expansion
else
{
E_Expr *next_expr = &e_expr_nil;
String8 next_string = {0};
expand_data->expand_rule->range(arena, expand_data->expand_info.user_data, eval.expr, &eval.irtree, params->filter, r1u64(task_idx-1, task_idx), &next_expr, &next_string);
if(next_expr != &e_expr_nil)
E_Eval next_eval = {0};
expand_data->expand_rule->range(arena, expand_data->expand_info.user_data, eval, params->filter, r1u64(task_idx-1, task_idx), &next_eval);
if(next_eval.expr != 0 && next_eval.expr != &e_expr_nil)
{
need_new_task = 1;
need_pop = 0;
new_task.params = *params;
new_task.eval = e_eval_from_expr(next_expr);
new_task.eval = next_eval;
if(task_idx > 1)
{
*out_string = str8_lit(", ");
@@ -294,7 +294,7 @@ global read_only EV_Block ev_nil_block =
{0},
0,
{0},
{{0}, &e_expr_nil, &e_irnode_nil},
{{0}, {0}, &e_expr_nil, &e_irnode_nil},
{0},
&e_type_expand_rule__default,
{0},
+34 -72
View File
@@ -76,7 +76,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(commands)
{
String8 cmd_name = accel->v[idx];
E_Eval cmd_eval = e_eval_from_stringf("query:commands.%S", cmd_name);
exprs_out[out_idx] = cmd_eval.expr;
evals_out[out_idx] = cmd_eval;
}
}
@@ -138,8 +138,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(watches)
if(cfg_idx < cfgs->count)
{
String8 expr_string = rd_cfg_child_from_string(cfgs->v[cfg_idx], str8_lit("expression"))->first->string;
exprs_out[idx] = e_parse_from_string(expr_string).expr;
exprs_strings_out[idx] = push_str8_copy(arena, expr_string);
evals_out[idx] = e_eval_from_string(expr_string);
}
}
}
@@ -220,8 +219,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(locals)
for(U64 idx = 0; idx < read_range_count; idx += 1)
{
String8 expr_string = accel->v[read_range.min + idx];
exprs_out[idx] = e_parse_from_string(expr_string).expr;
exprs_strings_out[idx] = push_str8_copy(arena, expr_string);
evals_out[idx] = e_eval_from_string(expr_string);
}
}
@@ -271,8 +269,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(registers)
{
String8 register_name = accel->v[read_range.min + idx];
String8 register_expr = push_str8f(arena, "reg:%S", register_name);
exprs_strings_out[idx] = register_name;
exprs_out[idx] = e_parse_from_string(register_expr).expr;
evals_out[idx] = e_eval_from_string(register_expr);
}
}
@@ -503,7 +500,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(schema)
Temp scratch = scratch_begin(&arena, 1);
// rjf: unpack
RD_SchemaIRExt *ext = (RD_SchemaIRExt *)irtree->user_data;
RD_SchemaIRExt *ext = (RD_SchemaIRExt *)eval.irtree.user_data;
// rjf: gather expansion commands
String8Array commands = {0};
@@ -597,7 +594,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(schema)
Rng1U64 read_range = intersect_1u64(idx_range, cmds_idx_range);
for(U64 idx = read_range.min; idx < read_range.max; idx += 1, out_idx += 1)
{
exprs_out[out_idx] = e_expr_irext_member_access(arena, expr, irtree, accel->commands.v[idx - cmds_idx_range.min]);
evals_out[out_idx] = e_eval_from_stringf("query:commands.%S", accel->commands.v[idx - cmds_idx_range.min]);
}
}
@@ -607,7 +604,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(schema)
for(U64 idx = read_range.min; idx < read_range.max; idx += 1, out_idx += 1)
{
MD_Node *child_schema = accel->children[idx - chld_idx_range.min];
exprs_out[out_idx] = e_expr_irext_member_access(arena, expr, irtree, child_schema->string);
evals_out[out_idx] = e_eval_wrapf(eval, "$.%S", child_schema->string);
}
}
}
@@ -719,7 +716,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(cfgs)
Temp scratch = scratch_begin(&arena, 1);
{
//- rjf: unpack
RD_CfgsIRExt *ext = (RD_CfgsIRExt *)irtree->user_data;
RD_CfgsIRExt *ext = (RD_CfgsIRExt *)eval.irtree.user_data;
//- rjf: filter cfgs
RD_CfgArray cfgs__filtered = ext->cfgs;
@@ -767,7 +764,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(cfgs)
{
String8 cmd_name = accel->cmds.v[idx + read_range.min - cmds_idx_range.min];
E_Eval cmd_eval = e_eval_wrapf(cmds_eval, "$.%S", cmd_name);
exprs_out[dst_idx] = cmd_eval.expr;
evals_out[dst_idx] = cmd_eval;
}
}
@@ -778,7 +775,7 @@ E_TYPE_EXPAND_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_out[dst_idx] = e_expr_irext_member_access(arena, expr, irtree, push_str8f(arena, "$%I64d", cfg->id));
evals_out[dst_idx] = e_eval_wrapf(eval, "$.$%I64d", cfg->id);
}
}
}
@@ -883,7 +880,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(call_stack)
E_TYPE_EXPAND_INFO_FUNCTION_DEF(call_stack)
{
RD_CallStackAccel *accel = (RD_CallStackAccel *)irtree->user_data;
RD_CallStackAccel *accel = (RD_CallStackAccel *)eval.irtree.user_data;
E_TypeExpandInfo result = {0};
result.user_data = accel;
result.expr_count = accel->call_stack.count;
@@ -945,7 +942,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(environment)
E_TYPE_EXPAND_INFO_FUNCTION_DEF(environment)
{
RD_EnvironmentAccel *accel = (RD_EnvironmentAccel *)irtree->user_data;
RD_EnvironmentAccel *accel = (RD_EnvironmentAccel *)eval.irtree.user_data;
E_TypeExpandInfo result = {accel, accel->cfgs.count + 1};
return result;
}
@@ -961,7 +958,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(environment)
U64 cfg_idx = read_range.min + idx;
if(cfg_idx < accel->cfgs.count)
{
exprs_out[idx] = e_expr_irext_array_index(arena, expr, irtree, cfg_idx);
evals_out[idx] = e_eval_wrapf(eval, "$[%I64u]", cfg_idx);
}
}
}
@@ -1022,10 +1019,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(unattached_processes)
Temp scratch = scratch_begin(&arena, 1);
//- rjf: evaluate lhs machine, if we have one
E_OpList lhs_oplist = e_oplist_from_irtree(scratch.arena, irtree->root);
String8 lhs_bytecode = e_bytecode_from_oplist(scratch.arena, &lhs_oplist);
E_Interpretation lhs_interp = e_interpret(lhs_bytecode);
CTRL_Entity *lhs_entity = rd_ctrl_entity_from_eval_space(lhs_interp.space);
CTRL_Entity *lhs_entity = rd_ctrl_entity_from_eval_space(eval.space);
//- rjf: gather all machines we're searching through
CTRL_EntityArray machines = {0};
@@ -1113,12 +1107,13 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(unattached_processes)
E_TypeKey unattached_process_type = e_type_key_cons(.kind = E_TypeKind_U128, .name = str8_lit("unattached_process"));
for(U64 idx = idx_range.min; idx < idx_range.max; idx += 1, out_idx += 1)
{
#if 0 // TODO(rjf): @eval
E_Expr *expr = e_push_expr(arena, E_ExprKind_LeafValue, 0);
expr->type_key = unattached_process_type;
expr->value.u128.u64[0] = accel->infos[idx].pid;
expr->value.u128.u64[1] = e_id_from_string(accel->infos[idx].name);
expr->space = rd_eval_space_from_ctrl_entity(accel->machines[idx], RD_EvalSpaceKind_MetaUnattachedProcess);
exprs_out[out_idx] = expr;
#endif
}
}
@@ -1170,17 +1165,14 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(ctrl_entities)
Temp scratch = scratch_begin(&arena, 1);
{
//- rjf: determine which entity we're looking under
E_OpList lhs_oplist = e_oplist_from_irtree(scratch.arena, irtree->root);
String8 lhs_bytecode = e_bytecode_from_oplist(scratch.arena, &lhs_oplist);
E_Interpretation lhs_interp = e_interpret(lhs_bytecode);
CTRL_Entity *scoping_entity = &ctrl_entity_nil;
if(lhs_interp.space.kind == RD_EvalSpaceKind_MetaCtrlEntity)
if(eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity)
{
scoping_entity = rd_ctrl_entity_from_eval_space(lhs_interp.space);
scoping_entity = rd_ctrl_entity_from_eval_space(eval.space);
}
//- rjf: determine which type of child we're gathering
E_TypeKey lhs_type_key = irtree->type_key;
E_TypeKey lhs_type_key = eval.irtree.type_key;
E_Type *lhs_type = e_type_from_key__cached(lhs_type_key);
String8 name = rd_singular_from_code_name_plural(lhs_type->name);
CTRL_EntityKind entity_kind = ctrl_entity_kind_from_string(name);
@@ -1242,7 +1234,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(ctrl_entities)
for(U64 out_idx = 0; out_idx < read_count; out_idx += 1)
{
CTRL_Entity *entity = entities->v[out_idx + read_range.min];
exprs_out[out_idx] = e_expr_irext_member_access(arena, expr, irtree, ctrl_string_from_handle(arena, entity->handle));
evals_out[out_idx] = ctrl_eval_from_handle(entity->handle);
}
}
@@ -1265,7 +1257,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(debug_info_table)
// rjf: determine which debug info section we're dealing with
RDI_SectionKind section = RDI_SectionKind_NULL;
{
E_TypeKey lhs_type_key = irtree->type_key;
E_TypeKey lhs_type_key = eval.irtree.type_key;
E_Type *lhs_type = e_type_from_key__cached(lhs_type_key);
if(0){}
else if(str8_match(lhs_type->name, str8_lit("procedures"), 0)) {section = RDI_SectionKind_Procedures;}
@@ -1327,8 +1319,8 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(debug_info_table)
RDI_Parsed *rdi = accel->rdis[item->dbgi_idx];
E_Module *module = &e_base_ctx->modules[item->dbgi_idx];
// rjf: build expr
E_Expr *item_expr = &e_expr_nil;
// rjf: build item's evaluation
E_Eval item_eval = e_eval_nil;
{
U64 element_idx = item->idx;
switch(accel->section)
@@ -1336,7 +1328,6 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(debug_info_table)
default:{}break;
case RDI_SectionKind_Procedures:
{
Temp scratch = scratch_begin(&arena, 1);
RDI_Procedure *procedure = rdi_element_from_name_idx(module->rdi, Procedures, element_idx);
RDI_Scope *scope = rdi_element_from_name_idx(module->rdi, Scopes, procedure->root_scope_idx);
U64 voff = *rdi_element_from_name_idx(module->rdi, ScopeVOffData, scope->voff_range_first);
@@ -1348,64 +1339,35 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(debug_info_table)
E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_base_ctx->modules));
String8 symbol_name = {0};
symbol_name.str = rdi_string_from_idx(module->rdi, procedure->name_string_idx, &symbol_name.size);
String8List strings = {0};
e_type_lhs_string_from_key(scratch.arena, type_key, &strings, 0, 0);
str8_list_push(scratch.arena, &strings, symbol_name);
e_type_rhs_string_from_key(scratch.arena, type_key, &strings, 0);
item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0);
item_expr->mode = E_Mode_Value;
item_expr->space = module->space;
item_expr->type_key = type_key;
item_expr->bytecode = bytecode;
item_expr->string = str8_list_join(arena, &strings, 0);
scratch_end(scratch);
item_eval = e_eval_from_string(symbol_name);
}break;
case RDI_SectionKind_GlobalVariables:
{
RDI_GlobalVariable *gvar = rdi_element_from_name_idx(module->rdi, GlobalVariables, element_idx);
U64 voff = gvar->voff;
E_OpList oplist = {0};
e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(module->vaddr_range.min + voff));
String8 bytecode = e_bytecode_from_oplist(arena, &oplist);
U32 type_idx = gvar->type_idx;
RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx);
E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_base_ctx->modules));
item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0);
item_expr->mode = E_Mode_Offset;
item_expr->space = module->space;
item_expr->type_key = type_key;
item_expr->bytecode = bytecode;
item_expr->string.str = rdi_string_from_idx(module->rdi, gvar->name_string_idx, &item_expr->string.size);
String8 symbol_name = {0};
symbol_name.str = rdi_string_from_idx(module->rdi, gvar->name_string_idx, &symbol_name.size);
item_eval = e_eval_from_string(symbol_name);
}break;
case RDI_SectionKind_ThreadVariables:
{
RDI_ThreadVariable *tvar = rdi_element_from_name_idx(module->rdi, ThreadVariables, element_idx);
E_OpList oplist = {0};
e_oplist_push_op(arena, &oplist, RDI_EvalOp_TLSOff, e_value_u64(tvar->tls_off));
String8 bytecode = e_bytecode_from_oplist(arena, &oplist);
U32 type_idx = tvar->type_idx;
RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx);
E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_base_ctx->modules));
item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0);
item_expr->mode = E_Mode_Offset;
item_expr->space = module->space;
item_expr->type_key = type_key;
item_expr->bytecode = bytecode;
item_expr->string.str = rdi_string_from_idx(module->rdi, tvar->name_string_idx, &item_expr->string.size);
String8 symbol_name = {0};
symbol_name.str = rdi_string_from_idx(module->rdi, tvar->name_string_idx, &symbol_name.size);
item_eval = e_eval_from_string(symbol_name);
}break;
case RDI_SectionKind_UDTs:
{
RDI_UDT *udt = rdi_element_from_name_idx(module->rdi, UDTs, element_idx);
RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, udt->self_type_idx);
E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), udt->self_type_idx, (U32)(module - e_base_ctx->modules));
item_expr = e_push_expr(arena, E_ExprKind_TypeIdent, 0);
item_expr->type_key = type_key;
String8 name = {0};
name.str = rdi_string_from_idx(module->rdi, type_node->user_defined.name_string_idx, &name.size);
item_eval = e_eval_from_string(name);
}break;
}
}
// rjf: fill
exprs_out[idx] = item_expr;
evals_out[idx] = item_eval;
}
}