diff --git a/src/eval/eval_bundles.c b/src/eval/eval_bundles.c index f484a6e1..db040024 100644 --- a/src/eval/eval_bundles.c +++ b/src/eval/eval_bundles.c @@ -43,9 +43,9 @@ e_eval_from_string(Arena *arena, String8 string) internal E_Eval e_autoresolved_eval_from_eval(E_Eval eval) { - if(e_parse_ctx && + if(e_parse_state && e_interpret_ctx && - e_parse_ctx->modules_count > 0 && + e_parse_state->ctx->modules_count > 0 && e_interpret_ctx->module_base != 0 && (e_type_key_match(eval.type_key, e_type_key_basic(E_TypeKind_S64)) || e_type_key_match(eval.type_key, e_type_key_basic(E_TypeKind_U64)) || @@ -54,7 +54,7 @@ e_autoresolved_eval_from_eval(E_Eval eval) { U64 vaddr = eval.value.u64; U64 voff = vaddr - e_interpret_ctx->module_base[0]; - RDI_Parsed *rdi = e_parse_ctx->primary_module->rdi; + RDI_Parsed *rdi = e_parse_state->ctx->primary_module->rdi; RDI_Scope *scope = rdi_scope_from_voff(rdi, voff); RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, voff); RDI_GlobalVariable *gvar = rdi_global_variable_from_voff(rdi, voff); diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index bf136f9d..5828596f 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -81,6 +81,8 @@ e_select_ir_ctx(E_IRCtx *ctx) e_ir_state->type_auto_hook_cache_map = push_array(e_ir_state->arena, E_TypeAutoHookCacheMap, 1); e_ir_state->type_auto_hook_cache_map->slots_count = 256; e_ir_state->type_auto_hook_cache_map->slots = push_array(e_ir_state->arena, E_TypeAutoHookCacheSlot, e_ir_state->type_auto_hook_cache_map->slots_count); + e_ir_state->irtree_and_type_cache_slots_count = 1024; + e_ir_state->irtree_and_type_cache_slots = push_array(e_ir_state->arena, E_IRTreeAndTypeCacheSlot, e_ir_state->irtree_and_type_cache_slots_count); } //////////////////////////////// @@ -2255,3 +2257,36 @@ e_bytecode_from_oplist(Arena *arena, E_OpList *oplist) result.str = str; return result; } + +//////////////////////////////// +//~ rjf: IRified Expression Cache + +internal E_IRTreeAndType +e_irtree_and_type_from_expr__cached(E_Expr *expr) +{ + E_IRTreeAndType result = {&e_irnode_nil}; + { + U64 hash = e_hash_from_string(5381, str8_struct(&expr)); + U64 slot_idx = hash%e_ir_state->irtree_and_type_cache_slots_count; + E_IRTreeAndTypeCacheNode *node = 0; + for(E_IRTreeAndTypeCacheNode *n = e_ir_state->irtree_and_type_cache_slots[slot_idx].first; n != 0; n = n->next) + { + if(n->expr == expr) + { + node = n; + break; + } + } + if(node == 0) + { + node = push_array(e_ir_state->arena, E_IRTreeAndTypeCacheNode, 1); + SLLQueuePush(e_ir_state->irtree_and_type_cache_slots[slot_idx].first, e_ir_state->irtree_and_type_cache_slots[slot_idx].last, node); + node->irtree_and_type = e_irtree_and_type_from_expr(e_ir_state->arena, expr); + } + if(node != 0) + { + result = node->irtree_and_type; + } + } + return result; +} diff --git a/src/eval/eval_ir.h b/src/eval/eval_ir.h index 304c46ae..dbd901b9 100644 --- a/src/eval/eval_ir.h +++ b/src/eval/eval_ir.h @@ -266,6 +266,21 @@ struct E_IRCtx //////////////////////////////// //~ rjf: IR State +typedef struct E_IRTreeAndTypeCacheNode E_IRTreeAndTypeCacheNode; +struct E_IRTreeAndTypeCacheNode +{ + E_IRTreeAndTypeCacheNode *next; + E_Expr *expr; + E_IRTreeAndType irtree_and_type; +}; + +typedef struct E_IRTreeAndTypeCacheSlot E_IRTreeAndTypeCacheSlot; +struct E_IRTreeAndTypeCacheSlot +{ + E_IRTreeAndTypeCacheNode *first; + E_IRTreeAndTypeCacheNode *last; +}; + typedef struct E_IRState E_IRState; struct E_IRState { @@ -278,6 +293,8 @@ struct E_IRState // rjf: caches E_UsedTagMap *used_tag_map; E_TypeAutoHookCacheMap *type_auto_hook_cache_map; + U64 irtree_and_type_cache_slots_count; + E_IRTreeAndTypeCacheSlot *irtree_and_type_cache_slots; }; //////////////////////////////// @@ -386,4 +403,9 @@ internal void e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_Space internal E_OpList e_oplist_from_irtree(Arena *arena, E_IRNode *root); internal String8 e_bytecode_from_oplist(Arena *arena, E_OpList *oplist); +//////////////////////////////// +//~ rjf: IRified Expression Cache + +internal E_IRTreeAndType e_irtree_and_type_from_expr__cached(E_Expr *expr); + #endif // EVAL_IR_H diff --git a/src/eval/eval_parse.c b/src/eval/eval_parse.c index 474163ef..0b2a2dcd 100644 --- a/src/eval/eval_parse.c +++ b/src/eval/eval_parse.c @@ -619,22 +619,31 @@ e_token_array_make_first_opl(E_Token *first, E_Token *opl) internal E_ParseCtx * e_selected_parse_ctx(void) { - return e_parse_ctx; + return e_parse_state->ctx; } internal void e_select_parse_ctx(E_ParseCtx *ctx) { - e_parse_ctx = ctx; + 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(arena); + } + e_parse_state->ctx = ctx; + e_parse_state->parse_cache_slots_count = 1024; + e_parse_state->parse_cache_slots = push_array(e_parse_state->arena, E_ParseCacheSlot, e_parse_state->parse_cache_slots_count); } internal U32 e_parse_ctx_module_idx_from_rdi(RDI_Parsed *rdi) { U32 result = 0; - for(U64 idx = 0; idx < e_parse_ctx->modules_count; idx += 1) + for(U64 idx = 0; idx < e_parse_state->ctx->modules_count; idx += 1) { - if(e_parse_ctx->modules[idx].rdi == rdi) + if(e_parse_state->ctx->modules[idx].rdi == rdi) { result = (U32)idx; break; @@ -933,9 +942,9 @@ e_leaf_type_from_name(String8 name) { E_TypeKey key = zero_struct; B32 found = 0; - for(U64 module_idx = 0; module_idx < e_parse_ctx->modules_count; module_idx += 1) + for(U64 module_idx = 0; module_idx < e_parse_state->ctx->modules_count; module_idx += 1) { - RDI_Parsed *rdi = e_parse_ctx->modules[module_idx].rdi; + RDI_Parsed *rdi = e_parse_state->ctx->modules[module_idx].rdi; RDI_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Types); RDI_ParsedNameMap parsed_name_map = {0}; rdi_parsed_from_name_map(rdi, name_map, &parsed_name_map); @@ -1050,7 +1059,7 @@ e_type_from_expr(E_Expr *expr) case E_ExprKind_Ptr: { E_TypeKey direct_type_key = e_type_from_expr(expr->first); - result = e_type_key_cons_ptr(e_parse_ctx->primary_module->arch, direct_type_key, 1, 0); + result = e_type_key_cons_ptr(e_parse_state->ctx->primary_module->arch, direct_type_key, 1, 0); }break; case E_ExprKind_Array: { @@ -1365,7 +1374,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to else { E_Expr *type = e_push_expr(arena, E_ExprKind_TypeIdent, token_string.str); - type->type_key = e_type_key_cons_ptr(e_parse_ctx->primary_module->arch, e_type_key_basic(E_TypeKind_U64), 1, 0); + type->type_key = e_type_key_cons_ptr(e_parse_state->ctx->primary_module->arch, e_type_key_basic(E_TypeKind_U64), 1, 0); E_Expr *casted = atom; E_Expr *cast = e_push_expr(arena, E_ExprKind_Cast, token_string.str); e_expr_push_child(cast, type); @@ -1425,9 +1434,9 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to //- rjf: form namespaceified fallback versions of this lookup string String8List namespaceified_token_strings = {0}; { - E_Module *module = e_parse_ctx->primary_module; + E_Module *module = e_parse_state->ctx->primary_module; RDI_Parsed *rdi = module->rdi; - U64 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, e_parse_ctx->ip_voff); + U64 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, e_parse_state->ctx->ip_voff); RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx); U64 proc_idx = scope->proc_idx; RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, proc_idx); @@ -1454,7 +1463,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to //- rjf: try members if(mapped_identifier == 0 && (resolution_qualifier.size == 0 || str8_match(resolution_qualifier, str8_lit("member"), 0))) ProfScope("try to map name as member") { - U64 data_member_num = e_num_from_string(e_parse_ctx->member_map, token_string); + U64 data_member_num = e_num_from_string(e_parse_state->ctx->member_map, token_string); if(data_member_num != 0) { atom_implicit_member_name = token_string; @@ -1465,15 +1474,15 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to //- rjf: try locals if(mapped_identifier == 0 && (resolution_qualifier.size == 0 || str8_match(resolution_qualifier, str8_lit("local"), 0))) ProfScope("try to map name as local") { - E_Module *module = e_parse_ctx->primary_module; + E_Module *module = e_parse_state->ctx->primary_module; RDI_Parsed *rdi = module->rdi; - U64 local_num = e_num_from_string(e_parse_ctx->locals_map, local_lookup_string); + U64 local_num = e_num_from_string(e_parse_state->ctx->locals_map, local_lookup_string); if(local_num != 0) { identifier_type_is_possibly_dynamically_overridden = 1; RDI_Local *local_var = rdi_element_from_name_idx(rdi, Locals, local_num-1); RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, local_var->type_idx); - type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), local_var->type_idx, (U32)(module - e_parse_ctx->modules)); + type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), local_var->type_idx, (U32)(module - e_parse_state->ctx->modules)); // rjf: grab location info for(U32 loc_block_idx = local_var->location_first; @@ -1481,7 +1490,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to loc_block_idx += 1) { RDI_LocationBlock *block = rdi_element_from_name_idx(rdi, LocationBlocks, loc_block_idx); - if(block->scope_off_first <= e_parse_ctx->ip_voff && e_parse_ctx->ip_voff < block->scope_off_opl) + if(block->scope_off_first <= e_parse_state->ctx->ip_voff && e_parse_state->ctx->ip_voff < block->scope_off_opl) { mapped_identifier = 1; space = module->space; @@ -1534,37 +1543,37 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to //- rjf: try registers if(mapped_identifier == 0 && (resolution_qualifier.size == 0 || str8_match(resolution_qualifier, str8_lit("reg"), 0))) ProfScope("try to map name as register") { - U64 reg_num = e_num_from_string(e_parse_ctx->regs_map, token_string); + U64 reg_num = e_num_from_string(e_parse_state->ctx->regs_map, token_string); if(reg_num != 0) { reg_code = reg_num; - type_key = e_type_key_reg(e_parse_ctx->primary_module->arch, reg_code); + type_key = e_type_key_reg(e_parse_state->ctx->primary_module->arch, reg_code); mapped_identifier = 1; - space = e_parse_ctx->ip_thread_space; - arch = e_parse_ctx->primary_module->arch; + space = e_parse_state->ctx->ip_thread_space; + arch = e_parse_state->ctx->primary_module->arch; } } //- rjf: try register aliases if(mapped_identifier == 0 && (resolution_qualifier.size == 0 || str8_match(resolution_qualifier, str8_lit("reg"), 0))) ProfScope("try to map name as register alias") { - U64 alias_num = e_num_from_string(e_parse_ctx->reg_alias_map, token_string); + U64 alias_num = e_num_from_string(e_parse_state->ctx->reg_alias_map, token_string); if(alias_num != 0) { alias_code = (REGS_AliasCode)alias_num; - type_key = e_type_key_reg_alias(e_parse_ctx->primary_module->arch, alias_code); + type_key = e_type_key_reg_alias(e_parse_state->ctx->primary_module->arch, alias_code); mapped_identifier = 1; - space = e_parse_ctx->ip_thread_space; - arch = e_parse_ctx->primary_module->arch; + space = e_parse_state->ctx->ip_thread_space; + arch = e_parse_state->ctx->primary_module->arch; } } //- rjf: try global variables if(mapped_identifier == 0 && (resolution_qualifier.size == 0 || str8_match(resolution_qualifier, str8_lit("global"), 0))) ProfScope("try to map name as global variable") { - for(U64 module_idx = 0; module_idx < e_parse_ctx->modules_count; module_idx += 1) + for(U64 module_idx = 0; module_idx < e_parse_state->ctx->modules_count; module_idx += 1) { - E_Module *module = &e_parse_ctx->modules[module_idx]; + E_Module *module = &e_parse_state->ctx->modules[module_idx]; RDI_Parsed *rdi = module->rdi; RDI_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_GlobalVariables); RDI_ParsedNameMap parsed_name_map = {0}; @@ -1606,9 +1615,9 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to //- rjf: try thread variables if(mapped_identifier == 0 && (resolution_qualifier.size == 0 || str8_match(resolution_qualifier, str8_lit("thread_variable"), 0))) ProfScope("try to map name as thread variable") { - for(U64 module_idx = 0; module_idx < e_parse_ctx->modules_count; module_idx += 1) + for(U64 module_idx = 0; module_idx < e_parse_state->ctx->modules_count; module_idx += 1) { - E_Module *module = &e_parse_ctx->modules[module_idx]; + E_Module *module = &e_parse_state->ctx->modules[module_idx]; RDI_Parsed *rdi = module->rdi; RDI_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_ThreadVariables); RDI_ParsedNameMap parsed_name_map = {0}; @@ -1646,9 +1655,9 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to //- rjf: try procedures if(mapped_identifier == 0 && (resolution_qualifier.size == 0 || str8_match(resolution_qualifier, str8_lit("procedure"), 0))) ProfScope("try to map name as procedure") { - for(U64 module_idx = 0; module_idx < e_parse_ctx->modules_count; module_idx += 1) + for(U64 module_idx = 0; module_idx < e_parse_state->ctx->modules_count; module_idx += 1) { - E_Module *module = &e_parse_ctx->modules[module_idx]; + E_Module *module = &e_parse_state->ctx->modules[module_idx]; RDI_Parsed *rdi = module->rdi; RDI_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Procedures); RDI_ParsedNameMap parsed_name_map = {0}; @@ -1694,7 +1703,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to mapped_identifier = 1; identifier_looks_like_type_expr = 1; MemoryZeroStruct(&space); - arch = e_parse_ctx->primary_module->arch; + arch = e_parse_state->ctx->primary_module->arch; } } @@ -1741,7 +1750,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to } else if(reg_code != 0) { - REGS_Rng reg_rng = regs_reg_code_rng_table_from_arch(e_parse_ctx->primary_module->arch)[reg_code]; + REGS_Rng reg_rng = regs_reg_code_rng_table_from_arch(e_parse_state->ctx->primary_module->arch)[reg_code]; E_OpList oplist = {0}; e_oplist_push_uconst(arena, &oplist, reg_rng.byte_off); atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str); @@ -1753,8 +1762,8 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to } else if(alias_code != 0) { - REGS_Slice alias_slice = regs_alias_code_slice_table_from_arch(e_parse_ctx->primary_module->arch)[alias_code]; - REGS_Rng alias_reg_rng = regs_reg_code_rng_table_from_arch(e_parse_ctx->primary_module->arch)[alias_slice.code]; + REGS_Slice alias_slice = regs_alias_code_slice_table_from_arch(e_parse_state->ctx->primary_module->arch)[alias_code]; + REGS_Rng alias_reg_rng = regs_reg_code_rng_table_from_arch(e_parse_state->ctx->primary_module->arch)[alias_slice.code]; E_OpList oplist = {0}; e_oplist_push_uconst(arena, &oplist, alias_reg_rng.byte_off + alias_slice.byte_off); atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str); @@ -2303,3 +2312,35 @@ e_parse_expr_from_text(Arena *arena, String8 text) scratch_end(scratch); return parse.expr; } + +internal E_Parse +e_parse_expr_from_text__cached(String8 text) +{ + E_Parse parse = {0, &e_expr_nil}; + U64 hash = e_hash_from_string(5381, str8_struct(&text)); + U64 slot_idx = hash%e_parse_state->parse_cache_slots_count; + E_ParseCacheNode *node = 0; + for(E_ParseCacheNode *n = e_parse_state->parse_cache_slots[slot_idx].first; n != 0; n = n->next) + { + if(str8_match(n->string, text, 0)) + { + node = n; + break; + } + } + if(node == 0) + { + Temp scratch = scratch_begin(0, 0); + node = push_array(e_parse_state->arena, E_ParseCacheNode, 1); + SLLQueuePush(e_parse_state->parse_cache_slots[slot_idx].first, e_parse_state->parse_cache_slots[slot_idx].last, node); + node->string = push_str8_copy(e_parse_state->arena, text); + E_TokenArray tokens = e_token_array_from_text(scratch.arena, text); + node->parse = e_parse_expr_from_text_tokens(e_parse_state->arena, node->string, &tokens); + scratch_end(scratch); + } + if(node != 0) + { + parse = node->parse; + } + return parse; +} diff --git a/src/eval/eval_parse.h b/src/eval/eval_parse.h index 6104a1c4..90b85c49 100644 --- a/src/eval/eval_parse.h +++ b/src/eval/eval_parse.h @@ -145,6 +145,17 @@ struct E_String2ExprMap E_String2ExprMapSlot *slots; }; +//////////////////////////////// +//~ rjf: Parse Results + +typedef struct E_Parse E_Parse; +struct E_Parse +{ + E_Token *last_token; + E_Expr *expr; + E_MsgList msgs; +}; + //////////////////////////////// //~ rjf: Parse Context @@ -169,14 +180,33 @@ struct E_ParseCtx }; //////////////////////////////// -//~ rjf: Parse Results +//~ rjf: Parse State (Stateful thread-local caching mechanisms, not provided by user) -typedef struct E_Parse E_Parse; -struct E_Parse +typedef struct E_ParseCacheNode E_ParseCacheNode; +struct E_ParseCacheNode { - E_Token *last_token; - E_Expr *expr; - E_MsgList msgs; + 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; + E_ParseCtx *ctx; + + // rjf: string -> parse cache + E_ParseCacheSlot *parse_cache_slots; + U64 parse_cache_slots_count; }; //////////////////////////////// @@ -185,7 +215,7 @@ struct E_Parse global read_only E_String2NumMap e_string2num_map_nil = {0}; global read_only E_String2ExprMap e_string2expr_map_nil = {0}; global read_only E_Expr e_expr_nil = {&e_expr_nil, &e_expr_nil, &e_expr_nil}; -thread_static E_ParseCtx *e_parse_ctx = 0; +thread_static E_ParseState *e_parse_state = 0; //////////////////////////////// //~ rjf: Basic Map Functions @@ -262,5 +292,6 @@ internal E_Parse e_parse_type_from_text_tokens(Arena *arena, String8 text, E_Tok internal E_Parse e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *tokens, S64 max_precedence); internal E_Parse e_parse_expr_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens); internal E_Expr *e_parse_expr_from_text(Arena *arena, String8 text); +internal E_Parse e_parse_expr_from_text__cached(String8 text); #endif // EVAL_PARSE_H diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index 60c30953..fa5fd05d 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -1134,34 +1134,6 @@ e_type_from_key(Arena *arena, E_TypeKey key) return type; } -internal E_Type * -e_type_from_key__cached(E_TypeKey key) -{ - E_Type *type = &e_type_nil; - { - U64 hash = e_hash_from_string(5381, str8_struct(&key)); - U64 slot_idx = hash%e_type_state->type_cache_slots_count; - E_TypeCacheNode *node = 0; - for(E_TypeCacheNode *n = e_type_state->type_cache_slots[slot_idx].first; n != 0; n = n->next) - { - if(e_type_key_match(key, n->key)) - { - node = n; - break; - } - } - if(node == 0) - { - node = push_array(e_type_state->arena, E_TypeCacheNode, 1); - node->key = key; - node->type = e_type_from_key(e_type_state->arena, key); - SLLQueuePush(e_type_state->type_cache_slots[slot_idx].first, e_type_state->type_cache_slots[slot_idx].last, node); - } - type = node->type; - } - return type; -} - internal U64 e_type_byte_size_from_key(E_TypeKey key) { @@ -1901,6 +1873,34 @@ e_string2typekey_map_lookup(E_String2TypeKeyMap *map, String8 string) //////////////////////////////// //~ rjf: Cache Lookups +internal E_Type * +e_type_from_key__cached(E_TypeKey key) +{ + E_Type *type = &e_type_nil; + { + U64 hash = e_hash_from_string(5381, str8_struct(&key)); + U64 slot_idx = hash%e_type_state->type_cache_slots_count; + E_TypeCacheNode *node = 0; + for(E_TypeCacheNode *n = e_type_state->type_cache_slots[slot_idx].first; n != 0; n = n->next) + { + if(e_type_key_match(key, n->key)) + { + node = n; + break; + } + } + if(node == 0) + { + node = push_array(e_type_state->arena, E_TypeCacheNode, 1); + node->key = key; + node->type = e_type_from_key(e_type_state->arena, key); + SLLQueuePush(e_type_state->type_cache_slots[slot_idx].first, e_type_state->type_cache_slots[slot_idx].last, node); + } + type = node->type; + } + return type; +} + internal E_MemberCacheNode * e_member_cache_node_from_type_key(E_TypeKey key) { diff --git a/src/eval/eval_types.h b/src/eval/eval_types.h index 2802e75a..d17a4297 100644 --- a/src/eval/eval_types.h +++ b/src/eval/eval_types.h @@ -350,7 +350,6 @@ internal U64 e_hash_from_type(E_Type *type); internal E_TypeKind e_type_kind_from_key(E_TypeKey key); internal U64 e_type_byte_size_from_key(E_TypeKey key); internal E_Type *e_type_from_key(Arena *arena, E_TypeKey key); -internal E_Type *e_type_from_key__cached(E_TypeKey key); internal E_TypeKey e_type_direct_from_key(E_TypeKey key); internal E_TypeKey e_type_owner_from_key(E_TypeKey key); internal E_TypeKey e_type_ptee_from_key(E_TypeKey key); @@ -376,6 +375,7 @@ internal E_TypeKey e_string2typekey_map_lookup(E_String2TypeKeyMap *map, String8 //////////////////////////////// //~ rjf: Cache Lookups +internal E_Type *e_type_from_key__cached(E_TypeKey key); internal E_MemberCacheNode *e_member_cache_node_from_type_key(E_TypeKey key); internal E_MemberArray e_type_data_members_from_key__cached(E_TypeKey key); internal E_Member e_type_member_from_key_name__cached(E_TypeKey key, String8 name); diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index 3fd88419..ed606b9c 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -691,8 +691,7 @@ ev_block_tree_from_string(Arena *arena, EV_View *view, String8 filter, String8 s EV_BlockTree tree = {0}; Temp scratch = scratch_begin(&arena, 1); { - E_TokenArray tokens = e_token_array_from_text(scratch.arena, string); - E_Parse parse = e_parse_expr_from_text_tokens(arena, string, &tokens); + E_Parse parse = e_parse_expr_from_text__cached(string); tree = ev_block_tree_from_expr(arena, view, filter, string, parse.expr); } scratch_end(scratch); diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 459c6b0e..c1fe8830 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -8905,7 +8905,7 @@ E_LOOKUP_INFO_FUNCTION_DEF(locals) E_LookupInfo result = {0}; Temp scratch = scratch_begin(&arena, 1); { - E_String2NumMapNodeArray nodes = e_string2num_map_node_array_from_map(scratch.arena, e_parse_ctx->locals_map); + E_String2NumMapNodeArray nodes = e_string2num_map_node_array_from_map(scratch.arena, e_parse_state->ctx->locals_map); e_string2num_map_node_array_sort__in_place(&nodes); String8List exprs_filtered = {0}; for EachIndex(idx, nodes.count) @@ -9177,7 +9177,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(debug_info_table) // rjf: unpack row info RDI_Parsed *rdi = accel->rdis[item->dbgi_idx]; - E_Module *module = &e_parse_ctx->modules[item->dbgi_idx]; + E_Module *module = &e_parse_state->ctx->modules[item->dbgi_idx]; // rjf: build expr E_Expr *item_expr = &e_expr_nil; @@ -9196,7 +9196,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(debug_info_table) String8 bytecode = e_bytecode_from_oplist(arena, &oplist); U32 type_idx = procedure->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_parse_ctx->modules)); + E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_state->ctx->modules)); item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0); item_expr->mode = E_Mode_Value; item_expr->space = module->space; @@ -9213,7 +9213,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(debug_info_table) 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_parse_ctx->modules)); + E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_state->ctx->modules)); item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0); item_expr->mode = E_Mode_Offset; item_expr->space = module->space; @@ -9229,7 +9229,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(debug_info_table) 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_parse_ctx->modules)); + E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_state->ctx->modules)); item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0); item_expr->mode = E_Mode_Offset; item_expr->space = module->space; @@ -9241,7 +9241,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(debug_info_table) { 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_parse_ctx->modules)); + E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), udt->self_type_idx, (U32)(module - e_parse_state->ctx->modules)); item_expr = e_push_expr(arena, E_ExprKind_TypeIdent, 0); item_expr->type_key = type_key; }break; @@ -10673,7 +10673,7 @@ rd_theme_color_from_txt_token_kind_lookup_string(TXT_TokenKind kind, String8 str // rjf: try to map as local if(!mapped && kind == TXT_TokenKind_Identifier) { - U64 local_num = e_num_from_string(e_parse_ctx->locals_map, string); + U64 local_num = e_num_from_string(e_parse_state->ctx->locals_map, string); if(local_num != 0) { mapped = 1; @@ -10684,7 +10684,7 @@ rd_theme_color_from_txt_token_kind_lookup_string(TXT_TokenKind kind, String8 str // rjf: try to map as member if(!mapped && kind == TXT_TokenKind_Identifier) { - U64 member_num = e_num_from_string(e_parse_ctx->member_map, string); + U64 member_num = e_num_from_string(e_parse_state->ctx->member_map, string); if(member_num != 0) { mapped = 1; @@ -10695,7 +10695,7 @@ rd_theme_color_from_txt_token_kind_lookup_string(TXT_TokenKind kind, String8 str // rjf: try to map as register if(!mapped) { - U64 reg_num = e_num_from_string(e_parse_ctx->regs_map, string); + U64 reg_num = e_num_from_string(e_parse_state->ctx->regs_map, string); if(reg_num != 0) { mapped = 1; @@ -10706,7 +10706,7 @@ rd_theme_color_from_txt_token_kind_lookup_string(TXT_TokenKind kind, String8 str // rjf: try to map as register alias if(!mapped) { - U64 alias_num = e_num_from_string(e_parse_ctx->reg_alias_map, string); + U64 alias_num = e_num_from_string(e_parse_state->ctx->reg_alias_map, string); if(alias_num != 0) { mapped = 1; @@ -13084,8 +13084,7 @@ rd_frame(void) { RD_Cfg *watch = n->v; String8 expr = rd_expr_from_cfg(watch); - E_TokenArray tokens = e_token_array_from_text(scratch.arena, expr); - E_Parse parse = e_parse_expr_from_text_tokens(scratch.arena, expr, &tokens); + E_Parse parse = e_parse_expr_from_text__cached(expr); if(parse.msgs.max_kind == E_MsgKind_Null) { e_push_leaf_ident_exprs_from_expr__in_place(scratch.arena, ctx->macro_map, parse.expr); diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 20b1703e..79412bca 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -5488,7 +5488,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(memory) rd_rgba_from_theme_color(RD_ThemeColor_Thread7), }; U64 thread_rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, rd_regs()->unwind_count); - for(E_String2NumMapNode *n = e_parse_ctx->locals_map->first; n != 0; n = n->order_next) + for(E_String2NumMapNode *n = e_parse_state->ctx->locals_map->first; n != 0; n = n->order_next) { String8 local_name = n->string; E_Eval local_eval = e_eval_from_string(scratch.arena, local_name);