eval: sketch out parse/ir cache

This commit is contained in:
Ryan Fleury
2025-02-04 10:29:52 -08:00
parent 657b78c4ef
commit b9756d222a
10 changed files with 214 additions and 87 deletions
+3 -3
View File
@@ -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);
+35
View File
@@ -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;
}
+22
View File
@@ -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
+74 -33
View File
@@ -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;
}
+38 -7
View File
@@ -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
+28 -28
View File
@@ -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)
{
+1 -1
View File
@@ -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);
@@ -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);
+11 -12
View File
@@ -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);
+1 -1
View File
@@ -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);