From ba293509398b82a7c9de8ff261c40926fc71f9c0 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 23 Apr 2025 16:00:23 -0700 Subject: [PATCH] parse cache, ir-tree cache --- src/ctrl/ctrl_core.c | 1 + src/eval/eval_bundles.c | 47 ++++--- src/eval/eval_core.h | 6 +- src/eval/eval_ir.c | 103 +++++++++----- src/eval/eval_ir.h | 25 +++- src/eval/eval_parse.c | 111 +++++++++++---- src/eval/eval_parse.h | 33 ++++- .../eval_visualization_core.h | 2 +- src/raddbg/raddbg_core.c | 131 ++++++++---------- src/raddbg/raddbg_core.h | 1 - src/raddbg/raddbg_eval.c | 18 ++- 11 files changed, 307 insertions(+), 171 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index eb7f3476..189ebae4 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -4781,6 +4781,7 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_Entity *thread) ////////////////////////////// //- rjf: begin type evaluation // + e_parse_eval_begin(); e_type_eval_begin(); ////////////////////////////// diff --git a/src/eval/eval_bundles.c b/src/eval/eval_bundles.c index fcfca2b7..98ca8c89 100644 --- a/src/eval/eval_bundles.c +++ b/src/eval/eval_bundles.c @@ -8,7 +8,7 @@ internal E_Eval e_eval_from_expr(Arena *arena, E_Expr *expr) { ProfBeginFunction(); - E_IRTreeAndType irtree = e_irtree_and_type_from_expr(arena, expr); + E_IRTreeAndType irtree = e_push_irtree_and_type_from_expr(arena, expr); E_OpList oplist = e_oplist_from_irtree(arena, irtree.root); String8 bytecode = e_bytecode_from_oplist(arena, &oplist); E_Interpretation interp = e_interpret(bytecode); @@ -35,10 +35,25 @@ e_eval_from_string(Arena *arena, String8 string) { ProfBeginFunction(); ProfBegin("e_eval_from_string (%.*s)", str8_varg(string)); - E_TokenArray tokens = e_token_array_from_text(arena, string); - E_Parse parse = e_parse_expr_from_text_tokens(arena, string, tokens); - E_Eval eval = e_eval_from_expr(arena, parse.expr); - e_msg_list_concat_in_place(&eval.msgs, &parse.msgs); + E_Parse parse = e_parse_from_string(string); + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(parse.expr); + E_OpList oplist = e_oplist_from_irtree(arena, irtree.root); + String8 bytecode = e_bytecode_from_oplist(arena, &oplist); + E_Interpretation interp = e_interpret(bytecode); + E_Eval eval = + { + .value = interp.value, + .space = interp.space, + .expr = parse.expr, + .irtree = irtree, + .bytecode = bytecode, + .code = interp.code, + }; + e_msg_list_concat_in_place(&eval.msgs, &irtree.msgs); + if(E_InterpretationCode_Good < eval.code && eval.code < E_InterpretationCode_COUNT) + { + e_msg(arena, &eval.msgs, E_MsgKind_InterpretationError, 0, e_interpretation_code_display_strings[eval.code]); + } ProfEnd(); ProfEnd(); return eval; @@ -322,18 +337,8 @@ e_debug_log_from_expr_string(Arena *arena, String8 string) String8 expr_text = string; str8_list_pushf(scratch.arena, &strings, "`%S`\n", expr_text); - //- rjf: tokenize - E_TokenArray tokens = e_token_array_from_text(scratch.arena, expr_text); - str8_list_pushf(scratch.arena, &strings, " tokens:\n"); - for EachIndex(idx, tokens.count) - { - E_Token token = tokens.v[idx]; - String8 token_string = str8_substr(expr_text, token.range); - str8_list_pushf(scratch.arena, &strings, " %S: `%S`\n", e_token_kind_strings[token.kind], token_string); - } - //- rjf: parse - E_Parse parse = e_parse_expr_from_text_tokens(scratch.arena, expr_text, tokens); + E_Parse parse = e_push_parse_from_string(scratch.arena, expr_text); { typedef struct Task Task; struct Task @@ -342,6 +347,14 @@ e_debug_log_from_expr_string(Arena *arena, String8 string) E_Expr *expr; S32 indent; }; + E_TokenArray tokens = parse.tokens; + str8_list_pushf(scratch.arena, &strings, " tokens:\n"); + for EachIndex(idx, tokens.count) + { + E_Token token = tokens.v[idx]; + String8 token_string = str8_substr(expr_text, token.range); + str8_list_pushf(scratch.arena, &strings, " %S: `%S`\n", e_token_kind_strings[token.kind], token_string); + } str8_list_pushf(scratch.arena, &strings, " expr:\n"); Task start_task = {0, parse.expr, 2}; Task *first_task = &start_task; @@ -376,7 +389,7 @@ e_debug_log_from_expr_string(Arena *arena, String8 string) } //- rjf: type - E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, parse.expr); + E_IRTreeAndType irtree = e_push_irtree_and_type_from_expr(scratch.arena, parse.expr); { str8_list_pushf(scratch.arena, &strings, " type:\n"); S32 indent = 2; diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index 7e361fe9..c6a8c504 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -309,12 +309,12 @@ struct E_IRTreeAndType typedef struct E_Eval E_Eval; struct E_Eval { - E_Value value; - E_Space space; E_Expr *expr; E_IRTreeAndType irtree; String8 bytecode; E_InterpretationCode code; + E_Value value; + E_Space space; E_MsgList msgs; }; @@ -647,7 +647,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 = {zero_struct, zero_struct, &e_expr_nil, {&e_irnode_nil}}; +read_only global E_Eval e_eval_nil = {&e_expr_nil, {&e_irnode_nil}}; read_only global E_Module e_module_nil = {&rdi_parsed_nil}; thread_static E_BaseCtx *e_base_ctx = 0; thread_static U64 e_base_ctx_gen = 0; diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 73d0d69c..e355f78c 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -88,6 +88,8 @@ e_select_ir_ctx(E_IRCtx *ctx) e_ir_state->string_id_map->id_slots = push_array(e_ir_state->arena, E_StringIDSlot, e_ir_state->string_id_map->id_slots_count); e_ir_state->string_id_map->hash_slots_count = 1024; e_ir_state->string_id_map->hash_slots = push_array(e_ir_state->arena, E_StringIDSlot, e_ir_state->string_id_map->hash_slots_count); + e_ir_state->ir_cache_slots_count = 4096; + e_ir_state->ir_cache_slots = push_array(e_ir_state->arena, E_IRCacheSlot, e_ir_state->ir_cache_slots_count); String8 builtin_view_rule_names[] = { str8_lit_comp("bswap"), @@ -115,20 +117,17 @@ e_auto_hook_map_make(Arena *arena, U64 slots_count) internal void e_auto_hook_map_insert_new_(Arena *arena, E_AutoHookMap *map, E_AutoHookParams *params) { - Temp scratch = scratch_begin(&arena, 1); E_TypeKey type_key = params->type_key; if(params->type_pattern.size != 0) { - E_TokenArray tokens = e_token_array_from_text(scratch.arena, params->type_pattern); - E_Parse parse = e_parse_type_from_text_tokens(scratch.arena, params->type_pattern, tokens); - E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, parse.expr); - type_key = irtree.type_key; + E_Parse parse = e_parse_from_string(params->type_pattern); + type_key = e_type_key_from_expr(parse.expr); } E_AutoHookNode *node = push_array(arena, E_AutoHookNode, 1); node->type_string = str8_skip_chop_whitespace(e_type_string_from_key(arena, type_key)); U8 pattern_split = '?'; node->type_pattern_parts = str8_split(arena, params->type_pattern, &pattern_split, 1, StringSplitFlag_KeepEmpties); - node->expr = e_parse_expr_from_text(arena, push_str8_copy(arena, params->tag_expr_string)).expr; + node->expr = e_parse_from_string(params->tag_expr_string).expr; if(!e_type_key_match(e_type_key_zero(), type_key)) { U64 hash = e_hash_from_string(5381, node->type_string); @@ -139,7 +138,6 @@ e_auto_hook_map_insert_new_(Arena *arena, E_AutoHookMap *map, E_AutoHookParams * { SLLQueuePush_N(map->first_pattern, map->last_pattern, node, pattern_order_next); } - scratch_end(scratch); } internal E_ExprList @@ -777,7 +775,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(default) E_Expr *exprl = expr->first; E_Expr *exprr = exprl->next; E_IRTreeAndType l = *lhs_irtree; - E_IRTreeAndType r = e_irtree_and_type_from_expr(arena, exprr); + E_IRTreeAndType r = e_push_irtree_and_type_from_expr(arena, exprr); E_TypeKey l_restype = e_type_key_unwrap(l.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKey r_restype = e_type_key_unwrap(r.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind l_restype_kind = e_type_kind_from_key(l_restype); @@ -871,7 +869,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(default) //- rjf: top-level irtree/type extraction internal E_IRTreeAndType -e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) +e_push_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); @@ -922,7 +920,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) { // rjf: unpack left-hand-side E_Expr *lhs = expr->first; - E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(arena, lhs); + E_IRTreeAndType lhs_irtree = e_push_irtree_and_type_from_expr(arena, lhs); // rjf: try all IR trees in chain for(E_IRTreeAndType *lhs_irtree_try = &lhs_irtree; lhs_irtree_try != 0; lhs_irtree_try = lhs_irtree_try->prev) @@ -978,7 +976,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) { // rjf: unpack operand E_Expr *r_expr = expr->first; - E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); + E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, r_expr); E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind r_type_kind = e_type_kind_from_key(r_type); E_TypeKey r_type_direct = e_type_key_unwrap(r_type, E_TypeUnwrapFlag_All); @@ -1037,7 +1035,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) { // rjf: unpack operand E_Expr *r_expr = expr->first; - E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); + E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, r_expr); E_TypeKey r_type = r_tree.type_key; E_TypeKey r_type_unwrapped = e_type_key_unwrap(r_type, E_TypeUnwrapFlag_AllDecorative); E_TypeKind r_type_unwrapped_kind = e_type_kind_from_key(r_type_unwrapped); @@ -1065,11 +1063,11 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) // rjf: unpack operands E_Expr *cast_type_expr = expr->first; E_Expr *casted_expr = cast_type_expr->next; - E_IRTreeAndType cast_irtree = e_irtree_and_type_from_expr(arena, cast_type_expr); + E_IRTreeAndType cast_irtree = e_push_irtree_and_type_from_expr(arena, cast_type_expr); E_TypeKey cast_type = cast_irtree.type_key; E_TypeKind cast_type_kind = e_type_kind_from_key(cast_type); U64 cast_type_byte_size = e_type_byte_size_from_key(cast_type); - E_IRTreeAndType casted_tree = e_irtree_and_type_from_expr(arena, casted_expr); + E_IRTreeAndType casted_tree = e_push_irtree_and_type_from_expr(arena, casted_expr); e_msg_list_concat_in_place(&result.msgs, &casted_tree.msgs); E_TypeKey casted_type = e_type_key_unwrap(casted_tree.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind casted_type_kind = e_type_kind_from_key(casted_type); @@ -1124,7 +1122,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) E_Expr *r_expr = expr->first; E_TypeKey r_type = zero_struct; E_Space space = r_expr->space; - E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); + E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, r_expr); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); r_type = r_tree.type_key; @@ -1152,7 +1150,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) { // rjf: evaluate operand tree E_Expr *r_expr = expr->first; - E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); + E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, r_expr); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); // rjf: fill output @@ -1166,7 +1164,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) { // rjf: unpack operand E_Expr *r_expr = expr->first; - E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); + E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, r_expr); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind r_type_kind = e_type_kind_from_key(r_type); @@ -1194,14 +1192,14 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) //- rjf: unary operations case E_ExprKind_Pos: { - result = e_irtree_and_type_from_expr(arena, expr->first); + result = e_push_irtree_and_type_from_expr(arena, expr->first); }break; case E_ExprKind_Neg: case E_ExprKind_BitNot: { // rjf: unpack operand E_Expr *r_expr = expr->first; - E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); + E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, r_expr); E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind r_type_kind = e_type_kind_from_key(r_type); RDI_EvalTypeGroup r_type_group = e_type_group_from_kind(r_type_kind); @@ -1234,7 +1232,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) { // rjf: unpack operand E_Expr *r_expr = expr->first; - E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); + E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, r_expr); E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind r_type_kind = e_type_kind_from_key(r_type); RDI_EvalTypeGroup r_type_group = e_type_group_from_kind(r_type_kind); @@ -1289,8 +1287,8 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) B32 is_comparison = e_expr_kind_is_comparison(kind); E_Expr *l_expr = expr->first; E_Expr *r_expr = l_expr->next; - E_IRTreeAndType l_tree = e_irtree_and_type_from_expr(arena, l_expr); - E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); + E_IRTreeAndType l_tree = e_push_irtree_and_type_from_expr(arena, l_expr); + E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, r_expr); e_msg_list_concat_in_place(&result.msgs, &l_tree.msgs); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); E_TypeKey l_type = e_type_key_unwrap(l_tree.type_key, E_TypeUnwrapFlag_AllDecorative); @@ -1513,9 +1511,9 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) E_Expr *c_expr = expr->first; E_Expr *l_expr = c_expr->next; E_Expr *r_expr = l_expr->next; - E_IRTreeAndType c_tree = e_irtree_and_type_from_expr(arena, c_expr); - E_IRTreeAndType l_tree = e_irtree_and_type_from_expr(arena, l_expr); - E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); + E_IRTreeAndType c_tree = e_push_irtree_and_type_from_expr(arena, c_expr); + E_IRTreeAndType l_tree = e_push_irtree_and_type_from_expr(arena, l_expr); + E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, r_expr); e_msg_list_concat_in_place(&result.msgs, &c_tree.msgs); e_msg_list_concat_in_place(&result.msgs, &l_tree.msgs); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); @@ -1561,7 +1559,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) B32 start_disallow_chained_fastpaths = e_ir_state->disallow_chained_fastpaths; e_ir_state->disallow_chained_fastpaths = 1; E_Expr *lhs = expr->first; - E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(arena, lhs); + E_IRTreeAndType lhs_irtree = e_push_irtree_and_type_from_expr(arena, lhs); E_TypeKey lhs_type_key = lhs_irtree.type_key; E_Type *lhs_type = e_type_from_key__cached(lhs_type_key); @@ -1582,7 +1580,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) { e_expr_push_child(call, e_expr_ref(arena, arg)); } - result = e_irtree_and_type_from_expr(arena, call); + result = e_push_irtree_and_type_from_expr(arena, call); // rjf: is "raw"? -> try to return overridden tree, otherwise strip all // lens types from result; disallow auto-hooks @@ -1611,7 +1609,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) Temp scratch = scratch_begin(&arena, 1); // rjf: generate result via first argument to lens - result = e_irtree_and_type_from_expr(arena, lhs->next); + result = e_push_irtree_and_type_from_expr(arena, lhs->next); // rjf: count extra arguments U64 arg_count = 0; @@ -1645,7 +1643,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) } else { - result = e_irtree_and_type_from_expr(arena, lhs->next); + result = e_push_irtree_and_type_from_expr(arena, lhs->next); result.type_key = e_type_key_unwrap(result.type_key, E_TypeUnwrapFlag_Lenses); } } @@ -1789,7 +1787,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) if(!string_mapped && e_ir_state->overridden_irtree != 0) { E_Expr *access = e_expr_irext_member_access(scratch.arena, &e_expr_nil, e_ir_state->overridden_irtree, string); - E_IRTreeAndType access_irtree = e_irtree_and_type_from_expr(scratch.arena, access); + E_IRTreeAndType access_irtree = e_push_irtree_and_type_from_expr(scratch.arena, access); if(access_irtree.root != &e_irnode_nil) { string_mapped = 1; @@ -2156,7 +2154,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) { generated = 1; e_string2expr_map_inc_poison(e_ir_state->ctx->macro_map, string); - result = e_irtree_and_type_from_expr(arena, macro_expr); + result = e_push_irtree_and_type_from_expr(arena, macro_expr); e_string2expr_map_dec_poison(e_ir_state->ctx->macro_map, string); } } @@ -2243,13 +2241,13 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) }break; case E_ExprKind_Ptr: { - E_IRTreeAndType ptee_irtree = e_irtree_and_type_from_expr(arena, expr->first); + E_IRTreeAndType ptee_irtree = e_push_irtree_and_type_from_expr(arena, expr->first); result = ptee_irtree; result.type_key = e_type_key_cons_ptr(e_base_ctx->primary_module->arch, result.type_key, 1, 0); }break; case E_ExprKind_Array: { - E_IRTreeAndType element_irtree = e_irtree_and_type_from_expr(arena, expr->first); + E_IRTreeAndType element_irtree = e_push_irtree_and_type_from_expr(arena, expr->first); result = element_irtree; result.type_key = e_type_key_cons_array(result.type_key, expr->value.u64, 0); }break; @@ -2263,7 +2261,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) { E_Expr *lhs = expr->first; E_Expr *rhs = lhs->next; - result = e_irtree_and_type_from_expr(arena, rhs); + result = e_push_irtree_and_type_from_expr(arena, rhs); if(lhs->kind != E_ExprKind_LeafIdentifier) { e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, "Left side of assignment must be an unused identifier."); @@ -2690,3 +2688,40 @@ e_expr_irext_cast(Arena *arena, E_Expr *rhs, E_IRTreeAndType *rhs_irtree, E_Type e_expr_push_child(root, rhs_bytecode); return root; } + +//////////////////////////////// +//~ rjf: IR Cache Functions + +internal E_IRTreeAndType +e_irtree_and_type_from_expr(E_Expr *expr) +{ + U64 hash_parts[] = + { + (U64)expr, + (U64)(e_ir_state->overridden_irtree ? e_ir_state->overridden_irtree->root : 0), + }; + U64 hash = e_hash_from_string(5381, str8((U8 *)hash_parts, sizeof(hash_parts))); + U64 slot_idx = hash%e_ir_state->ir_cache_slots_count; + E_IRCacheSlot *slot = &e_ir_state->ir_cache_slots[slot_idx]; + E_IRCacheNode *node = 0; + for(E_IRCacheNode *n = slot->first; n != 0; n = n->next) + { + if(expr == n->expr && + ((e_ir_state->overridden_irtree == 0 && n->overridden_node == 0) || + (e_ir_state->overridden_irtree != 0 && n->overridden_node == e_ir_state->overridden_irtree->root))) + { + node = n; + break; + } + } + if(node == 0) + { + node = push_array(e_ir_state->arena, E_IRCacheNode, 1); + SLLQueuePush(slot->first, slot->last, node); + node->expr = expr; + node->overridden_node = (e_ir_state->overridden_irtree ? e_ir_state->overridden_irtree->root : 0); + node->irtree = e_push_irtree_and_type_from_expr(e_ir_state->arena, expr); + } + E_IRTreeAndType result = node->irtree; + return result; +} diff --git a/src/eval/eval_ir.h b/src/eval/eval_ir.h index 5f49f0bc..d996d710 100644 --- a/src/eval/eval_ir.h +++ b/src/eval/eval_ir.h @@ -99,6 +99,22 @@ struct E_IRCtx //////////////////////////////// //~ rjf: IR State +typedef struct E_IRCacheNode E_IRCacheNode; +struct E_IRCacheNode +{ + E_IRCacheNode *next; + E_Expr *expr; + E_IRNode *overridden_node; + E_IRTreeAndType irtree; +}; + +typedef struct E_IRCacheSlot E_IRCacheSlot; +struct E_IRCacheSlot +{ + E_IRCacheNode *first; + E_IRCacheNode *last; +}; + typedef struct E_IRState E_IRState; struct E_IRState { @@ -121,6 +137,8 @@ struct E_IRState E_TypeAutoHookCacheMap *type_auto_hook_cache_map; U64 string_id_gen; E_StringIDMap *string_id_map; + U64 ir_cache_slots_count; + E_IRCacheSlot *ir_cache_slots; }; //////////////////////////////// @@ -193,7 +211,7 @@ internal void e_expr_unpoison(E_Expr *expr); //- rjf: top-level irtree/type extraction E_TYPE_ACCESS_FUNCTION_DEF(default); -internal E_IRTreeAndType e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr); +internal E_IRTreeAndType e_push_irtree_and_type_from_expr(Arena *arena, E_Expr *expr); //- rjf: irtree -> linear ops/bytecode internal void e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_Space *current_space, E_OpList *out); @@ -206,4 +224,9 @@ internal E_Expr *e_expr_irext_array_index(Arena *arena, E_Expr *lhs, E_IRTreeAnd internal E_Expr *e_expr_irext_deref(Arena *arena, E_Expr *rhs, E_IRTreeAndType *rhs_irtree); internal E_Expr *e_expr_irext_cast(Arena *arena, E_Expr *rhs, E_IRTreeAndType *rhs_irtree, E_TypeKey type_key); +//////////////////////////////// +//~ rjf: IR Cache Functions + +internal E_IRTreeAndType e_irtree_and_type_from_expr(E_Expr *expr); + #endif // EVAL_IR_H diff --git a/src/eval/eval_parse.c b/src/eval/eval_parse.c index ddafb9b7..abf9e728 100644 --- a/src/eval/eval_parse.c +++ b/src/eval/eval_parse.c @@ -663,10 +663,38 @@ e_leaf_type_from_name(String8 name) return key; } -internal E_Parse -e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray tokens) +internal E_TypeKey +e_type_key_from_expr(E_Expr *expr) { - E_Parse parse = {0, &e_expr_nil, &e_expr_nil}; + E_TypeKey result = zero_struct; + E_ExprKind kind = expr->kind; + switch(kind) + { + // TODO(rjf): do we support E_ExprKind_Func here? + default:{}break; + case E_ExprKind_TypeIdent: + { + result = expr->type_key; + }break; + case E_ExprKind_Ptr: + { + E_TypeKey direct_type_key = e_type_key_from_expr(expr->first); + result = e_type_key_cons_ptr(e_base_ctx->primary_module->arch, direct_type_key, 1, 0); + }break; + case E_ExprKind_Array: + { + E_Expr *child_expr = expr->first; + E_TypeKey direct_type_key = e_type_key_from_expr(child_expr); + result = e_type_key_cons_array(direct_type_key, expr->value.u64, 0); + }break; + } + return result; +} + +internal E_Parse +e_push_type_parse_from_text_tokens(Arena *arena, String8 text, E_TokenArray tokens) +{ + E_Parse parse = {tokens, 0, &e_expr_nil, &e_expr_nil}; E_Token *token_it = tokens.v; //- rjf: parse unsigned marker @@ -755,13 +783,13 @@ e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray tokens) } internal E_Parse -e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray tokens, S64 max_precedence, U64 max_chain_count) +e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray tokens, S64 max_precedence, U64 max_chain_count) { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); E_Token *it = tokens.v; E_Token *it_opl = tokens.v + tokens.count; - E_Parse result = {0, &e_expr_nil, &e_expr_nil}; + E_Parse result = {tokens, 0, &e_expr_nil, &e_expr_nil}; ////////////////////////////// //- rjf: parse chain of expressions @@ -860,7 +888,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray tok it += 1; // rjf: parse type expr - E_Parse type_parse = e_parse_type_from_text_tokens(arena, text, e_token_array_make_first_opl(it, it_opl)); + E_Parse type_parse = e_push_type_parse_from_text_tokens(arena, text, e_token_array_make_first_opl(it, it_opl)); E_Expr *type = type_parse.expr; e_msg_list_concat_in_place(&result.msgs, &type_parse.msgs); it = type_parse.last_token; @@ -947,7 +975,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray tok it += 1; // rjf: parse () contents - E_Parse nested_parse = e_parse_expr_from_text_tokens__prec(arena, text, e_token_array_make_first_opl(it, it_opl), e_max_precedence, 1); + E_Parse nested_parse = e_push_parse_from_string_tokens__prec(arena, text, e_token_array_make_first_opl(it, it_opl), e_max_precedence, 1); e_msg_list_concat_in_place(&result.msgs, &nested_parse.msgs); atom = nested_parse.expr; it = nested_parse.last_token; @@ -976,7 +1004,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray tok it += 1; // rjf: parse [] contents - E_Parse nested_parse = e_parse_expr_from_text_tokens__prec(arena, text, e_token_array_make_first_opl(it, it_opl), e_max_precedence, 1); + E_Parse nested_parse = e_push_parse_from_string_tokens__prec(arena, text, e_token_array_make_first_opl(it, it_opl), e_max_precedence, 1); e_msg_list_concat_in_place(&result.msgs, &nested_parse.msgs); atom = nested_parse.expr; it = nested_parse.last_token; @@ -1168,7 +1196,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray tok it += 1; // rjf: parse indexing expression - E_Parse idx_expr_parse = e_parse_expr_from_text_tokens__prec(arena, text, e_token_array_make_first_opl(it, it_opl), e_max_precedence, 1); + E_Parse idx_expr_parse = e_push_parse_from_string_tokens__prec(arena, text, e_token_array_make_first_opl(it, it_opl), e_max_precedence, 1); e_msg_list_concat_in_place(&result.msgs, &idx_expr_parse.msgs); it = idx_expr_parse.last_token; @@ -1211,7 +1239,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray tok E_Expr *call_expr = e_push_expr(arena, E_ExprKind_Call, token_string.str); call_expr->string = callee_expr->string; e_expr_push_child(call_expr, callee_expr); - E_Parse args_parse = e_parse_expr_from_text_tokens__prec(arena, text, e_token_array_make_first_opl(it, it_opl), e_max_precedence, max_U64); + E_Parse args_parse = e_push_parse_from_string_tokens__prec(arena, text, e_token_array_make_first_opl(it, it_opl), e_max_precedence, max_U64); e_msg_list_concat_in_place(&result.msgs, &args_parse.msgs); it = args_parse.last_token; if(args_parse.expr != &e_expr_nil) @@ -1309,7 +1337,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray tok // precedence if(binary_precedence != 0 && binary_precedence <= max_precedence) { - E_Parse rhs_expr_parse = e_parse_expr_from_text_tokens__prec(arena, text, e_token_array_make_first_opl(it+1, it_opl), binary_precedence-1, 1); + E_Parse rhs_expr_parse = e_push_parse_from_string_tokens__prec(arena, text, e_token_array_make_first_opl(it+1, it_opl), binary_precedence-1, 1); e_msg_list_concat_in_place(&result.msgs, &rhs_expr_parse.msgs); E_Expr *rhs = rhs_expr_parse.expr; it = rhs_expr_parse.last_token; @@ -1334,7 +1362,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray tok it += 1; // rjf: parse middle expression - E_Parse middle_expr_parse = e_parse_expr_from_text_tokens__prec(arena, text, e_token_array_make_first_opl(it, it_opl), e_max_precedence, 1); + E_Parse middle_expr_parse = e_push_parse_from_string_tokens__prec(arena, text, e_token_array_make_first_opl(it, it_opl), e_max_precedence, 1); it = middle_expr_parse.last_token; E_Expr *middle_expr = middle_expr_parse.expr; e_msg_list_concat_in_place(&result.msgs, &middle_expr_parse.msgs); @@ -1364,7 +1392,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray tok } // rjf: parse rhs - E_Parse rhs_expr_parse = e_parse_expr_from_text_tokens__prec(arena, text, e_token_array_make_first_opl(it, it_opl), e_max_precedence, 1); + E_Parse rhs_expr_parse = e_push_parse_from_string_tokens__prec(arena, text, e_token_array_make_first_opl(it, it_opl), e_max_precedence, 1); if(got_colon) { it = rhs_expr_parse.last_token; @@ -1418,20 +1446,55 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray tok } internal E_Parse -e_parse_expr_from_text_tokens(Arena *arena, String8 text, E_TokenArray tokens) -{ - ProfBegin("parse '%.*s'", str8_varg(text)); - E_Parse parse = e_parse_expr_from_text_tokens__prec(arena, text, tokens, e_max_precedence, max_U64); - ProfEnd(); - return parse; -} - -internal E_Parse -e_parse_expr_from_text(Arena *arena, String8 text) +e_push_parse_from_string(Arena *arena, String8 text) { Temp scratch = scratch_begin(&arena, 1); E_TokenArray tokens = e_token_array_from_text(scratch.arena, text); - E_Parse parse = e_parse_expr_from_text_tokens(arena, text, tokens); + E_Parse parse = e_push_parse_from_string_tokens__prec(arena, text, tokens, e_max_precedence, max_U64); scratch_end(scratch); return parse; } + +//////////////////////////////// +//~ rjf: Parse Cache Functions + +internal void +e_parse_eval_begin(void) +{ + if(e_parse_state == 0) + { + Arena *arena = arena_alloc(); + e_parse_state = push_array(arena, E_ParseState, 1); + e_parse_state->arena = arena; + e_parse_state->arena_eval_start_pos = arena_pos(e_parse_state->arena); + } + arena_pop_to(e_parse_state->arena, e_parse_state->arena_eval_start_pos); + e_parse_state->cache_slots_count = 4096; + e_parse_state->cache_slots = push_array(e_parse_state->arena, E_ParseCacheSlot, e_parse_state->cache_slots_count); +} + +internal E_Parse +e_parse_from_string(String8 string) +{ + U64 hash = e_hash_from_string(5381, string); + U64 slot_idx = hash%e_parse_state->cache_slots_count; + E_ParseCacheSlot *slot = &e_parse_state->cache_slots[slot_idx]; + E_ParseCacheNode *node = 0; + for(E_ParseCacheNode *n = slot->first; n != 0; n = n->next) + { + if(str8_match(n->string, string, 0)) + { + node = n; + break; + } + } + if(node == 0) + { + node = push_array(e_parse_state->arena, E_ParseCacheNode, 1); + SLLQueuePush(slot->first, slot->last, node); + node->string = push_str8_copy(e_parse_state->arena, string); + node->parse = e_push_parse_from_string(e_parse_state->arena, node->string); + } + E_Parse result = node->parse; + return result; +} diff --git a/src/eval/eval_parse.h b/src/eval/eval_parse.h index 9ef478ad..418451a9 100644 --- a/src/eval/eval_parse.h +++ b/src/eval/eval_parse.h @@ -10,6 +10,7 @@ typedef struct E_Parse E_Parse; struct E_Parse { + E_TokenArray tokens; E_Token *last_token; E_Expr *expr; E_Expr *last_expr; @@ -19,17 +20,33 @@ struct E_Parse //////////////////////////////// //~ rjf: Parse Evaluation State +typedef struct E_ParseCacheNode E_ParseCacheNode; +struct E_ParseCacheNode +{ + E_ParseCacheNode *next; + String8 string; + E_Parse parse; +}; + +typedef struct E_ParseCacheSlot E_ParseCacheSlot; +struct E_ParseCacheSlot +{ + E_ParseCacheNode *first; + E_ParseCacheNode *last; +}; + typedef struct E_ParseState E_ParseState; struct E_ParseState { Arena *arena; U64 arena_eval_start_pos; + U64 cache_slots_count; + E_ParseCacheSlot *cache_slots; }; //////////////////////////////// //~ rjf: Globals - thread_static E_ParseState *e_parse_state = 0; //////////////////////////////// @@ -64,9 +81,15 @@ internal String8 e_string_from_expr(Arena *arena, E_Expr *expr, String8 parent_e //~ rjf: Parsing Functions internal E_TypeKey e_leaf_type_from_name(String8 name); -internal E_Parse e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray tokens); -internal E_Parse e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray tokens, S64 max_precedence, U64 max_chain_count); -internal E_Parse e_parse_expr_from_text_tokens(Arena *arena, String8 text, E_TokenArray tokens); -internal E_Parse e_parse_expr_from_text(Arena *arena, String8 text); +internal E_TypeKey e_type_key_from_expr(E_Expr *expr); +internal E_Parse e_push_type_parse_from_text_tokens(Arena *arena, String8 text, E_TokenArray tokens); +internal E_Parse e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray tokens, S64 max_precedence, U64 max_chain_count); +internal E_Parse e_push_parse_from_string(Arena *arena, String8 text); + +//////////////////////////////// +//~ rjf: Parse Cache Functions + +internal void e_parse_eval_begin(void); +internal E_Parse e_parse_from_string(String8 string); #endif // EVAL_PARSE_H diff --git a/src/eval_visualization/eval_visualization_core.h b/src/eval_visualization/eval_visualization_core.h index 6d2155a1..de41c742 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}, - {zero_struct, zero_struct, &e_expr_nil, &e_irnode_nil}, + {&e_expr_nil, &e_irnode_nil}, {0}, &e_type_expand_rule__default, {0}, diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index e2a76458..76f2a3c6 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -2014,7 +2014,7 @@ rd_commit_eval_value_string(E_Eval dst_eval, String8 string) type_kind == E_TypeKind_Enum)) { got_commit_data = 1; - E_Expr *src_expr = e_parse_expr_from_text(scratch.arena, string).expr; + E_Expr *src_expr = e_parse_from_string(string).expr; E_Expr *src_expr__casted = e_expr_ref_cast(scratch.arena, type_key, src_expr); E_Eval src_eval = e_eval_from_expr(scratch.arena, src_expr__casted); commit_data = push_str8_copy(scratch.arena, str8_struct(&src_eval.value)); @@ -2168,7 +2168,7 @@ rd_query_from_eval_string(Arena *arena, String8 string) String8 result = {0}; { Temp scratch = scratch_begin(&arena, 1); - E_Expr *expr = e_parse_expr_from_text(scratch.arena, string).expr; + E_Expr *expr = e_parse_from_string(string).expr; if(expr->kind == E_ExprKind_LeafIdentifier && str8_match(expr->qualifier, str8_lit("query"), 0)) { @@ -5092,26 +5092,6 @@ rd_tex2dformat_from_eval(E_Eval eval) return fmt; } -internal E_Value -rd_value_from_eval_key(E_Eval eval, String8 key) -{ - E_Value value = zero_struct; - E_Type *type = e_type_from_key__cached(eval.irtree.type_key); - if(type->kind == E_TypeKind_Lens) - { - for EachIndex(idx, type->count) - { - E_Expr *arg = type->args[idx]; - if(arg->kind == E_ExprKind_Define && str8_match(arg->first->string, key, 0)) - { - value = e_value_from_expr(arg->first->next); - break; - } - } - } - return value; -} - //- rjf: pushing/attaching view resources internal void * @@ -11790,10 +11770,6 @@ rd_frame(void) } ProfEnd(); - //~ - //~ NOTE(rjf): NEW VVVVV - //~ - //////////////////////////// //- rjf: build base evaluation context // @@ -11822,6 +11798,7 @@ rd_frame(void) //////////////////////////// //- rjf: begin type evaluation // + e_parse_eval_begin(); e_type_eval_begin(); //////////////////////////// @@ -11929,7 +11906,7 @@ rd_frame(void) { RD_Cfg *watch = n->v; String8 expr = rd_expr_from_cfg(watch); - E_Parse parse = e_parse_expr_from_text(scratch.arena, expr); + E_Parse parse = e_parse_from_string(expr); if(parse.msgs.max_kind == E_MsgKind_Null) { for(E_Expr *expr = parse.expr; expr != &e_expr_nil; expr = expr->next) @@ -12134,7 +12111,7 @@ rd_frame(void) //- rjf: add macro for 'call_stack' -> 'query:current_thread.callstack' { - E_Expr *expr = e_parse_expr_from_text(scratch.arena, str8_lit("query:current_thread.call_stack")).expr; + E_Expr *expr = e_parse_from_string(str8_lit("query:current_thread.call_stack")).expr; e_string2expr_map_insert(scratch.arena, macro_map, str8_lit("call_stack"), expr); } @@ -12271,52 +12248,6 @@ rd_frame(void) } #endif - //- rjf: gather auto-view-rules from loaded modules - RD_CfgList immediate_auto_view_rules = {0}; - CTRL_EntityArray modules = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Module); - for EachIndex(idx, modules.count) - { - CTRL_Entity *module = modules.v[idx]; - String8 raddbg_data = ctrl_raddbg_data_from_module(scratch.arena, module->handle); - U8 split_char = 0; - String8List raddbg_data_text_parts = str8_split(scratch.arena, raddbg_data, &split_char, 1, 0); - U64 cfg_idx = 0; - for(String8Node *text_n = raddbg_data_text_parts.first; text_n != 0; text_n = text_n->next) - { - String8 text = text_n->string; - RD_CfgList cfgs = rd_cfg_tree_list_from_string(scratch.arena, text); - String8 module_name = ctrl_string_from_handle(scratch.arena, module->handle); - for(RD_CfgNode *n = cfgs.first; n != 0; n = n->next, cfg_idx += 1) - { - RD_Cfg *immediate_root = rd_immediate_cfg_from_keyf("module_%S_cfg_%I64x", module_name, cfg_idx); - rd_cfg_release_all_children(immediate_root); - rd_cfg_insert_child(immediate_root, immediate_root->last, n->v); - rd_cfg_list_push(scratch.arena, &immediate_auto_view_rules, n->v); - } - } - } - - //- rjf: add auto-hook rules for auto-view-rules - { - RD_CfgList auto_view_rules = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("auto_view_rule")); - RD_CfgList rules_lists[] = - { - auto_view_rules, - immediate_auto_view_rules, - }; - for EachElement(list_idx, rules_lists) - { - RD_CfgList list = rules_lists[list_idx]; - for(RD_CfgNode *n = list.first; n != 0; n = n->next) - { - RD_Cfg *rule = n->v; - String8 type_string = rd_cfg_child_from_string(rule, str8_lit("type"))->first->string; - String8 view_rule_string = rd_cfg_child_from_string(rule, str8_lit("view_rule"))->first->string; - e_auto_hook_map_insert_new(scratch.arena, auto_hook_map, .type_pattern = type_string, .tag_expr_string = view_rule_string); - } - } - } - //- rjf: choose set of lenses // TODO(rjf): generate via metaprogram struct @@ -12400,6 +12331,56 @@ rd_frame(void) } ev_select_expand_rule_table(expand_rule_table); + //////////////////////////// + //- rjf: gather auto-view-rules from loaded modules + // + RD_CfgList immediate_auto_view_rules = {0}; + CTRL_EntityArray modules = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Module); + for EachIndex(idx, modules.count) + { + CTRL_Entity *module = modules.v[idx]; + String8 raddbg_data = ctrl_raddbg_data_from_module(scratch.arena, module->handle); + U8 split_char = 0; + String8List raddbg_data_text_parts = str8_split(scratch.arena, raddbg_data, &split_char, 1, 0); + U64 cfg_idx = 0; + for(String8Node *text_n = raddbg_data_text_parts.first; text_n != 0; text_n = text_n->next) + { + String8 text = text_n->string; + RD_CfgList cfgs = rd_cfg_tree_list_from_string(scratch.arena, text); + String8 module_name = ctrl_string_from_handle(scratch.arena, module->handle); + for(RD_CfgNode *n = cfgs.first; n != 0; n = n->next, cfg_idx += 1) + { + RD_Cfg *immediate_root = rd_immediate_cfg_from_keyf("module_%S_cfg_%I64x", module_name, cfg_idx); + rd_cfg_release_all_children(immediate_root); + rd_cfg_insert_child(immediate_root, immediate_root->last, n->v); + rd_cfg_list_push(scratch.arena, &immediate_auto_view_rules, n->v); + } + } + } + + //////////////////////////// + //- rjf: add auto-hook rules for auto-view-rules + // + { + RD_CfgList auto_view_rules = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("auto_view_rule")); + RD_CfgList rules_lists[] = + { + auto_view_rules, + immediate_auto_view_rules, + }; + for EachElement(list_idx, rules_lists) + { + RD_CfgList list = rules_lists[list_idx]; + for(RD_CfgNode *n = list.first; n != 0; n = n->next) + { + RD_Cfg *rule = n->v; + String8 type_string = rd_cfg_child_from_string(rule, str8_lit("type"))->first->string; + String8 view_rule_string = rd_cfg_child_from_string(rule, str8_lit("view_rule"))->first->string; + e_auto_hook_map_insert_new(scratch.arena, auto_hook_map, .type_pattern = type_string, .tag_expr_string = view_rule_string); + } + } + } + //////////////////////////// //- rjf: build IR evaluation context // @@ -15804,7 +15785,7 @@ Z(getting_started) ExprWalkTask *next; E_Expr *expr; }; - E_Expr *expr = e_parse_expr_from_text(scratch.arena, src_bp_cnd).expr; + E_Expr *expr = e_parse_from_string(src_bp_cnd).expr; ExprWalkTask start_task = {0, expr}; ExprWalkTask *first_task = &start_task; for(ExprWalkTask *t = first_task; t != 0; t = t->next) diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 168f9ab3..9875452f 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -952,7 +952,6 @@ internal F32 rd_view_cfg_f32_from_string(String8 string); internal TXT_LangKind rd_lang_kind_from_eval(E_Eval eval); internal Arch rd_arch_from_eval(E_Eval eval); internal R_Tex2DFormat rd_tex2dformat_from_eval(E_Eval eval); -internal E_Value rd_value_from_eval_key(E_Eval eval, String8 key); //- rjf: pushing/attaching view resources internal void *rd_view_state_by_size(U64 size); diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index 84e86383..a3bd9650 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -144,7 +144,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_expr_from_text(arena, expr_string).expr; + exprs_out[idx] = e_parse_from_string(expr_string).expr; exprs_strings_out[idx] = push_str8_copy(arena, expr_string); } } @@ -226,7 +226,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_expr_from_text(arena, expr_string).expr; + exprs_out[idx] = e_parse_from_string(expr_string).expr; exprs_strings_out[idx] = push_str8_copy(arena, expr_string); } } @@ -278,7 +278,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_expr_from_text(arena, register_expr).expr; + exprs_out[idx] = e_parse_from_string(register_expr).expr; } } @@ -410,7 +410,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(schema) if(wrap_child_w_meta_expr) { Temp scratch = scratch_begin(&arena, 1); - E_Expr *expr = e_parse_expr_from_text(scratch.arena, child->first->string).expr; + E_Expr *expr = e_parse_from_string(child->first->string).expr; B32 expr_is_simple = 0; if(expr->kind == E_ExprKind_LeafU64 || expr->kind == E_ExprKind_LeafF64 || @@ -458,9 +458,8 @@ E_TYPE_ACCESS_FUNCTION_DEF(schema) MD_Node *range = md_tag_from_string(child_schema->first, str8_lit("range"), 0); if(!md_node_is_nil(range)) { - Temp scratch = scratch_begin(&arena, 1); - E_Expr *min_bound = e_parse_expr_from_text(scratch.arena, range->first->string).expr; - E_Expr *max_bound = e_parse_expr_from_text(scratch.arena, range->first->next->string).expr; + E_Expr *min_bound = e_parse_from_string(range->first->string).expr; + E_Expr *max_bound = e_parse_from_string(range->first->next->string).expr; E_Expr *args[] = { min_bound, @@ -471,7 +470,6 @@ E_TYPE_ACCESS_FUNCTION_DEF(schema) .direct_key = child_type_key, .count = 2, .args = args); - scratch_end(scratch); } } @@ -770,8 +768,8 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(cfgs) { Rng1U64 read_range = intersect_1u64(cmds_idx_range, idx_range); U64 read_count = dim_1u64(read_range); - E_Expr *commands = e_parse_expr_from_text(arena, str8_lit("query:commands")).expr; - E_IRTreeAndType commands_irtree = e_irtree_and_type_from_expr(arena, commands); + E_Expr *commands = e_parse_from_string(str8_lit("query:commands")).expr; + E_IRTreeAndType commands_irtree = e_irtree_and_type_from_expr(commands); 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];