mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-07-30 19:10:01 +00:00
data member offset sorting -> take into account base offset, when doing inheritance graph search; visualize inheritance chain for inherited members; use contextual base color in code labels, do not assume default code color implicitly
This commit is contained in:
@@ -30,6 +30,26 @@ tg_qsort_compare_members_offset(TG_Member *a, TG_Member *b)
|
||||
return result;
|
||||
}
|
||||
|
||||
internal void
|
||||
tg_key_list_push(Arena *arena, TG_KeyList *list, TG_Key key)
|
||||
{
|
||||
TG_KeyNode *n = push_array(arena, TG_KeyNode, 1);
|
||||
n->v = key;
|
||||
SLLQueuePush(list->first, list->last, n);
|
||||
list->count += 1;
|
||||
}
|
||||
|
||||
internal TG_KeyList
|
||||
tg_key_list_copy(Arena *arena, TG_KeyList *src)
|
||||
{
|
||||
TG_KeyList dst = {0};
|
||||
for(TG_KeyNode *n = src->first; n != 0; n = n->next)
|
||||
{
|
||||
tg_key_list_push(arena, &dst, n->v);
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: RADDBG <-> TG Enum Conversions
|
||||
|
||||
@@ -936,9 +956,12 @@ tg_data_members_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Pars
|
||||
struct Task
|
||||
{
|
||||
Task *next;
|
||||
U64 base_off;
|
||||
TG_KeyList inheritance_chain;
|
||||
TG_Key type_key;
|
||||
TG_Type *type;
|
||||
};
|
||||
Task start_task = {0, root_type};
|
||||
Task start_task = {0, 0, {0}, key, root_type};
|
||||
Task *first_task = &start_task;
|
||||
Task *last_task = &start_task;
|
||||
for(Task *task = first_task; task != 0; task = task->next)
|
||||
@@ -952,12 +975,18 @@ tg_data_members_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Pars
|
||||
{
|
||||
TG_MemberNode *n = push_array(scratch.arena, TG_MemberNode, 1);
|
||||
MemoryCopyStruct(&n->v, &type->members[member_idx]);
|
||||
n->v.off += task->base_off;
|
||||
n->v.inheritance_key_chain = task->inheritance_chain;
|
||||
SLLQueuePush(members_list.first, members_list.last, n);
|
||||
members_list.count += 1;
|
||||
}
|
||||
else if(type->members[member_idx].kind == TG_MemberKind_Base)
|
||||
{
|
||||
Task *t = push_array(scratch.arena, Task, 1);
|
||||
t->base_off = type->members[member_idx].off + task->base_off;
|
||||
t->inheritance_chain = tg_key_list_copy(scratch.arena, &task->inheritance_chain);
|
||||
tg_key_list_push(scratch.arena, &t->inheritance_chain, type->members[member_idx].type_key);
|
||||
t->type_key = type->members[member_idx].type_key;
|
||||
t->type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, type->members[member_idx].type_key);
|
||||
SLLQueuePush(first_task, last_task, t);
|
||||
members_need_offset_sort = 1;
|
||||
@@ -975,6 +1004,7 @@ tg_data_members_from_graph_raddbg_key(Arena *arena, TG_Graph *graph, RADDBG_Pars
|
||||
{
|
||||
MemoryCopyStruct(&members.v[idx], &n->v);
|
||||
members.v[idx].name = push_str8_copy(arena, members.v[idx].name);
|
||||
members.v[idx].inheritance_key_chain = tg_key_list_copy(arena, &members.v[idx].inheritance_key_chain);
|
||||
idx += 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,6 +31,21 @@ struct TG_Key
|
||||
U64 u64[1]; // ext -> unique id; cons -> idx; reg -> code
|
||||
};
|
||||
|
||||
typedef struct TG_KeyNode TG_KeyNode;
|
||||
struct TG_KeyNode
|
||||
{
|
||||
TG_KeyNode *next;
|
||||
TG_Key v;
|
||||
};
|
||||
|
||||
typedef struct TG_KeyList TG_KeyList;
|
||||
struct TG_KeyList
|
||||
{
|
||||
TG_KeyNode *first;
|
||||
TG_KeyNode *last;
|
||||
U64 count;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Graph Types
|
||||
|
||||
@@ -102,6 +117,7 @@ struct TG_Member
|
||||
TG_Key type_key;
|
||||
String8 name;
|
||||
U64 off;
|
||||
TG_KeyList inheritance_key_chain;
|
||||
};
|
||||
|
||||
typedef struct TG_MemberNode TG_MemberNode;
|
||||
@@ -180,6 +196,8 @@ thread_static Arena *tg_build_arena = 0;
|
||||
|
||||
internal U64 tg_hash_from_string(U64 seed, String8 string);
|
||||
internal int tg_qsort_compare_members_offset(TG_Member *a, TG_Member *b);
|
||||
internal void tg_key_list_push(Arena *arena, TG_KeyList *list, TG_Key key);
|
||||
internal TG_KeyList tg_key_list_copy(Arena *arena, TG_KeyList *src);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: RADDBG <-> TG Enum Conversions
|
||||
|
||||
Reference in New Issue
Block a user