mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-01 19:48:11 +00:00
eval: add cache for type data member gathering & member lookup; eval_visualization: sketch out new hook organization which has single hook for both view rule expansion info, + expansion expr production, in a single combined path (the two often require the same information so it is maybe a good idea to combine them - if not, it will be easy to separate into two stages (expand + expr-child production), but basically just trying to get view rules out of 'block production', and more into just providing the information that actually varies per view rule
This commit is contained in:
@@ -248,6 +248,8 @@ e_select_type_ctx(E_TypeCtx *ctx)
|
||||
e_type_state->cons_key_slots_count = 256;
|
||||
e_type_state->cons_content_slots = push_array(e_type_state->arena, E_ConsTypeSlot, e_type_state->cons_content_slots_count);
|
||||
e_type_state->cons_key_slots = push_array(e_type_state->arena, E_ConsTypeSlot, e_type_state->cons_key_slots_count);
|
||||
e_type_state->member_cache_slots_count = 256;
|
||||
e_type_state->member_cache_slots = push_array(e_type_state->arena, E_MemberCacheSlot, e_type_state->member_cache_slots_count);
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
@@ -1820,3 +1822,74 @@ e_type_key_list_copy(Arena *arena, E_TypeKeyList *src)
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Cache Lookups
|
||||
|
||||
internal E_MemberCacheNode *
|
||||
e_member_cache_node_from_type_key(E_TypeKey key)
|
||||
{
|
||||
U64 hash = e_hash_from_string(5381, str8_struct(&key));
|
||||
U64 slot_idx = hash%e_type_state->member_cache_slots_count;
|
||||
E_MemberCacheSlot *slot = &e_type_state->member_cache_slots[slot_idx];
|
||||
E_MemberCacheNode *node = 0;
|
||||
for(E_MemberCacheNode *n = slot->first; n != 0; n = n->next)
|
||||
{
|
||||
if(e_type_key_match(n->key, key))
|
||||
{
|
||||
node = n;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(node == 0)
|
||||
{
|
||||
node = push_array(e_type_state->arena, E_MemberCacheNode, 1);
|
||||
SLLQueuePush(slot->first, slot->last, node);
|
||||
node->key = key;
|
||||
node->members = e_type_data_members_from_key(e_type_state->arena, key);
|
||||
node->member_hash_slots_count = node->members.count;
|
||||
node->member_hash_slots = push_array(e_type_state->arena, E_MemberHashSlot, node->member_hash_slots_count);
|
||||
for EachIndex(idx, node->members.count)
|
||||
{
|
||||
U64 hash = e_hash_from_string(5381, node->members.v[idx].name);
|
||||
U64 slot_idx = hash%node->member_hash_slots_count;
|
||||
E_MemberHashNode *n = push_array(e_type_state->arena, E_MemberHashNode, 1);
|
||||
SLLQueuePush(node->member_hash_slots[slot_idx].first, node->member_hash_slots[slot_idx].last, n);
|
||||
n->member_idx = idx;
|
||||
}
|
||||
}
|
||||
return node;
|
||||
}
|
||||
|
||||
internal E_MemberArray
|
||||
e_type_data_members_from_key__cached(E_TypeKey key)
|
||||
{
|
||||
E_MemberArray members = {0};
|
||||
E_MemberCacheNode *node = e_member_cache_node_from_type_key(key);
|
||||
if(node != 0)
|
||||
{
|
||||
members = node->members;
|
||||
}
|
||||
return members;
|
||||
}
|
||||
|
||||
internal E_Member
|
||||
e_type_member_from_key_name__cached(E_TypeKey key, String8 name)
|
||||
{
|
||||
E_Member result = {0};
|
||||
E_MemberCacheNode *node = e_member_cache_node_from_type_key(key);
|
||||
if(node != 0)
|
||||
{
|
||||
U64 hash = e_hash_from_string(5381, name);
|
||||
U64 slot_idx = hash%node->member_hash_slots_count;
|
||||
for(E_MemberHashNode *n = node->member_hash_slots[slot_idx].first; n != 0; n = n->next)
|
||||
{
|
||||
if(str8_match(node->members.v[n->member_idx].name, name, 0))
|
||||
{
|
||||
result = node->members.v[n->member_idx];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -138,6 +138,8 @@ struct E_Type
|
||||
////////////////////////////////
|
||||
//~ rjf: Evaluation Context
|
||||
|
||||
//- rjf: constructed type cache types
|
||||
|
||||
typedef struct E_ConsTypeParams E_ConsTypeParams;
|
||||
struct E_ConsTypeParams
|
||||
{
|
||||
@@ -167,6 +169,41 @@ struct E_ConsTypeSlot
|
||||
E_ConsTypeNode *last;
|
||||
};
|
||||
|
||||
//- rjf: member lookup cache types
|
||||
|
||||
typedef struct E_MemberHashNode E_MemberHashNode;
|
||||
struct E_MemberHashNode
|
||||
{
|
||||
E_MemberHashNode *next;
|
||||
U64 member_idx;
|
||||
};
|
||||
|
||||
typedef struct E_MemberHashSlot E_MemberHashSlot;
|
||||
struct E_MemberHashSlot
|
||||
{
|
||||
E_MemberHashNode *first;
|
||||
E_MemberHashNode *last;
|
||||
};
|
||||
|
||||
typedef struct E_MemberCacheNode E_MemberCacheNode;
|
||||
struct E_MemberCacheNode
|
||||
{
|
||||
E_MemberCacheNode *next;
|
||||
E_TypeKey key;
|
||||
E_MemberArray members;
|
||||
U64 member_hash_slots_count;
|
||||
E_MemberHashSlot *member_hash_slots;
|
||||
};
|
||||
|
||||
typedef struct E_MemberCacheSlot E_MemberCacheSlot;
|
||||
struct E_MemberCacheSlot
|
||||
{
|
||||
E_MemberCacheNode *first;
|
||||
E_MemberCacheNode *last;
|
||||
};
|
||||
|
||||
//- rjf: context parameterization
|
||||
|
||||
typedef struct E_TypeCtx E_TypeCtx;
|
||||
struct E_TypeCtx
|
||||
{
|
||||
@@ -180,6 +217,8 @@ struct E_TypeCtx
|
||||
E_Module *primary_module;
|
||||
};
|
||||
|
||||
//- rjf: stateful machine part of context (not provided by user)
|
||||
|
||||
typedef struct E_TypeState E_TypeState;
|
||||
struct E_TypeState
|
||||
{
|
||||
@@ -195,6 +234,10 @@ struct E_TypeState
|
||||
U64 cons_key_slots_count;
|
||||
E_ConsTypeSlot *cons_content_slots;
|
||||
E_ConsTypeSlot *cons_key_slots;
|
||||
|
||||
// rjf: member cache table
|
||||
U64 member_cache_slots_count;
|
||||
E_MemberCacheSlot *member_cache_slots;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
@@ -276,4 +319,11 @@ internal String8 e_type_string_from_key(Arena *arena, E_TypeKey key);
|
||||
internal void e_type_key_list_push(Arena *arena, E_TypeKeyList *list, E_TypeKey key);
|
||||
internal E_TypeKeyList e_type_key_list_copy(Arena *arena, E_TypeKeyList *src);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Cache Lookups
|
||||
|
||||
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);
|
||||
|
||||
#endif // EVAL_TYPES_H
|
||||
|
||||
Reference in New Issue
Block a user