mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-07 14:28:40 +00:00
cache cons type byte size, and more generally, do not require full type calculation in order to calculate byte sizes
This commit is contained in:
+42
-17
@@ -403,6 +403,8 @@ e_type_key_cons_(E_ConsTypeParams *params)
|
|||||||
{
|
{
|
||||||
node->params.members[idx].name = push_str8_copy(e_type_state->arena, node->params.members[idx].name);
|
node->params.members[idx].name = push_str8_copy(e_type_state->arena, node->params.members[idx].name);
|
||||||
node->params.members[idx].inheritance_key_chain = e_type_key_list_copy(e_type_state->arena, &node->params.members[idx].inheritance_key_chain);
|
node->params.members[idx].inheritance_key_chain = e_type_key_list_copy(e_type_state->arena, &node->params.members[idx].inheritance_key_chain);
|
||||||
|
U64 opl_off = (node->params.members[idx].off + e_type_byte_size_from_key(node->params.members[idx].type_key));
|
||||||
|
node->byte_size = Max(node->byte_size, opl_off);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(params->enum_vals != 0)
|
else if(params->enum_vals != 0)
|
||||||
@@ -413,6 +415,23 @@ e_type_key_cons_(E_ConsTypeParams *params)
|
|||||||
{
|
{
|
||||||
node->params.enum_vals[idx].name = push_str8_copy(e_type_state->arena, node->params.enum_vals[idx].name);
|
node->params.enum_vals[idx].name = push_str8_copy(e_type_state->arena, node->params.enum_vals[idx].name);
|
||||||
}
|
}
|
||||||
|
node->byte_size = e_type_byte_size_from_key(node->params.direct_key);
|
||||||
|
}
|
||||||
|
else switch(params->kind)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
node->byte_size = e_type_byte_size_from_key(node->params.direct_key);
|
||||||
|
}break;
|
||||||
|
case E_TypeKind_Ptr:
|
||||||
|
{
|
||||||
|
node->byte_size = bit_size_from_arch(node->params.arch)/8;
|
||||||
|
}break;
|
||||||
|
case E_TypeKind_Array:
|
||||||
|
{
|
||||||
|
U64 ptee_size = e_type_byte_size_from_key(node->params.direct_key);
|
||||||
|
node->byte_size = ptee_size * node->params.count;
|
||||||
|
}break;
|
||||||
}
|
}
|
||||||
result = key;
|
result = key;
|
||||||
}
|
}
|
||||||
@@ -604,21 +623,9 @@ e_type_from_key(Arena *arena, E_TypeKey key)
|
|||||||
type->name = push_str8_copy(arena, node->params.name);
|
type->name = push_str8_copy(arena, node->params.name);
|
||||||
type->direct_type_key = node->params.direct_key;
|
type->direct_type_key = node->params.direct_key;
|
||||||
type->count = node->params.count;
|
type->count = node->params.count;
|
||||||
|
type->byte_size = node->byte_size;
|
||||||
switch(type->kind)
|
switch(type->kind)
|
||||||
{
|
{
|
||||||
default:
|
|
||||||
{
|
|
||||||
type->byte_size = e_type_byte_size_from_key(type->direct_type_key);
|
|
||||||
}break;
|
|
||||||
case E_TypeKind_Ptr:
|
|
||||||
{
|
|
||||||
type->byte_size = bit_size_from_arch(node->params.arch)/8;
|
|
||||||
}break;
|
|
||||||
case E_TypeKind_Array:
|
|
||||||
{
|
|
||||||
U64 ptee_size = e_type_byte_size_from_key(node->params.direct_key);
|
|
||||||
type->byte_size = ptee_size * type->count;
|
|
||||||
}break;
|
|
||||||
case E_TypeKind_Struct:
|
case E_TypeKind_Struct:
|
||||||
case E_TypeKind_Union:
|
case E_TypeKind_Union:
|
||||||
case E_TypeKind_Class:
|
case E_TypeKind_Class:
|
||||||
@@ -1123,6 +1130,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
|
|||||||
internal U64
|
internal U64
|
||||||
e_type_byte_size_from_key(E_TypeKey key)
|
e_type_byte_size_from_key(E_TypeKey key)
|
||||||
{
|
{
|
||||||
|
ProfBeginFunction();
|
||||||
U64 result = 0;
|
U64 result = 0;
|
||||||
switch(key.kind)
|
switch(key.kind)
|
||||||
{
|
{
|
||||||
@@ -1133,14 +1141,31 @@ e_type_byte_size_from_key(E_TypeKey key)
|
|||||||
result = e_kind_basic_byte_size_table[kind];
|
result = e_kind_basic_byte_size_table[kind];
|
||||||
}break;
|
}break;
|
||||||
case E_TypeKeyKind_Ext:
|
case E_TypeKeyKind_Ext:
|
||||||
|
{
|
||||||
|
U64 type_node_idx = key.u32[1];
|
||||||
|
U32 rdi_idx = key.u32[2];
|
||||||
|
RDI_Parsed *rdi = e_type_state->ctx->modules[rdi_idx].rdi;
|
||||||
|
RDI_TypeNode *rdi_type = rdi_element_from_name_idx(rdi, TypeNodes, type_node_idx);
|
||||||
|
result = rdi_type->byte_size;
|
||||||
|
}break;
|
||||||
case E_TypeKeyKind_Cons:
|
case E_TypeKeyKind_Cons:
|
||||||
{
|
{
|
||||||
Temp scratch = scratch_begin(0, 0);
|
U64 key_hash = e_hash_from_string(5381, str8_struct(&key));
|
||||||
E_Type *type = e_type_from_key(scratch.arena, key);
|
U64 key_slot_idx = key_hash%e_type_state->cons_key_slots_count;
|
||||||
result = type->byte_size;
|
E_ConsTypeSlot *key_slot = &e_type_state->cons_key_slots[key_slot_idx];
|
||||||
scratch_end(scratch);
|
for(E_ConsTypeNode *node = key_slot->first;
|
||||||
|
node != 0;
|
||||||
|
node = node->key_next)
|
||||||
|
{
|
||||||
|
if(e_type_key_match(node->key, key))
|
||||||
|
{
|
||||||
|
result = node->byte_size;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}break;
|
}break;
|
||||||
}
|
}
|
||||||
|
ProfEnd();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -162,6 +162,7 @@ struct E_ConsTypeNode
|
|||||||
E_ConsTypeNode *content_next;
|
E_ConsTypeNode *content_next;
|
||||||
E_TypeKey key;
|
E_TypeKey key;
|
||||||
E_ConsTypeParams params;
|
E_ConsTypeParams params;
|
||||||
|
U64 byte_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct E_ConsTypeSlot E_ConsTypeSlot;
|
typedef struct E_ConsTypeSlot E_ConsTypeSlot;
|
||||||
|
|||||||
Reference in New Issue
Block a user