From a35e4836294a5739e14b642649fe338698cc84f9 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 24 Apr 2025 09:36:00 -0700 Subject: [PATCH] switch type expansion hooks to being eval-based, not expr/irtree-based --- src/eval/eval_core.c | 9 +- src/eval/eval_core.h | 52 +++++---- src/eval/eval_types.c | 76 +++++-------- .../eval_visualization_core.c | 50 ++++----- .../eval_visualization_core.h | 2 +- src/raddbg/raddbg_eval.c | 106 ++++++------------ 6 files changed, 111 insertions(+), 184 deletions(-) diff --git a/src/eval/eval_core.c b/src/eval/eval_core.c index 7e8d5757..c9d9ddb6 100644 --- a/src/eval/eval_core.c +++ b/src/eval/eval_core.c @@ -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; diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index 3893e0ec..b56d64be 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -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; diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index 6b4156b0..5b4d4d97 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -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; } } diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index 77e7a380..422ff1ec 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -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(", "); diff --git a/src/eval_visualization/eval_visualization_core.h b/src/eval_visualization/eval_visualization_core.h index bed73c3f..84d2f7fb 100644 --- a/src/eval_visualization/eval_visualization_core.h +++ b/src/eval_visualization/eval_visualization_core.h @@ -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}, diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index 4ff074b6..7ab12cce 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -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; } }