From edbce2713f570269cdbafd2dec71ec9c6e2e2b20 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 5 Feb 2025 13:11:06 -0800 Subject: [PATCH] eliminate RD_Entity code entirely --- src/raddbg/raddbg_core.c | 806 +------------------------------------- src/raddbg/raddbg_core.h | 171 -------- src/raddbg/raddbg_views.c | 9 +- 3 files changed, 24 insertions(+), 962 deletions(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index d3bdf05b..fd00af6f 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -93,164 +93,6 @@ rd_cmd_list_push_new(Arena *arena, RD_CmdList *cmds, String8 name, RD_Regs *regs cmds->count += 1; } -//////////////////////////////// -//~ rjf: Entity Functions - -//- rjf: nil - -internal B32 -rd_entity_is_nil(RD_Entity *entity) -{ - return (entity == 0 || entity == &rd_nil_entity); -} - -//- rjf: handle <-> entity conversions - -internal U64 -rd_index_from_entity(RD_Entity *entity) -{ - return (U64)(entity - rd_state->entities_base); -} - -internal RD_Handle -rd_handle_from_entity(RD_Entity *entity) -{ - RD_Handle handle = rd_handle_zero(); - if(!rd_entity_is_nil(entity)) - { - handle.u64[0] = rd_index_from_entity(entity); - handle.u64[1] = entity->gen; - } - return handle; -} - -internal RD_Entity * -rd_entity_from_handle(RD_Handle handle) -{ - RD_Entity *result = rd_state->entities_base + handle.u64[0]; - if(handle.u64[0] >= rd_state->entities_count || result->gen != handle.u64[1]) - { - result = &rd_nil_entity; - } - return result; -} - -//- rjf: entity recursion iterators - -internal RD_EntityRec -rd_entity_rec_depth_first(RD_Entity *entity, RD_Entity *subtree_root, U64 sib_off, U64 child_off) -{ - RD_EntityRec result = {0}; - if(!rd_entity_is_nil(*MemberFromOffset(RD_Entity **, entity, child_off))) - { - result.next = *MemberFromOffset(RD_Entity **, entity, child_off); - result.push_count = 1; - } - else for(RD_Entity *parent = entity; parent != subtree_root && !rd_entity_is_nil(parent); parent = parent->parent) - { - if(parent != subtree_root && !rd_entity_is_nil(*MemberFromOffset(RD_Entity **, parent, sib_off))) - { - result.next = *MemberFromOffset(RD_Entity **, parent, sib_off); - break; - } - result.pop_count += 1; - } - return result; -} - -//- rjf: ancestor/child introspection - -internal RD_Entity * -rd_entity_child_from_kind(RD_Entity *entity, RD_EntityKind kind) -{ - RD_Entity *result = &rd_nil_entity; - for(RD_Entity *child = entity->first; !rd_entity_is_nil(child); child = child->next) - { - if(!(child->flags & RD_EntityFlag_MarkedForDeletion) && child->kind == kind) - { - result = child; - break; - } - } - return result; -} - -//- rjf: entity list building - -internal void -rd_entity_list_push(Arena *arena, RD_EntityList *list, RD_Entity *entity) -{ - RD_EntityNode *n = push_array(arena, RD_EntityNode, 1); - n->entity = entity; - SLLQueuePush(list->first, list->last, n); - list->count += 1; -} - -internal RD_EntityArray -rd_entity_array_from_list(Arena *arena, RD_EntityList *list) -{ - RD_EntityArray result = {0}; - result.count = list->count; - result.v = push_array(arena, RD_Entity *, result.count); - U64 idx = 0; - for(RD_EntityNode *n = list->first; n != 0; n = n->next, idx += 1) - { - result.v[idx] = n->entity; - } - return result; -} - -//- rjf: entity -> color operations - -internal Vec4F32 -rd_hsva_from_entity(RD_Entity *entity) -{ - Vec4F32 result = {0}; - if(entity->flags & RD_EntityFlag_HasColor) - { - result = entity->color_hsva; - } - return result; -} - -internal Vec4F32 -rd_rgba_from_entity(RD_Entity *entity) -{ - Vec4F32 result = {0}; - if(entity->flags & RD_EntityFlag_HasColor) - { - Vec3F32 hsv = v3f32(entity->color_hsva.x, entity->color_hsva.y, entity->color_hsva.z); - Vec3F32 rgb = rgb_from_hsv(hsv); - result = v4f32(rgb.x, rgb.y, rgb.z, entity->color_hsva.w); - } - else switch(entity->kind) - { - default:{}break; - case RD_EntityKind_Breakpoint: - { - result = rd_rgba_from_theme_color(RD_ThemeColor_Breakpoint); - }break; - } - return result; -} - -//- rjf: entity -> expansion tree keys - -internal EV_Key -rd_ev_key_from_entity(RD_Entity *entity) -{ - EV_Key parent_key = rd_parent_ev_key_from_entity(entity); - EV_Key key = ev_key_make(ev_hash_from_key(parent_key), (U64)entity); - return key; -} - -internal EV_Key -rd_parent_ev_key_from_entity(RD_Entity *entity) -{ - EV_Key parent_key = ev_key_make(5381, (U64)entity); - return parent_key; -} - //////////////////////////////// //~ rjf: View Spec Type Functions @@ -1510,258 +1352,6 @@ rd_immediate_cfg_from_keyf(char *fmt, ...) return result; } -//////////////////////////////// -//~ rjf: Entity State Functions - -//- rjf: entity allocation + tree forming - -internal RD_Entity * -rd_entity_alloc(RD_Entity *parent, RD_EntityKind kind) -{ - B32 user_defined_lifetime = !!(rd_entity_kind_flags_table[kind] & RD_EntityKindFlag_UserDefinedLifetime); - U64 free_list_idx = !!user_defined_lifetime; - if(rd_entity_is_nil(parent)) { parent = rd_state->entities_root; } - - // rjf: empty free list -> push new - if(!rd_state->entities_free[free_list_idx]) - { - RD_Entity *entity = push_array(rd_state->entities_arena, RD_Entity, 1); - rd_state->entities_count += 1; - rd_state->entities_free_count += 1; - SLLStackPush(rd_state->entities_free[free_list_idx], entity); - } - - // rjf: pop new entity off free-list - RD_Entity *entity = rd_state->entities_free[free_list_idx]; - SLLStackPop(rd_state->entities_free[free_list_idx]); - rd_state->entities_free_count -= 1; - rd_state->entities_active_count += 1; - - // rjf: zero entity - { - U64 gen = entity->gen; - MemoryZeroStruct(entity); - entity->gen = gen; - } - - // rjf: set up alloc'd entity links - entity->first = entity->last = entity->next = entity->prev = entity->parent = &rd_nil_entity; - entity->parent = parent; - - // rjf: stitch up parent links - if(rd_entity_is_nil(parent)) - { - rd_state->entities_root = entity; - } - else - { - DLLPushBack_NPZ(&rd_nil_entity, parent->first, parent->last, entity, next, prev); - } - - // rjf: fill out metadata - entity->kind = kind; - rd_state->entities_id_gen += 1; - entity->id = rd_state->entities_id_gen; - entity->gen += 1; - entity->alloc_time_us = os_now_microseconds(); - - // rjf: initialize to deleted, record history, then "undelete" if this allocation can be undone - if(user_defined_lifetime) - { - // TODO(rjf) - } - - // rjf: dirtify caches - rd_state->kind_alloc_gens[kind] += 1; - - // rjf: log - LogInfoNamedBlockF("new_entity") - { - log_infof("kind: \"%S\"\n", d_entity_kind_display_string_table[kind]); - log_infof("id: $0x%I64x\n", entity->id); - } - - return entity; -} - -internal void -rd_entity_mark_for_deletion(RD_Entity *entity) -{ - if(!rd_entity_is_nil(entity)) - { - entity->flags |= RD_EntityFlag_MarkedForDeletion; - rd_state->kind_alloc_gens[entity->kind] += 1; - } -} - -internal void -rd_entity_release(RD_Entity *entity) -{ - Temp scratch = scratch_begin(0, 0); - - // rjf: unpack - U64 free_list_idx = !!(rd_entity_kind_flags_table[entity->kind] & RD_EntityKindFlag_UserDefinedLifetime); - - // rjf: release whole tree - typedef struct Task Task; - struct Task - { - Task *next; - RD_Entity *e; - }; - Task start_task = {0, entity}; - Task *first_task = &start_task; - Task *last_task = &start_task; - for(Task *task = first_task; task != 0; task = task->next) - { - for(RD_Entity *child = task->e->first; !rd_entity_is_nil(child); child = child->next) - { - Task *t = push_array(scratch.arena, Task, 1); - t->e = child; - SLLQueuePush(first_task, last_task, t); - } - LogInfoNamedBlockF("end_entity") - { - log_infof("kind: \"%S\"\n", d_entity_kind_display_string_table[task->e->kind]); - log_infof("id: $0x%I64x\n", task->e->id); - } - SLLStackPush(rd_state->entities_free[free_list_idx], task->e); - rd_state->entities_free_count += 1; - rd_state->entities_active_count -= 1; - task->e->gen += 1; - if(task->e->string.size != 0) - { - rd_name_release(task->e->string); - } - rd_state->kind_alloc_gens[task->e->kind] += 1; - } - - scratch_end(scratch); -} - -internal void -rd_entity_change_parent(RD_Entity *entity, RD_Entity *old_parent, RD_Entity *new_parent, RD_Entity *prev_child) -{ - Assert(entity->parent == old_parent); - Assert(prev_child->parent == old_parent || rd_entity_is_nil(prev_child)); - if(prev_child != entity) - { - // rjf: fix up links - if(!rd_entity_is_nil(old_parent)) - { - DLLRemove_NPZ(&rd_nil_entity, old_parent->first, old_parent->last, entity, next, prev); - } - if(!rd_entity_is_nil(new_parent)) - { - DLLInsert_NPZ(&rd_nil_entity, new_parent->first, new_parent->last, prev_child, entity, next, prev); - } - entity->parent = new_parent; - - // rjf: notify - rd_state->kind_alloc_gens[entity->kind] += 1; - } -} - -internal RD_Entity * -rd_entity_child_from_kind_or_alloc(RD_Entity *entity, RD_EntityKind kind) -{ - RD_Entity *child = rd_entity_child_from_kind(entity, kind); - if(rd_entity_is_nil(child)) - { - child = rd_entity_alloc(entity, kind); - } - return child; -} - -//- rjf: entity simple equipment - -internal void -rd_entity_equip_txt_pt(RD_Entity *entity, TxtPt point) -{ - rd_require_entity_nonnil(entity, return); - entity->text_point = point; - entity->flags |= RD_EntityFlag_HasTextPoint; -} - -internal void -rd_entity_equip_disabled(RD_Entity *entity, B32 value) -{ - rd_require_entity_nonnil(entity, return); - entity->disabled = value; -} - -internal void -rd_entity_equip_u64(RD_Entity *entity, U64 u64) -{ - rd_require_entity_nonnil(entity, return); - entity->u64 = u64; - entity->flags |= RD_EntityFlag_HasU64; -} - -internal void -rd_entity_equip_color_rgba(RD_Entity *entity, Vec4F32 rgba) -{ - rd_require_entity_nonnil(entity, return); - Vec3F32 rgb = v3f32(rgba.x, rgba.y, rgba.z); - Vec3F32 hsv = hsv_from_rgb(rgb); - Vec4F32 hsva = v4f32(hsv.x, hsv.y, hsv.z, rgba.w); - rd_entity_equip_color_hsva(entity, hsva); -} - -internal void -rd_entity_equip_color_hsva(RD_Entity *entity, Vec4F32 hsva) -{ - rd_require_entity_nonnil(entity, return); - entity->color_hsva = hsva; - entity->flags |= RD_EntityFlag_HasColor; -} - -internal void -rd_entity_equip_cfg_src(RD_Entity *entity, RD_CfgSrc cfg_src) -{ - rd_require_entity_nonnil(entity, return); - entity->cfg_src = cfg_src; -} - -internal void -rd_entity_equip_timestamp(RD_Entity *entity, U64 timestamp) -{ - rd_require_entity_nonnil(entity, return); - entity->timestamp = timestamp; -} - -//- rjf: control layer correllation equipment - -internal void -rd_entity_equip_vaddr(RD_Entity *entity, U64 vaddr) -{ - rd_require_entity_nonnil(entity, return); - entity->vaddr = vaddr; - entity->flags |= RD_EntityFlag_HasVAddr; -} - -//- rjf: name equipment - -internal void -rd_entity_equip_name(RD_Entity *entity, String8 name) -{ - rd_require_entity_nonnil(entity, return); - if(entity->string.size != 0) - { - rd_name_release(entity->string); - } - if(name.size != 0) - { - entity->string = rd_name_alloc(name); - } - else - { - entity->string = str8_zero(); - } -} - -//- rjf: file path map override lookups - internal String8 rd_mapped_from_file_path(Arena *arena, String8 file_path) { @@ -1895,251 +1485,6 @@ rd_possible_overrides_from_file_path(Arena *arena, String8 file_path) return result; } -//- rjf: top-level state queries - -internal RD_Entity * -rd_entity_root(void) -{ - return rd_state->entities_root; -} - -internal RD_EntityList -rd_push_entity_list_with_kind(Arena *arena, RD_EntityKind kind) -{ - ProfBeginFunction(); - RD_EntityList result = {0}; - for(RD_Entity *entity = rd_state->entities_root; - !rd_entity_is_nil(entity); - entity = rd_entity_rec_depth_first_pre(entity, &rd_nil_entity).next) - { - if(entity->kind == kind && !(entity->flags & RD_EntityFlag_MarkedForDeletion)) - { - rd_entity_list_push(arena, &result, entity); - } - } - ProfEnd(); - return result; -} - -internal RD_Entity * -rd_entity_from_id(RD_EntityID id) -{ - RD_Entity *result = &rd_nil_entity; - for(RD_Entity *e = rd_entity_root(); - !rd_entity_is_nil(e); - e = rd_entity_rec_depth_first_pre(e, &rd_nil_entity).next) - { - if(e->id == id) - { - result = e; - break; - } - } - return result; -} - -internal RD_Entity * -rd_entity_from_name_and_kind(String8 string, RD_EntityKind kind) -{ - RD_Entity *result = &rd_nil_entity; - RD_EntityList all_of_this_kind = rd_query_cached_entity_list_with_kind(kind); - for(RD_EntityNode *n = all_of_this_kind.first; n != 0; n = n->next) - { - if(str8_match(n->entity->string, string, 0)) - { - result = n->entity; - break; - } - } - return result; -} - -//////////////////////////////// -//~ rjf: Frontend Entity Info Extraction - -internal DR_FancyStringList -rd_title_fstrs_from_entity(Arena *arena, RD_Entity *entity, Vec4F32 secondary_color, F32 size) -{ - DR_FancyStringList result = {0}; - RD_Entity *exe = rd_entity_child_from_kind(entity, RD_EntityKind_Executable); - RD_Entity *args = rd_entity_child_from_kind(entity, RD_EntityKind_Arguments); - RD_Entity *loc = rd_entity_child_from_kind(entity, RD_EntityKind_Location); - RD_Entity *cnd = rd_entity_child_from_kind(entity, RD_EntityKind_Condition); - RD_Entity *src = rd_entity_child_from_kind(entity, RD_EntityKind_Source); - RD_Entity *dst = rd_entity_child_from_kind(entity, RD_EntityKind_Dest); - RD_IconKind icon_kind = rd_entity_kind_icon_kind_table[entity->kind]; - Vec4F32 color = rd_rgba_from_theme_color(RD_ThemeColor_Text); - if(icon_kind != RD_IconKind_Null) - { - dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Icons), size, secondary_color, rd_icon_kind_text_table[icon_kind]); - } - dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" ")); - if(entity->kind == RD_EntityKind_Target && entity->cfg_src == RD_CfgSrc_CommandLine) - { - dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Icons), size, rd_rgba_from_theme_color(RD_ThemeColor_TextNegative), rd_icon_kind_text_table[RD_IconKind_Info]); - dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" ")); - } - String8 name = entity->string; - B32 name_is_code = 1; - if(rd_entity_kind_flags_table[entity->kind] & RD_EntityKindFlag_NameIsPath) - { - name_is_code = 0; - } - String8 location = {0}; - B32 location_is_code = 0; - String8 exe_name = str8_skip_last_slash(exe->string); - String8 args_string = args->string; - String8 cnd_string = cnd->string; - if(!rd_entity_is_nil(loc)) - { - if(loc->string.size != 0 && loc->flags & RD_EntityFlag_HasTextPoint) - { - location = push_str8f(arena, "%S:%I64d:%I64d", loc->string, loc->text_point.line, loc->text_point.column); - location_is_code = 0; - } - else if(loc->string.size != 0) - { - location = loc->string; - location_is_code = 1; - } - else if(loc->flags & RD_EntityFlag_HasVAddr) - { - location = push_str8f(arena, "0x%I64x", loc->vaddr); - location_is_code = 1; - } - } - B32 extra = 0; - F32 size_extrafied = size; - Vec4F32 color_extrafied = color; - if(name.size != 0) - { - dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(name_is_code ? RD_FontSlot_Code : RD_FontSlot_Main), size, color, name); - extra = 1; - size_extrafied = size*0.95f; - color_extrafied = secondary_color; - } - if(location.size != 0) - { - if(extra) - { - dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" ")); - } - if(location_is_code) - { - DR_FancyStringList loc_fstrs = {0}; - RD_Font(RD_FontSlot_Code) - loc_fstrs = rd_fancy_string_list_from_code_string(arena, 1.f, 0, color_extrafied, location); - dr_fancy_string_list_concat_in_place(&result, &loc_fstrs); - } - else - { - dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size_extrafied, color_extrafied, location); - } - extra = 1; - size_extrafied = size*0.95f; - color_extrafied = secondary_color; - } - if(exe_name.size != 0) - { - if(extra) - { - dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" ")); - } - dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size_extrafied, color_extrafied, exe_name); - extra = 1; - size_extrafied = size*0.95f; - color_extrafied = secondary_color; - } - if(args_string.size != 0) - { - if(extra) - { - dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" ")); - } - dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size_extrafied, color_extrafied, args_string); - extra = 1; - size_extrafied = size*0.95f; - color_extrafied = secondary_color; - } - if(cnd_string.size != 0) - { - dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, color_extrafied, str8_lit(" if ")); - RD_Font(RD_FontSlot_Code) UI_FontSize(size_extrafied) - { - DR_FancyStringList cnd_fstrs = rd_fancy_string_list_from_code_string(arena, 1.f, 0.f, color_extrafied, cnd_string); - dr_fancy_string_list_concat_in_place(&result, &cnd_fstrs); - } - } - if(entity->kind == RD_EntityKind_FilePathMap) - { - String8 src_string = src->string; - Vec4F32 src_color = color; - String8 dst_string = dst->string; - Vec4F32 dst_color = color; - if(src_string.size == 0) - { - src_string = str8_lit("(source path)"); - src_color = secondary_color; - } - if(dst_string.size == 0) - { - dst_string = str8_lit("(destination path)"); - dst_color = secondary_color; - } - dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size, src_color, src_string); - dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" ")); - dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Icons), size, secondary_color, rd_icon_kind_text_table[RD_IconKind_RightArrow]); - dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" ")); - dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size, dst_color, dst_string); - } - if(entity->kind == RD_EntityKind_AutoViewRule) - { - String8 src_string = src->string; - Vec4F32 src_color = color; - String8 dst_string = dst->string; - Vec4F32 dst_color = color; - DR_FancyStringList src_fstrs = {0}; - DR_FancyStringList dst_fstrs = {0}; - if(src_string.size == 0) - { - src_string = str8_lit("(type)"); - src_color = secondary_color; - dr_fancy_string_list_push_new(arena, &src_fstrs, rd_font_from_slot(RD_FontSlot_Main), size, src_color, src_string); - } - else RD_Font(RD_FontSlot_Code) - { - src_fstrs = rd_fancy_string_list_from_code_string(arena, 1.f, 0, src_color, src_string); - } - if(dst_string.size == 0) - { - dst_string = str8_lit("(view rule)"); - dst_color = secondary_color; - dr_fancy_string_list_push_new(arena, &dst_fstrs, rd_font_from_slot(RD_FontSlot_Main), size, dst_color, dst_string); - } - else RD_Font(RD_FontSlot_Code) - { - dst_fstrs = rd_fancy_string_list_from_code_string(arena, 1.f, 0, dst_color, dst_string); - } - dr_fancy_string_list_concat_in_place(&result, &src_fstrs); - dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" ")); - dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Icons), size, secondary_color, rd_icon_kind_text_table[RD_IconKind_RightArrow]); - dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" ")); - dr_fancy_string_list_concat_in_place(&result, &dst_fstrs); - } - if((entity->kind == RD_EntityKind_Target || entity->kind == RD_EntityKind_Breakpoint) && entity->disabled) - { - dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" ")); - dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size*0.95f, secondary_color, str8_lit("(Disabled)")); - } - if(entity->kind == RD_EntityKind_Breakpoint) - { - dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" ")); - String8 string = push_str8f(arena, "(%I64u hit%s)", entity->u64, entity->u64 == 1 ? "" : "s"); - dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size_extrafied, secondary_color, string); - } - return result; -} - //////////////////////////////// //~ rjf: Control Entity Info Extraction @@ -2543,73 +1888,6 @@ rd_eval_blob_from_entity__cached(CTRL_Entity *entity) //- rjf: entity -> meta eval -internal CTRL_MetaEval * -rd_ctrl_meta_eval_from_entity(Arena *arena, RD_Entity *entity) -{ - ProfBeginFunction(); - CTRL_MetaEval *meval = push_array(arena, CTRL_MetaEval, 1); - RD_Entity *exe = rd_entity_child_from_kind(entity, RD_EntityKind_Executable); - RD_Entity *args= rd_entity_child_from_kind(entity, RD_EntityKind_Arguments); - RD_Entity *wdir= rd_entity_child_from_kind(entity, RD_EntityKind_WorkingDirectory); - RD_Entity *entr= rd_entity_child_from_kind(entity, RD_EntityKind_EntryPoint); - RD_Entity *stdo= rd_entity_child_from_kind(entity, RD_EntityKind_StdoutPath); - RD_Entity *stde= rd_entity_child_from_kind(entity, RD_EntityKind_StderrPath); - RD_Entity *stdi= rd_entity_child_from_kind(entity, RD_EntityKind_StdinPath); - RD_Entity *loc = rd_entity_child_from_kind(entity, RD_EntityKind_Location); - RD_Entity *cnd = rd_entity_child_from_kind(entity, RD_EntityKind_Condition); - RD_Entity *src = rd_entity_child_from_kind(entity, RD_EntityKind_Source); - RD_Entity *dst = rd_entity_child_from_kind(entity, RD_EntityKind_Dest); - String8 label_string = push_str8_copy(arena, entity->string); - String8 src_loc_string = {0}; - String8 vaddr_loc_string = {0}; - String8 function_loc_string = {0}; - if(loc->flags & RD_EntityFlag_HasTextPoint) - { - src_loc_string = push_str8f(arena, "%S:%I64u:%I64u", loc->string, loc->text_point.line, loc->text_point.column); - } - else if(loc->flags & RD_EntityFlag_HasVAddr) - { - vaddr_loc_string = push_str8f(arena, "0x%I64x", loc->vaddr); - } - else if(loc->string.size != 0) - { - function_loc_string = push_str8_copy(arena, loc->string); - } - String8 cnd_string = push_str8_copy(arena, cnd->string); - meval->enabled = !entity->disabled; - meval->hit_count = entity->u64; - meval->color = u32_from_rgba(rd_rgba_from_entity(entity)); - meval->label = label_string; - meval->exe = exe->string; - meval->args = args->string; - meval->working_directory = wdir->string; - meval->entry_point = entr->string; - meval->stdout_path = stdo->string; - meval->stderr_path = stde->string; - meval->stdin_path = stdi->string; - meval->source_location = src_loc_string; - meval->address_location = vaddr_loc_string; - meval->function_location = function_loc_string; - meval->condition = cnd_string; - meval->debug_subprocesses.b32 = entity->debug_subprocesses; - switch(entity->kind) - { - default:{}break; - case RD_EntityKind_FilePathMap: - { - meval->source_path = src->string; - meval->destination_path = dst->string; - }break; - case RD_EntityKind_AutoViewRule: - { - meval->type = src->string; - meval->view_rule = dst->string; - }break; - } - ProfEnd(); - return meval; -} - internal CTRL_MetaEval * rd_ctrl_meta_eval_from_ctrl_entity(Arena *arena, CTRL_Entity *entity) { @@ -11627,32 +10905,6 @@ rd_frame_arena(void) return rd_state->frame_arenas[rd_state->frame_index%ArrayCount(rd_state->frame_arenas)]; } -//- rjf: entity cache queries - -internal RD_EntityList -rd_query_cached_entity_list_with_kind(RD_EntityKind kind) -{ - ProfBeginFunction(); - RD_EntityListCache *cache = &rd_state->kind_caches[kind]; - - // rjf: build cached list if we're out-of-date - if(cache->alloc_gen != rd_state->kind_alloc_gens[kind]) - { - cache->alloc_gen = rd_state->kind_alloc_gens[kind]; - if(cache->arena == 0) - { - cache->arena = arena_alloc(); - } - arena_clear(cache->arena); - cache->list = rd_push_entity_list_with_kind(cache->arena, kind); - } - - // rjf: grab & return cached list - RD_EntityList result = cache->list; - ProfEnd(); - return result; -} - //////////////////////////////// //~ rjf: Registers @@ -11884,11 +11136,6 @@ rd_init(CmdLine *cmdln) { rd_state->cmds_arenas[idx] = arena_alloc(); } - rd_state->entities_arena = arena_alloc(.reserve_size = GB(64), .commit_size = KB(64)); - rd_state->entities_root = &rd_nil_entity; - rd_state->entities_base = push_array(rd_state->entities_arena, RD_Entity, 0); - rd_state->entities_count = 0; - rd_state->entities_root = rd_entity_alloc(&rd_nil_entity, RD_EntityKind_Root); rd_state->popup_arena = arena_alloc(); rd_state->ctx_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("top_level_ctx_menu")); rd_state->drop_completion_key = ui_key_from_string(ui_key_zero(), str8_lit("drop_completion_ctx_menu")); @@ -15508,17 +14755,28 @@ Z(getting_started) case RD_CmdKind_ToggleWatchExpression: if(rd_regs()->string.size != 0) { - RD_Entity *existing_watch = rd_entity_from_name_and_kind(rd_regs()->string, RD_EntityKind_Watch); - if(rd_entity_is_nil(existing_watch)) + RD_CfgList all_existing_watches = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("watch")); + RD_Cfg *existing_watch = &rd_nil_cfg; + for(RD_CfgNode *n = all_existing_watches.first; n != 0; n = n->next) { - RD_Entity *watch = &rd_nil_entity; - watch = rd_entity_alloc(rd_entity_root(), RD_EntityKind_Watch); - rd_entity_equip_cfg_src(watch, RD_CfgSrc_Project); - rd_entity_equip_name(watch, rd_regs()->string); + RD_Cfg *watch = n->v; + String8 expr = rd_expr_from_cfg(watch); + if(str8_match(expr, rd_regs()->string, 0)) + { + existing_watch = watch; + break; + } + } + if(existing_watch == &rd_nil_cfg) + { + RD_Cfg *project = rd_cfg_child_from_string(rd_state->root_cfg, str8_lit("project")); + RD_Cfg *watch = rd_cfg_new(project, str8_lit("watch")); + RD_Cfg *expr = rd_cfg_new(watch, str8_lit("expression")); + rd_cfg_new(expr, rd_regs()->string); } else { - rd_entity_mark_for_deletion(existing_watch); + rd_cfg_release(existing_watch); } }break; @@ -16803,34 +16061,6 @@ Z(getting_started) } } - ////////////////////////////// - //- rjf: eliminate entities that are marked for deletion - // - ProfScope("eliminate deleted entities") - { - for(RD_Entity *entity = rd_entity_root(), *next = 0; !rd_entity_is_nil(entity); entity = next) - { - next = rd_entity_rec_depth_first_pre(entity, &rd_nil_entity).next; - if(entity->flags & RD_EntityFlag_MarkedForDeletion) - { - B32 undoable = (rd_entity_kind_flags_table[entity->kind] & RD_EntityKindFlag_UserDefinedLifetime); - - // rjf: fixup next entity to iterate to - next = rd_entity_rec_depth_first(entity, &rd_nil_entity, OffsetOf(RD_Entity, next), OffsetOf(RD_Entity, next)).next; - - // rjf: eliminate root entity if we're freeing it - if(entity == rd_state->entities_root) - { - rd_state->entities_root = &rd_nil_entity; - } - - // rjf: unhook & release this entity tree - rd_entity_change_parent(entity, entity->parent, &rd_nil_entity, &rd_nil_entity); - rd_entity_release(entity); - } - } - } - ////////////////////////////// //- rjf: determine frame time, record into history // diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 21d17818..b7a6c1f7 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -386,72 +386,6 @@ struct RD_PanelNodeRec S32 pop_count; }; -//////////////////////////////// -//~ rjf: Entity Types - -typedef U64 RD_EntityID; - -typedef struct RD_Entity RD_Entity; -struct RD_Entity -{ - // rjf: tree links - RD_Entity *first; - RD_Entity *last; - RD_Entity *next; - RD_Entity *prev; - RD_Entity *parent; - - // rjf: metadata - RD_EntityKind kind; - RD_EntityFlags flags; - RD_EntityID id; - U64 gen; - U64 alloc_time_us; - - // rjf: basic equipment - TxtPt text_point; - B32 disabled; - B32 debug_subprocesses; - U64 u64; - U64 vaddr; - Vec4F32 color_hsva; - RD_CfgSrc cfg_src; - U64 timestamp; - - // rjf: string equipment - String8 string; -}; - -typedef struct RD_EntityNode RD_EntityNode; -struct RD_EntityNode -{ - RD_EntityNode *next; - RD_Entity *entity; -}; - -typedef struct RD_EntityList RD_EntityList; -struct RD_EntityList -{ - RD_EntityNode *first; - RD_EntityNode *last; - U64 count; -}; - -typedef struct RD_EntityArray RD_EntityArray; -struct RD_EntityArray -{ - RD_Entity **v; - U64 count; -}; - -typedef struct RD_EntityRec RD_EntityRec; -struct RD_EntityRec -{ - RD_Entity *next; - S32 push_count; - S32 pop_count; -}; - //////////////////////////////// //~ rjf: Command Types @@ -767,14 +701,6 @@ struct RD_NameChunkNode U64 size; }; -typedef struct RD_EntityListCache RD_EntityListCache; -struct RD_EntityListCache -{ - Arena *arena; - U64 alloc_gen; - RD_EntityList list; -}; - typedef struct RD_AmbiguousPathNode RD_AmbiguousPathNode; struct RD_AmbiguousPathNode { @@ -913,20 +839,6 @@ struct RD_State // TODO(rjf): TO BE ELIMINATED OR REPLACED VVVVVVVVVVVVVVVV //- - // rjf: entity state - Arena *entities_arena; - RD_Entity *entities_base; - U64 entities_count; - U64 entities_id_gen; - RD_Entity *entities_root; - RD_Entity *entities_free[2]; // [0] -> normal lifetime, not user defined; [1] -> user defined lifetime (& thus undoable) - U64 entities_free_count; - U64 entities_active_count; - - // rjf: entity query caches - U64 kind_alloc_gens[RD_EntityKind_COUNT]; - RD_EntityListCache kind_caches[RD_EntityKind_COUNT]; - // rjf: bind change Arena *bind_change_arena; B32 bind_change_active; @@ -964,15 +876,6 @@ read_only global RD_PanelNode rd_nil_panel_node = .selected_tab = &rd_nil_cfg, }; -read_only global RD_Entity rd_nil_entity = -{ - &rd_nil_entity, - &rd_nil_entity, - &rd_nil_entity, - &rd_nil_entity, - &rd_nil_entity, -}; - read_only global RD_CmdKindInfo rd_nil_cmd_kind_info = {0}; read_only global RD_ViewRuleInfo rd_nil_view_rule_info = @@ -1025,39 +928,6 @@ internal RD_Regs *rd_regs_copy(Arena *arena, RD_Regs *src); internal void rd_cmd_list_push_new(Arena *arena, RD_CmdList *cmds, String8 name, RD_Regs *regs); -//////////////////////////////// -//~ rjf: Entity Type Pure Functions - -//- rjf: nil -internal B32 rd_entity_is_nil(RD_Entity *entity); -#define rd_require_entity_nonnil(entity, if_nil_stmts) do{if(rd_entity_is_nil(entity)){if_nil_stmts;}}while(0) - -//- rjf: handle <-> entity conversions -internal U64 rd_index_from_entity(RD_Entity *entity); -internal RD_Handle rd_handle_from_entity(RD_Entity *entity); -internal RD_Entity *rd_entity_from_handle(RD_Handle handle); - -//- rjf: entity recursion iterators -internal RD_EntityRec rd_entity_rec_depth_first(RD_Entity *entity, RD_Entity *subtree_root, U64 sib_off, U64 child_off); -#define rd_entity_rec_depth_first_pre(entity, subtree_root) rd_entity_rec_depth_first((entity), (subtree_root), OffsetOf(RD_Entity, next), OffsetOf(RD_Entity, first)) -#define rd_entity_rec_depth_first_post(entity, subtree_root) rd_entity_rec_depth_first((entity), (subtree_root), OffsetOf(RD_Entity, prev), OffsetOf(RD_Entity, last)) - -//- rjf: ancestor/child introspection -internal RD_Entity *rd_entity_child_from_kind(RD_Entity *entity, RD_EntityKind kind); - -//- rjf: entity list building -internal void rd_entity_list_push(Arena *arena, RD_EntityList *list, RD_Entity *entity); -internal RD_EntityArray rd_entity_array_from_list(Arena *arena, RD_EntityList *list); -#define rd_first_entity_from_list(list) ((list)->first != 0 ? (list)->first->entity : &rd_nil_entity) - -//- rjf: entity -> color operations -internal Vec4F32 rd_hsva_from_entity(RD_Entity *entity); -internal Vec4F32 rd_rgba_from_entity(RD_Entity *entity); - -//- rjf: entity -> expansion tree keys -internal EV_Key rd_ev_key_from_entity(RD_Entity *entity); -internal EV_Key rd_parent_ev_key_from_entity(RD_Entity *entity); - //////////////////////////////// //~ rjf: View Spec Type Functions @@ -1143,46 +1013,9 @@ internal String8 rd_setting_from_name(String8 name); internal RD_Cfg *rd_immediate_cfg_from_key(String8 string); internal RD_Cfg *rd_immediate_cfg_from_keyf(char *fmt, ...); -//////////////////////////////// -//~ rjf: Entity Stateful Functions - -//- rjf: entity allocation + tree forming -internal RD_Entity *rd_entity_alloc(RD_Entity *parent, RD_EntityKind kind); -internal void rd_entity_mark_for_deletion(RD_Entity *entity); -internal void rd_entity_release(RD_Entity *entity); -internal void rd_entity_change_parent(RD_Entity *entity, RD_Entity *old_parent, RD_Entity *new_parent, RD_Entity *prev_child); -internal RD_Entity *rd_entity_child_from_kind_or_alloc(RD_Entity *entity, RD_EntityKind kind); - -//- rjf: entity simple equipment -internal void rd_entity_equip_txt_pt(RD_Entity *entity, TxtPt point); -internal void rd_entity_equip_disabled(RD_Entity *entity, B32 b32); -internal void rd_entity_equip_u64(RD_Entity *entity, U64 u64); -internal void rd_entity_equip_color_rgba(RD_Entity *entity, Vec4F32 rgba); -internal void rd_entity_equip_color_hsva(RD_Entity *entity, Vec4F32 hsva); -internal void rd_entity_equip_cfg_src(RD_Entity *entity, RD_CfgSrc cfg_src); -internal void rd_entity_equip_timestamp(RD_Entity *entity, U64 timestamp); - -//- rjf: control layer correllation equipment -internal void rd_entity_equip_vaddr(RD_Entity *entity, U64 vaddr); - -//- rjf: name equipment -internal void rd_entity_equip_name(RD_Entity *entity, String8 name); - -//- rjf: file path map override lookups internal String8 rd_mapped_from_file_path(Arena *arena, String8 file_path); internal String8List rd_possible_overrides_from_file_path(Arena *arena, String8 file_path); -//- rjf: top-level state queries -internal RD_Entity *rd_entity_root(void); -internal RD_EntityList rd_push_entity_list_with_kind(Arena *arena, RD_EntityKind kind); -internal RD_Entity *rd_entity_from_id(RD_EntityID id); -internal RD_Entity *rd_entity_from_name_and_kind(String8 string, RD_EntityKind kind); - -//////////////////////////////// -//~ rjf: Frontend Entity Info Extraction - -internal DR_FancyStringList rd_title_fstrs_from_entity(Arena *arena, RD_Entity *entity, Vec4F32 secondary_color, F32 size); - //////////////////////////////// //~ rjf: Control Entity Info Extraction @@ -1210,7 +1043,6 @@ internal String8 rd_eval_blob_from_entity(Arena *arena, CTRL_Entity *entity); internal String8 rd_eval_blob_from_entity__cached(CTRL_Entity *entity); //- rjf: entity -> meta eval -internal CTRL_MetaEval *rd_ctrl_meta_eval_from_entity(Arena *arena, RD_Entity *entity); internal CTRL_MetaEval *rd_ctrl_meta_eval_from_ctrl_entity(Arena *arena, CTRL_Entity *entity); //- rjf: eval space reads/writes @@ -1368,9 +1200,6 @@ internal void rd_request_frame(void); //- rjf: per-frame arena internal Arena *rd_frame_arena(void); -//- rjf: entity cache queries -internal RD_EntityList rd_query_cached_entity_list_with_kind(RD_EntityKind kind); - //////////////////////////////// //~ rjf: Registers diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index fd8e2236..be895e31 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -968,6 +968,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) if(info.group_cfg_name.size != 0) { RD_CfgList cfgs = rd_cfg_top_level_list_from_string(scratch.arena, info.group_cfg_name); + // TODO(rjf): this is not correct - assumes row's evaluation is in the block's space... // info.group_cfg = rd_cfg_from_eval_space(info.eval.space); } @@ -2080,7 +2081,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect) taken = 1; state_dirty = 1; snap_to_cursor = 1; - RD_EntityList entities_to_remove = {0}; + RD_CfgList cfgs_to_remove = {0}; RD_WatchPt next_cursor_pt = {0}; B32 next_cursor_set = 0; EV_WindowedRowList rows = ev_rows_from_num_range(scratch.arena, eval_view, filter, &block_ranges, r1u64(selection_tbl.min.y, selection_tbl.max.y+1)); @@ -2143,9 +2144,9 @@ rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect) #endif } } - for(RD_EntityNode *n = entities_to_remove.first; n != 0; n = n->next) + for(RD_CfgNode *n = cfgs_to_remove.first; n != 0; n = n->next) { - rd_entity_mark_for_deletion(n->entity); + rd_cfg_release(n->v); } if(next_cursor_set) { @@ -2318,6 +2319,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect) #endif // rjf: map selection endpoints to entities +#if 0 // TODO(rjf): @cfg RD_Entity *first_entity = &rd_nil_entity; RD_Entity *last_entity = &rd_nil_entity; if(collection_entity_kind != RD_EntityKind_Nil) @@ -2360,6 +2362,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect) rd_entity_change_parent(last_entity_next, last_entity_next->parent, last_entity_next->parent, first_entity_prev); } } +#endif } }