mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-05 13:28:40 +00:00
type graph data member gathering -> follow single-inheritance base class members + sort members by offset
This commit is contained in:
@@ -914,6 +914,18 @@ struct Template_Example3{
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct SingleInheritanceBase
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SingleInheritanceDerived : SingleInheritanceBase
|
||||||
|
{
|
||||||
|
int z;
|
||||||
|
int w;
|
||||||
|
};
|
||||||
|
|
||||||
struct Has_Members{
|
struct Has_Members{
|
||||||
int a;
|
int a;
|
||||||
int b;
|
int b;
|
||||||
@@ -1245,6 +1257,12 @@ extended_type_coverage_eval_tests(void){
|
|||||||
Template_Example3<void *, float> temp3_vi((void *)&temp3_if, 1.f);
|
Template_Example3<void *, float> temp3_vi((void *)&temp3_if, 1.f);
|
||||||
Template_Example3<int, Template_Example2<int, float>> temp3_itif(123, temp_if);
|
Template_Example3<int, Template_Example2<int, float>> temp3_itif(123, temp_if);
|
||||||
|
|
||||||
|
SingleInheritanceDerived sid;
|
||||||
|
sid.x = 123;
|
||||||
|
sid.y = 456;
|
||||||
|
sid.z = 789;
|
||||||
|
sid.w = 999;
|
||||||
|
|
||||||
Pointer_To_Member pointer_to_member = {
|
Pointer_To_Member pointer_to_member = {
|
||||||
&Has_Members::a, &Has_Members::c, &Has_Members::bas,
|
&Has_Members::a, &Has_Members::c, &Has_Members::bas,
|
||||||
&Has_Members::x, &Has_Members::z, &Has_Members::bas_f,
|
&Has_Members::x, &Has_Members::z, &Has_Members::bas_f,
|
||||||
|
|||||||
+63
-21
@@ -15,6 +15,21 @@ tg_hash_from_string(U64 seed, String8 string)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal int
|
||||||
|
tg_qsort_compare_members_offset(TG_Member *a, TG_Member *b)
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
if(a->off < b->off)
|
||||||
|
{
|
||||||
|
result = -1;
|
||||||
|
}
|
||||||
|
else if(a->off > b->off)
|
||||||
|
{
|
||||||
|
result = +1;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: RADDBG <-> TG Enum Conversions
|
//~ rjf: RADDBG <-> TG Enum Conversions
|
||||||
|
|
||||||
@@ -742,7 +757,7 @@ tg_type_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg
|
|||||||
|
|
||||||
// rjf: commit members
|
// rjf: commit members
|
||||||
type->count = members.count;
|
type->count = members.count;
|
||||||
type->members = push_array_no_zero(arena, TG_Member, 1);
|
type->members = push_array_no_zero(arena, TG_Member, members.count);
|
||||||
U64 idx = 0;
|
U64 idx = 0;
|
||||||
for(TG_MemberNode *n = members.first; n != 0; n = n->next, idx += 1)
|
for(TG_MemberNode *n = members.first; n != 0; n = n->next, idx += 1)
|
||||||
{
|
{
|
||||||
@@ -912,36 +927,63 @@ tg_members_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *r
|
|||||||
internal TG_MemberArray
|
internal TG_MemberArray
|
||||||
tg_data_members_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key)
|
tg_data_members_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Parsed *rdbg, TG_Key key)
|
||||||
{
|
{
|
||||||
TG_MemberArray result = {0};
|
|
||||||
Temp scratch = scratch_begin(&arena, 1);
|
Temp scratch = scratch_begin(&arena, 1);
|
||||||
|
TG_MemberList members_list = {0};
|
||||||
|
B32 members_need_offset_sort = 0;
|
||||||
{
|
{
|
||||||
TG_Type *type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, key);
|
TG_Type *root_type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, key);
|
||||||
if(type->members != 0)
|
typedef struct Task Task;
|
||||||
|
struct Task
|
||||||
{
|
{
|
||||||
U64 data_member_count = 0;
|
Task *next;
|
||||||
for(U64 member_idx = 0; member_idx < type->count; member_idx += 1)
|
TG_Type *type;
|
||||||
|
};
|
||||||
|
Task start_task = {0, root_type};
|
||||||
|
Task *first_task = &start_task;
|
||||||
|
Task *last_task = &start_task;
|
||||||
|
for(Task *task = first_task; task != 0; task = task->next)
|
||||||
|
{
|
||||||
|
TG_Type *type = task->type;
|
||||||
|
if(type->members != 0)
|
||||||
{
|
{
|
||||||
if(type->members[member_idx].kind == TG_MemberKind_DataField)
|
for(U64 member_idx = 0; member_idx < type->count; member_idx += 1)
|
||||||
{
|
{
|
||||||
data_member_count += 1;
|
if(type->members[member_idx].kind == TG_MemberKind_DataField)
|
||||||
}
|
{
|
||||||
}
|
TG_MemberNode *n = push_array(scratch.arena, TG_MemberNode, 1);
|
||||||
result.count = data_member_count;
|
MemoryCopyStruct(&n->v, &type->members[member_idx]);
|
||||||
result.v = push_array_no_zero(arena, TG_Member, result.count);
|
SLLQueuePush(members_list.first, members_list.last, n);
|
||||||
U64 idx = 0;
|
members_list.count += 1;
|
||||||
for(U64 member_idx = 0; member_idx < type->count; member_idx += 1)
|
}
|
||||||
{
|
else if(type->members[member_idx].kind == TG_MemberKind_Base)
|
||||||
if(type->members[member_idx].kind == TG_MemberKind_DataField)
|
{
|
||||||
{
|
Task *t = push_array(scratch.arena, Task, 1);
|
||||||
MemoryCopyStruct(&result.v[idx], &type->members[member_idx]);
|
t->type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, type->members[member_idx].type_key);
|
||||||
result.v[idx].name = push_str8_copy(arena, result.v[idx].name);
|
SLLQueuePush(first_task, last_task, t);
|
||||||
idx += 1;
|
members_need_offset_sort = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
TG_MemberArray members = {0};
|
||||||
|
{
|
||||||
|
members.count = members_list.count;
|
||||||
|
members.v = push_array(arena, TG_Member, members.count);
|
||||||
|
U64 idx = 0;
|
||||||
|
for(TG_MemberNode *n = members_list.first; n != 0; n = n->next)
|
||||||
|
{
|
||||||
|
MemoryCopyStruct(&members.v[idx], &n->v);
|
||||||
|
members.v[idx].name = push_str8_copy(arena, members.v[idx].name);
|
||||||
|
idx += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(members_need_offset_sort)
|
||||||
|
{
|
||||||
|
qsort(members.v, members.count, sizeof(TG_Member), (int (*)(const void *, const void *))tg_qsort_compare_members_offset);
|
||||||
|
}
|
||||||
scratch_end(scratch);
|
scratch_end(scratch);
|
||||||
return result;
|
return members;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
|
|||||||
@@ -179,6 +179,7 @@ thread_static Arena *tg_build_arena = 0;
|
|||||||
//~ rjf: Basic Helpers
|
//~ rjf: Basic Helpers
|
||||||
|
|
||||||
internal U64 tg_hash_from_string(U64 seed, String8 string);
|
internal U64 tg_hash_from_string(U64 seed, String8 string);
|
||||||
|
internal int tg_qsort_compare_members_offset(TG_Member *a, TG_Member *b);
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: RADDBG <-> TG Enum Conversions
|
//~ rjf: RADDBG <-> TG Enum Conversions
|
||||||
|
|||||||
Reference in New Issue
Block a user