From 573bad848744ba77f4ff22d25ae8aa5a20e4ec08 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 13 Sep 2024 11:46:17 -0700 Subject: [PATCH] entity from d -> df --- src/dbg_engine/dbg_engine.mdesk | 103 - src/dbg_engine/dbg_engine_core.c | 1781 +------------- src/dbg_engine/dbg_engine_core.h | 486 +--- src/dbg_engine/generated/dbg_engine.meta.c | 170 -- src/dbg_engine/generated/dbg_engine.meta.h | 40 - src/dbg_frontend/dbg_frontend.mdesk | 103 + src/dbg_frontend/dbg_frontend_core.c | 2056 +++++++++++++++-- src/dbg_frontend/dbg_frontend_core.h | 339 +++ src/dbg_frontend/dbg_frontend_views.c | 294 +-- src/dbg_frontend/dbg_frontend_widgets.c | 98 +- src/dbg_frontend/dbg_frontend_widgets.h | 4 +- .../generated/dbg_frontend.meta.c | 170 ++ .../generated/dbg_frontend.meta.h | 40 + src/raddbg/raddbg_main.c | 16 +- 14 files changed, 2782 insertions(+), 2918 deletions(-) diff --git a/src/dbg_engine/dbg_engine.mdesk b/src/dbg_engine/dbg_engine.mdesk index cf78d06d..b6de5e21 100644 --- a/src/dbg_engine/dbg_engine.mdesk +++ b/src/dbg_engine/dbg_engine.mdesk @@ -24,109 +24,6 @@ D_CfgSrcTable: @expand(D_CfgSrcTable a) `str8_lit_comp("$(a.string)")`, } -//////////////////////////////// -//~ rjf: Entity Kind Tables - -@table(name name_lower name_lower_plural op_delete op_freeze op_edit op_rename op_enable op_cond op_dup name_is_code name_is_path user_lifetime is_serialized name_label icon_kind display_string) -// | | -// | _____________________________________________________________________________________________________________________________________/ -// | / -// operations________ names lt sz -// /..................\ /...\ | | -// dl fz ed rn en cn dp nc np ul iz -DF_EntityKindTable: -{ - {Nil nil nils 0 0 0 0 0 0 0 0 0 0 0 "Label" Null "Nil" } - {Root root roots 0 0 0 0 0 0 0 0 0 0 0 "Label" Null "Root" } - - //- rjf: machines - {Machine machine machines 0 1 0 1 0 0 0 0 0 0 0 "Label" Machine "Machine" } - - //- rjf: filesystem modeling - {File file files 0 0 0 0 0 0 0 0 0 0 0 "Label" FileOutline "File" } - - //- rjf: auto view rules - {AutoViewRule auto_view_rule auto_view_rules 0 0 0 0 0 0 0 0 0 1 1 "Label" Binoculars "Auto View Rule" } - - //- rjf: file path maps - {FilePathMap file_path_map file_path_maps 0 0 0 0 0 0 0 0 0 0 1 "Label" FileOutline "File Path Map" } - - //- rjf: watch pins - {WatchPin watch_pin watch_pins 1 0 0 1 0 0 1 1 0 1 1 "Expression" Pin "Watch Pin" } - - //- rjf: watches - {Watch watch watches 1 0 0 1 1 0 1 1 0 1 1 "Expression" Binoculars "Watch" } - {ViewRule view_rule view_rules 1 0 0 1 1 0 1 1 0 1 0 "Expression" Binoculars "View Rule" } - - //- rjf: breakpoints - {Breakpoint breakpoint breakpoints 1 0 0 1 1 1 1 0 0 1 1 "Label" CircleFilled "Breakpoint" } - {Condition condition conditions 0 0 0 0 0 0 0 1 0 1 0 "Expression" CircleFilled "Condition" } - - //- rjf: user-controlled locations (source, addresses, symbol names) - {Location location locations 0 0 0 0 0 0 0 1 1 1 0 "Location" Null "Location" } - - //- rjf: targets - {Target target targets 1 0 1 1 1 0 1 0 0 1 1 "Label" Target "Target" } - {Executable executable executables 0 0 0 0 0 0 0 0 1 1 0 "Executable" Null "Executable" } - {Arguments arguments argumentses 0 0 0 0 0 0 0 0 0 1 0 "Arguments" Null "Arguments" } - {WorkingDirectory working_directory working_directories 0 0 0 0 0 0 0 0 1 1 0 "Execution Path" Null "Working Directory" } - {EntryPoint entry_point entry_points 0 0 0 0 0 0 0 0 0 1 0 "Symbol Name" Null "Entry Point" } - - //- rjf: frontend containers (windows, panels, views) - {Window window windows 1 0 0 0 0 0 1 0 0 1 1 "Label" Window "Window" } - {Panel panel panels 1 0 0 0 0 0 1 0 0 1 1 "Label" XSplit "Panel" } - {View view views 1 0 0 0 0 0 1 0 0 1 1 "Label" Null "View" } - - //- rjf: recent projects - {RecentProject recent_project recent_projects 0 0 0 0 0 0 0 0 1 0 1 "Path" Briefcase "Recent Project" } - - //- rjf: src -> dst mapping - {Source source sources 0 0 0 0 0 0 0 0 0 0 0 "Path" Null "Source" } - {Dest dest dests 0 0 0 0 0 0 0 0 0 0 0 "Path" Null "Destination" } - - //- rjf: control system entities - {Process process processes 0 1 0 1 0 0 0 0 0 0 0 "Label" Threads "Process" } - {Thread thread threads 0 1 0 1 0 0 0 0 0 0 0 "Label" Thread "Thread" } - {Module module modules 0 0 0 0 0 0 0 0 0 0 0 "Label" Module "Module" } - {PendingThreadName pending_thread_name pending_thread_names 0 0 0 0 0 0 0 0 0 0 0 "Label" Threads "Pending Thread Name" } - {DebugInfoPath debug_info_path debug_info_paths 0 0 0 0 0 0 0 0 0 0 0 "Label" Module "Debug Info Path" } - - //- rjf: parser task entities - {ConversionTask conversion_task conversion_tasks 0 0 0 1 0 0 0 0 0 0 0 "Label" Null "Conversion Task" } - {ConversionFail conversion_fail conversion_fails 0 0 0 1 0 0 0 0 0 0 0 "Label" Null "Conversion Failure" } -} - -@enum DF_EntityKind: -{ - @expand(DF_EntityKindTable a) `$(a.name)`, - COUNT, -} - -@data(String8) d_entity_kind_display_string_table: -{ - @expand(DF_EntityKindTable a) `str8_lit_comp("$(a.display_string)")`, -} - -@data(String8) d_entity_kind_name_lower_table: -{ - @expand(DF_EntityKindTable a) `str8_lit_comp("$(a.name_lower)")`, -} - -@data(String8) d_entity_kind_name_lower_plural_table: -{ - @expand(DF_EntityKindTable a) `str8_lit_comp("$(a.name_lower_plural)")`, -} - -@data(String8) d_entity_kind_name_label_table: -{ - @expand(DF_EntityKindTable a) `str8_lit_comp("$(a.name_label)")`, -} - -@data(DF_EntityKindFlags) d_entity_kind_flags_table: -{ - @expand(DF_EntityKindTable a) `($(a.op_delete)*DF_EntityKindFlag_CanDelete) | ($(a.op_freeze)*DF_EntityKindFlag_CanFreeze) | ($(a.op_edit)*DF_EntityKindFlag_CanEdit) | ($(a.op_rename)*DF_EntityKindFlag_CanRename) | ($(a.op_enable)*DF_EntityKindFlag_CanEnable) | ($(a.op_cond)*DF_EntityKindFlag_CanCondition) | ($(a.op_dup)*DF_EntityKindFlag_CanDuplicate) | ($(a.name_is_code)*DF_EntityKindFlag_NameIsCode) | ($(a.name_is_path)*DF_EntityKindFlag_NameIsPath) | ($(a.user_lifetime)*DF_EntityKindFlag_UserDefinedLifetime) | ($(a.is_serialized)*DF_EntityKindFlag_IsSerializedToConfig)`, -} - //////////////////////////////// //~ rjf: Built-In Command Tables diff --git a/src/dbg_engine/dbg_engine_core.c b/src/dbg_engine/dbg_engine_core.c index f7e60235..7735d892 100644 --- a/src/dbg_engine/dbg_engine_core.c +++ b/src/dbg_engine/dbg_engine_core.c @@ -337,467 +337,6 @@ d_cmd_list_push_new(Arena *arena, D_CmdList *cmds, D_CmdKind kind, D_CmdParams * cmds->count += 1; } -//////////////////////////////// -//~ rjf: Entity Functions - -//- rjf: nil - -internal B32 -d_entity_is_nil(DF_Entity *entity) -{ - return (entity == 0 || entity == &d_nil_entity); -} - -//- rjf: handle <-> entity conversions - -internal U64 -d_index_from_entity(DF_Entity *entity) -{ - return (U64)(entity - d_state->entities_base); -} - -internal D_Handle -d_handle_from_entity(DF_Entity *entity) -{ - D_Handle handle = d_handle_zero(); - if(!d_entity_is_nil(entity)) - { - handle.u64[0] = d_index_from_entity(entity); - handle.u64[1] = entity->gen; - } - return handle; -} - -internal DF_Entity * -d_entity_from_handle(D_Handle handle) -{ - DF_Entity *result = d_state->entities_base + handle.u64[0]; - if(handle.u64[0] >= d_state->entities_count || result->gen != handle.u64[1]) - { - result = &d_nil_entity; - } - return result; -} - -internal D_EntityList -d_entity_list_from_handle_list(Arena *arena, D_HandleList handles) -{ - D_EntityList result = {0}; - for(D_HandleNode *n = handles.first; n != 0; n = n->next) - { - DF_Entity *entity = d_entity_from_handle(n->handle); - if(!d_entity_is_nil(entity)) - { - d_entity_list_push(arena, &result, entity); - } - } - return result; -} - -internal D_HandleList -d_handle_list_from_entity_list(Arena *arena, D_EntityList entities) -{ - D_HandleList result = {0}; - for(D_EntityNode *n = entities.first; n != 0; n = n->next) - { - D_Handle handle = d_handle_from_entity(n->entity); - d_handle_list_push(arena, &result, handle); - } - return result; -} - -//- rjf: entity recursion iterators - -internal D_EntityRec -d_entity_rec_depth_first(DF_Entity *entity, DF_Entity *subtree_root, U64 sib_off, U64 child_off) -{ - D_EntityRec result = {0}; - if(!d_entity_is_nil(*MemberFromOffset(DF_Entity **, entity, child_off))) - { - result.next = *MemberFromOffset(DF_Entity **, entity, child_off); - result.push_count = 1; - } - else for(DF_Entity *parent = entity; parent != subtree_root && !d_entity_is_nil(parent); parent = parent->parent) - { - if(parent != subtree_root && !d_entity_is_nil(*MemberFromOffset(DF_Entity **, parent, sib_off))) - { - result.next = *MemberFromOffset(DF_Entity **, parent, sib_off); - break; - } - result.pop_count += 1; - } - return result; -} - -//- rjf: ancestor/child introspection - -internal DF_Entity * -d_entity_child_from_kind(DF_Entity *entity, DF_EntityKind kind) -{ - DF_Entity *result = &d_nil_entity; - for(DF_Entity *child = entity->first; !d_entity_is_nil(child); child = child->next) - { - if(child->kind == kind) - { - result = child; - break; - } - } - return result; -} - -internal DF_Entity * -d_entity_ancestor_from_kind(DF_Entity *entity, DF_EntityKind kind) -{ - DF_Entity *result = &d_nil_entity; - for(DF_Entity *p = entity->parent; !d_entity_is_nil(p); p = p->parent) - { - if(p->kind == kind) - { - result = p; - break; - } - } - return result; -} - -internal D_EntityList -d_push_entity_child_list_with_kind(Arena *arena, DF_Entity *entity, DF_EntityKind kind) -{ - D_EntityList result = {0}; - for(DF_Entity *child = entity->first; !d_entity_is_nil(child); child = child->next) - { - if(child->kind == kind) - { - d_entity_list_push(arena, &result, child); - } - } - return result; -} - -internal DF_Entity * -d_entity_child_from_string_and_kind(DF_Entity *parent, String8 string, DF_EntityKind kind) -{ - DF_Entity *result = &d_nil_entity; - for(DF_Entity *child = parent->first; !d_entity_is_nil(child); child = child->next) - { - if(str8_match(child->string, string, 0) && child->kind == kind) - { - result = child; - break; - } - } - return result; -} - -//- rjf: entity list building - -internal void -d_entity_list_push(Arena *arena, D_EntityList *list, DF_Entity *entity) -{ - D_EntityNode *n = push_array(arena, D_EntityNode, 1); - n->entity = entity; - SLLQueuePush(list->first, list->last, n); - list->count += 1; -} - -internal D_EntityArray -d_entity_array_from_list(Arena *arena, D_EntityList *list) -{ - D_EntityArray result = {0}; - result.count = list->count; - result.v = push_array(arena, DF_Entity *, result.count); - U64 idx = 0; - for(D_EntityNode *n = list->first; n != 0; n = n->next, idx += 1) - { - result.v[idx] = n->entity; - } - return result; -} - -//- rjf: entity fuzzy list building - -internal D_EntityFuzzyItemArray -d_entity_fuzzy_item_array_from_entity_list_needle(Arena *arena, D_EntityList *list, String8 needle) -{ - Temp scratch = scratch_begin(&arena, 1); - D_EntityArray array = d_entity_array_from_list(scratch.arena, list); - D_EntityFuzzyItemArray result = d_entity_fuzzy_item_array_from_entity_array_needle(arena, &array, needle); - return result; -} - -internal D_EntityFuzzyItemArray -d_entity_fuzzy_item_array_from_entity_array_needle(Arena *arena, D_EntityArray *array, String8 needle) -{ - Temp scratch = scratch_begin(&arena, 1); - D_EntityFuzzyItemArray result = {0}; - result.count = array->count; - result.v = push_array(arena, D_EntityFuzzyItem, result.count); - U64 result_idx = 0; - for(U64 src_idx = 0; src_idx < array->count; src_idx += 1) - { - DF_Entity *entity = array->v[src_idx]; - String8 display_string = d_display_string_from_entity(scratch.arena, entity); - FuzzyMatchRangeList matches = fuzzy_match_find(arena, needle, display_string); - if(matches.count >= matches.needle_part_count) - { - result.v[result_idx].entity = entity; - result.v[result_idx].matches = matches; - result_idx += 1; - } - else - { - String8 search_tags = d_search_tags_from_entity(scratch.arena, entity); - if(search_tags.size != 0) - { - FuzzyMatchRangeList tag_matches = fuzzy_match_find(scratch.arena, needle, search_tags); - if(tag_matches.count >= tag_matches.needle_part_count) - { - result.v[result_idx].entity = entity; - result.v[result_idx].matches = matches; - result_idx += 1; - } - } - } - } - result.count = result_idx; - scratch_end(scratch); - return result; -} - -//- rjf: full path building, from file/folder entities - -internal String8 -d_full_path_from_entity(Arena *arena, DF_Entity *entity) -{ - String8 string = {0}; - { - Temp scratch = scratch_begin(&arena, 1); - String8List strs = {0}; - for(DF_Entity *e = entity; !d_entity_is_nil(e); e = e->parent) - { - if(e->kind == DF_EntityKind_File) - { - str8_list_push_front(scratch.arena, &strs, e->string); - } - } - StringJoin join = {0}; - join.sep = str8_lit("/"); - string = str8_list_join(arena, &strs, &join); - scratch_end(scratch); - } - return string; -} - -//- rjf: display string entities, for referencing entities in ui - -internal String8 -d_display_string_from_entity(Arena *arena, DF_Entity *entity) -{ - String8 result = {0}; - switch(entity->kind) - { - default: - { - if(entity->string.size != 0) - { - result = push_str8_copy(arena, entity->string); - } - else - { - String8 kind_string = d_entity_kind_display_string_table[entity->kind]; - result = push_str8f(arena, "%S $%I64u", kind_string, entity->id); - } - }break; - - case DF_EntityKind_Target: - { - if(entity->string.size != 0) - { - result = push_str8_copy(arena, entity->string); - } - else - { - DF_Entity *exe = d_entity_child_from_kind(entity, DF_EntityKind_Executable); - result = push_str8_copy(arena, exe->string); - } - }break; - - case DF_EntityKind_Breakpoint: - { - if(entity->string.size != 0) - { - result = push_str8_copy(arena, entity->string); - } - else - { - DF_Entity *loc = d_entity_child_from_kind(entity, DF_EntityKind_Location); - if(loc->flags & D_EntityFlag_HasTextPoint) - { - result = push_str8f(arena, "%S:%I64d:%I64d", str8_skip_last_slash(loc->string), loc->text_point.line, loc->text_point.column); - } - else if(loc->flags & D_EntityFlag_HasVAddr) - { - result = str8_from_u64(arena, loc->vaddr, 16, 16, 0); - } - else if(loc->string.size != 0) - { - result = push_str8_copy(arena, loc->string); - } - } - }break; - - case DF_EntityKind_Process: - { - DF_Entity *main_mod_child = d_entity_child_from_kind(entity, DF_EntityKind_Module); - String8 main_mod_name = str8_skip_last_slash(main_mod_child->string); - result = push_str8f(arena, "%S%s%sPID: %i%s", - main_mod_name, - main_mod_name.size != 0 ? " " : "", - main_mod_name.size != 0 ? "(" : "", - entity->ctrl_id, - main_mod_name.size != 0 ? ")" : ""); - }break; - - case DF_EntityKind_Thread: - { - String8 name = entity->string; - if(name.size == 0) - { - DF_Entity *process = d_entity_ancestor_from_kind(entity, DF_EntityKind_Process); - DF_Entity *first_thread = d_entity_child_from_kind(process, DF_EntityKind_Thread); - if(first_thread == entity) - { - name = str8_lit("Main Thread"); - } - } - result = push_str8f(arena, "%S%s%sTID: %i%s", - name, - name.size != 0 ? " " : "", - name.size != 0 ? "(" : "", - entity->ctrl_id, - name.size != 0 ? ")" : ""); - }break; - - case DF_EntityKind_Module: - { - result = push_str8_copy(arena, str8_skip_last_slash(entity->string)); - }break; - - case DF_EntityKind_RecentProject: - { - result = push_str8_copy(arena, str8_skip_last_slash(entity->string)); - }break; - } - return result; -} - -//- rjf: extra search tag strings for fuzzy filtering entities - -internal String8 -d_search_tags_from_entity(Arena *arena, DF_Entity *entity) -{ - String8 result = {0}; - if(entity->kind == DF_EntityKind_Thread) - { - Temp scratch = scratch_begin(&arena, 1); - CTRL_Entity *entity_ctrl = ctrl_entity_from_handle(d_state->ctrl_entity_store, entity->ctrl_handle); - CTRL_Entity *process = ctrl_entity_ancestor_from_kind(entity_ctrl, DF_EntityKind_Process); - CTRL_Unwind unwind = d_query_cached_unwind_from_thread(entity_ctrl); - String8List strings = {0}; - for(U64 frame_num = unwind.frames.count; frame_num > 0; frame_num -= 1) - { - CTRL_UnwindFrame *f = &unwind.frames.v[frame_num-1]; - U64 rip_vaddr = regs_rip_from_arch_block(entity->arch, f->regs); - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); - U64 rip_voff = ctrl_voff_from_vaddr(module, rip_vaddr); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); - String8 procedure_name = d_symbol_name_from_dbgi_key_voff(scratch.arena, &dbgi_key, rip_voff, 0); - if(procedure_name.size != 0) - { - str8_list_push(scratch.arena, &strings, procedure_name); - } - } - StringJoin join = {0}; - join.sep = str8_lit(","); - result = str8_list_join(arena, &strings, &join); - scratch_end(scratch); - } - return result; -} - -//- rjf: entity -> color operations - -internal Vec4F32 -d_hsva_from_entity(DF_Entity *entity) -{ - Vec4F32 result = {0}; - if(entity->flags & D_EntityFlag_HasColor) - { - result = entity->color_hsva; - } - return result; -} - -internal Vec4F32 -d_rgba_from_entity(DF_Entity *entity) -{ - Vec4F32 result = {0}; - if(entity->flags & D_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); - } - return result; -} - -//- rjf: entity -> expansion tree keys - -internal EV_Key -d_ev_key_from_entity(DF_Entity *entity) -{ - EV_Key parent_key = d_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 -d_parent_ev_key_from_entity(DF_Entity *entity) -{ - EV_Key parent_key = ev_key_make(5381, (U64)entity); - return parent_key; -} - -//- rjf: entity -> evaluation - -internal D_EntityEval * -d_eval_from_entity(Arena *arena, DF_Entity *entity) -{ - D_EntityEval *eval = push_array(arena, D_EntityEval, 1); - { - DF_Entity *loc = d_entity_child_from_kind(entity, DF_EntityKind_Location); - DF_Entity *cnd = d_entity_child_from_kind(entity, DF_EntityKind_Condition); - String8 label_string = push_str8_copy(arena, entity->string); - String8 loc_string = {0}; - if(loc->flags & D_EntityFlag_HasTextPoint) - { - loc_string = push_str8f(arena, "%S:%I64u:%I64u", loc->string, loc->text_point.line, loc->text_point.column); - } - else if(loc->flags & D_EntityFlag_HasVAddr) - { - loc_string = push_str8f(arena, "0x%I64x", loc->vaddr); - } - String8 cnd_string = push_str8_copy(arena, cnd->string); - eval->enabled = !entity->disabled; - eval->hit_count = entity->u64; - eval->label_off = (U64)((U8 *)label_string.str - (U8 *)eval); - eval->location_off = (U64)((U8 *)loc_string.str - (U8 *)eval); - eval->condition_off= (U64)((U8 *)cnd_string.str - (U8 *)eval); - } - return eval; -} - //////////////////////////////// //~ rjf: Name Allocation @@ -906,509 +445,6 @@ d_name_release(String8 string) SLLStackPush(d_state->free_name_chunks[bucket_idx], node); } -//////////////////////////////// -//~ rjf: Entity State Functions - -//- rjf: entity allocation + tree forming - -internal DF_Entity * -d_entity_alloc(DF_Entity *parent, DF_EntityKind kind) -{ - B32 user_defined_lifetime = !!(d_entity_kind_flags_table[kind] & DF_EntityKindFlag_UserDefinedLifetime); - U64 free_list_idx = !!user_defined_lifetime; - if(d_entity_is_nil(parent)) { parent = d_state->entities_root; } - - // rjf: empty free list -> push new - if(!d_state->entities_free[free_list_idx]) - { - DF_Entity *entity = push_array(d_state->entities_arena, DF_Entity, 1); - d_state->entities_count += 1; - d_state->entities_free_count += 1; - SLLStackPush(d_state->entities_free[free_list_idx], entity); - } - - // rjf: pop new entity off free-list - DF_Entity *entity = d_state->entities_free[free_list_idx]; - SLLStackPop(d_state->entities_free[free_list_idx]); - d_state->entities_free_count -= 1; - d_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 = &d_nil_entity; - entity->parent = parent; - - // rjf: stitch up parent links - if(d_entity_is_nil(parent)) - { - d_state->entities_root = entity; - } - else - { - DLLPushBack_NPZ(&d_nil_entity, parent->first, parent->last, entity, next, prev); - } - - // rjf: fill out metadata - entity->kind = kind; - d_state->entities_id_gen += 1; - entity->id = d_state->entities_id_gen; - entity->gen += 1; - entity->alloc_time_us = os_now_microseconds(); - entity->params_root = &md_nil_node; - - // rjf: initialize to deleted, record history, then "undelete" if this allocation can be undone - if(user_defined_lifetime) - { - // TODO(rjf) - } - - // rjf: dirtify caches - d_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 -d_entity_mark_for_deletion(DF_Entity *entity) -{ - if(!d_entity_is_nil(entity)) - { - entity->flags |= D_EntityFlag_MarkedForDeletion; - } -} - -internal void -d_entity_release(DF_Entity *entity) -{ - Temp scratch = scratch_begin(0, 0); - - // rjf: unpack - U64 free_list_idx = !!(d_entity_kind_flags_table[entity->kind] & DF_EntityKindFlag_UserDefinedLifetime); - - // rjf: release whole tree - typedef struct Task Task; - struct Task - { - Task *next; - DF_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(DF_Entity *child = task->e->first; !d_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") - { - String8 name = d_display_string_from_entity(scratch.arena, task->e); - log_infof("kind: \"%S\"\n", d_entity_kind_display_string_table[task->e->kind]); - log_infof("id: $0x%I64x\n", task->e->id); - log_infof("display_string: \"%S\"\n", name); - } - SLLStackPush(d_state->entities_free[free_list_idx], task->e); - d_state->entities_free_count += 1; - d_state->entities_active_count -= 1; - task->e->gen += 1; - if(task->e->string.size != 0) - { - d_name_release(task->e->string); - } - if(task->e->params_arena != 0) - { - arena_release(task->e->params_arena); - } - d_state->kind_alloc_gens[task->e->kind] += 1; - } - - scratch_end(scratch); -} - -internal void -d_entity_change_parent(DF_Entity *entity, DF_Entity *old_parent, DF_Entity *new_parent, DF_Entity *prev_child) -{ - Assert(entity->parent == old_parent); - Assert(prev_child->parent == old_parent || d_entity_is_nil(prev_child)); - - // rjf: fix up links - if(!d_entity_is_nil(old_parent)) - { - DLLRemove_NPZ(&d_nil_entity, old_parent->first, old_parent->last, entity, next, prev); - } - if(!d_entity_is_nil(new_parent)) - { - DLLInsert_NPZ(&d_nil_entity, new_parent->first, new_parent->last, prev_child, entity, next, prev); - } - entity->parent = new_parent; - - // rjf: notify - d_state->kind_alloc_gens[entity->kind] += 1; -} - -//- rjf: entity simple equipment - -internal void -d_entity_equip_txt_pt(DF_Entity *entity, TxtPt point) -{ - d_require_entity_nonnil(entity, return); - entity->text_point = point; - entity->flags |= D_EntityFlag_HasTextPoint; -} - -internal void -d_entity_equip_entity_handle(DF_Entity *entity, D_Handle handle) -{ - d_require_entity_nonnil(entity, return); - entity->entity_handle = handle; - entity->flags |= D_EntityFlag_HasEntityHandle; -} - -internal void -d_entity_equip_disabled(DF_Entity *entity, B32 value) -{ - d_require_entity_nonnil(entity, return); - entity->disabled = value; -} - -internal void -d_entity_equip_u64(DF_Entity *entity, U64 u64) -{ - d_require_entity_nonnil(entity, return); - entity->u64 = u64; - entity->flags |= D_EntityFlag_HasU64; -} - -internal void -d_entity_equip_color_rgba(DF_Entity *entity, Vec4F32 rgba) -{ - d_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); - d_entity_equip_color_hsva(entity, hsva); -} - -internal void -d_entity_equip_color_hsva(DF_Entity *entity, Vec4F32 hsva) -{ - d_require_entity_nonnil(entity, return); - entity->color_hsva = hsva; - entity->flags |= D_EntityFlag_HasColor; -} - -internal void -d_entity_equip_cfg_src(DF_Entity *entity, D_CfgSrc cfg_src) -{ - d_require_entity_nonnil(entity, return); - entity->cfg_src = cfg_src; -} - -internal void -d_entity_equip_timestamp(DF_Entity *entity, U64 timestamp) -{ - d_require_entity_nonnil(entity, return); - entity->timestamp = timestamp; -} - -//- rjf: control layer correllation equipment - -internal void -d_entity_equip_ctrl_handle(DF_Entity *entity, CTRL_Handle handle) -{ - d_require_entity_nonnil(entity, return); - entity->ctrl_handle = handle; - entity->flags |= D_EntityFlag_HasCtrlHandle; -} - -internal void -d_entity_equip_arch(DF_Entity *entity, Arch arch) -{ - d_require_entity_nonnil(entity, return); - entity->arch = arch; - entity->flags |= D_EntityFlag_HasArch; -} - -internal void -d_entity_equip_ctrl_id(DF_Entity *entity, U32 id) -{ - d_require_entity_nonnil(entity, return); - entity->ctrl_id = id; - entity->flags |= D_EntityFlag_HasCtrlID; -} - -internal void -d_entity_equip_stack_base(DF_Entity *entity, U64 stack_base) -{ - d_require_entity_nonnil(entity, return); - entity->stack_base = stack_base; - entity->flags |= D_EntityFlag_HasStackBase; -} - -internal void -d_entity_equip_vaddr_rng(DF_Entity *entity, Rng1U64 range) -{ - d_require_entity_nonnil(entity, return); - entity->vaddr_rng = range; - entity->flags |= D_EntityFlag_HasVAddrRng; -} - -internal void -d_entity_equip_vaddr(DF_Entity *entity, U64 vaddr) -{ - d_require_entity_nonnil(entity, return); - entity->vaddr = vaddr; - entity->flags |= D_EntityFlag_HasVAddr; -} - -//- rjf: name equipment - -internal void -d_entity_equip_name(DF_Entity *entity, String8 name) -{ - d_require_entity_nonnil(entity, return); - if(entity->string.size != 0) - { - d_name_release(entity->string); - } - if(name.size != 0) - { - entity->string = d_name_alloc(name); - } - else - { - entity->string = str8_zero(); - } -} - -internal void -d_entity_equip_namef(DF_Entity *entity, char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - va_end(args); - d_entity_equip_name(entity, string); - scratch_end(scratch); -} - -//- rjf: file path map override lookups - -internal String8List -d_possible_overrides_from_file_path(Arena *arena, String8 file_path) -{ - // NOTE(rjf): This path, given some target file path, scans all file path map - // overrides, and collects the set of file paths which could've redirected - // to the target file path given the set of file path maps. - // - // For example, if I have a rule saying D:/devel/ maps to C:/devel/, and I - // feed in C:/devel/foo/bar.txt, then this path will construct - // D:/devel/foo/bar.txt, as a possible option. - // - // It will also preserve C:/devel/foo/bar.txt in the resultant list, so that - // overrideless files still work through this path, and both redirected - // files and non-redirected files can go through the same path. - // - String8List result = {0}; - str8_list_push(arena, &result, file_path); - Temp scratch = scratch_begin(&arena, 1); - PathStyle pth_style = PathStyle_Relative; - String8List pth_parts = path_normalized_list_from_string(scratch.arena, file_path, &pth_style); - { - D_EntityList links = d_query_cached_entity_list_with_kind(DF_EntityKind_FilePathMap); - for(D_EntityNode *n = links.first; n != 0; n = n->next) - { - //- rjf: unpack link - DF_Entity *link = n->entity; - DF_Entity *src = d_entity_child_from_kind(link, DF_EntityKind_Source); - DF_Entity *dst = d_entity_child_from_kind(link, DF_EntityKind_Dest); - PathStyle src_style = PathStyle_Relative; - PathStyle dst_style = PathStyle_Relative; - String8List src_parts = path_normalized_list_from_string(scratch.arena, src->string, &src_style); - String8List dst_parts = path_normalized_list_from_string(scratch.arena, dst->string, &dst_style); - - //- rjf: determine if this link can possibly redirect to the target file path - B32 dst_redirects_to_pth = 0; - String8Node *non_redirected_pth_first = 0; - if(dst_style == pth_style && dst_parts.first != 0 && pth_parts.first != 0) - { - dst_redirects_to_pth = 1; - String8Node *dst_n = dst_parts.first; - String8Node *pth_n = pth_parts.first; - for(;dst_n != 0 && pth_n != 0; dst_n = dst_n->next, pth_n = pth_n->next) - { - if(!str8_match(dst_n->string, pth_n->string, StringMatchFlag_CaseInsensitive)) - { - dst_redirects_to_pth = 0; - break; - } - non_redirected_pth_first = pth_n->next; - } - } - - //- rjf: if this link can redirect to this path via `src` -> `dst`, compute - // possible full source path, by taking `src` and appending non-redirected - // suffix (which did not show up in `dst`) - if(dst_redirects_to_pth) - { - String8List candidate_parts = src_parts; - for(String8Node *p = non_redirected_pth_first; p != 0; p = p->next) - { - str8_list_push(scratch.arena, &candidate_parts, p->string); - } - StringJoin join = {0}; - join.sep = str8_lit("/"); - String8 candidate_path = str8_list_join(arena, &candidate_parts, 0); - str8_list_push(arena, &result, candidate_path); - } - } - } - scratch_end(scratch); - return result; -} - -//- rjf: top-level state queries - -internal DF_Entity * -d_entity_root(void) -{ - return d_state->entities_root; -} - -internal D_EntityList -d_push_entity_list_with_kind(Arena *arena, DF_EntityKind kind) -{ - ProfBeginFunction(); - D_EntityList result = {0}; - for(DF_Entity *entity = d_state->entities_root; - !d_entity_is_nil(entity); - entity = d_entity_rec_depth_first_pre(entity, &d_nil_entity).next) - { - if(entity->kind == kind) - { - d_entity_list_push(arena, &result, entity); - } - } - ProfEnd(); - return result; -} - -internal DF_Entity * -d_entity_from_id(DF_EntityID id) -{ - DF_Entity *result = &d_nil_entity; - for(DF_Entity *e = d_entity_root(); - !d_entity_is_nil(e); - e = d_entity_rec_depth_first_pre(e, &d_nil_entity).next) - { - if(e->id == id) - { - result = e; - break; - } - } - return result; -} - -internal DF_Entity * -d_machine_entity_from_machine_id(CTRL_MachineID machine_id) -{ - DF_Entity *result = &d_nil_entity; - for(DF_Entity *e = d_entity_root(); - !d_entity_is_nil(e); - e = d_entity_rec_depth_first_pre(e, &d_nil_entity).next) - { - if(e->kind == DF_EntityKind_Machine && e->ctrl_handle.machine_id == machine_id) - { - result = e; - break; - } - } - if(d_entity_is_nil(result)) - { - result = d_entity_alloc(d_entity_root(), DF_EntityKind_Machine); - d_entity_equip_ctrl_handle(result, ctrl_handle_make(machine_id, dmn_handle_zero())); - } - return result; -} - -internal DF_Entity * -d_entity_from_ctrl_handle(CTRL_Handle handle) -{ - DF_Entity *result = &d_nil_entity; - if(handle.machine_id != 0 || handle.dmn_handle.u64[0] != 0) - { - for(DF_Entity *e = d_entity_root(); - !d_entity_is_nil(e); - e = d_entity_rec_depth_first_pre(e, &d_nil_entity).next) - { - if(e->flags & D_EntityFlag_HasCtrlHandle && - ctrl_handle_match(e->ctrl_handle, handle)) - { - result = e; - break; - } - } - } - return result; -} - -internal DF_Entity * -d_entity_from_ctrl_id(CTRL_MachineID machine_id, U32 id) -{ - DF_Entity *result = &d_nil_entity; - if(id != 0) - { - for(DF_Entity *e = d_entity_root(); - !d_entity_is_nil(e); - e = d_entity_rec_depth_first_pre(e, &d_nil_entity).next) - { - if(e->flags & D_EntityFlag_HasCtrlHandle && - e->flags & D_EntityFlag_HasCtrlID && - e->ctrl_handle.machine_id == machine_id && - e->ctrl_id == id) - { - result = e; - break; - } - } - } - return result; -} - -internal DF_Entity * -d_entity_from_name_and_kind(String8 string, DF_EntityKind kind) -{ - DF_Entity *result = &d_nil_entity; - D_EntityList all_of_this_kind = d_query_cached_entity_list_with_kind(kind); - for(D_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: View Rule Spec Stateful Functions @@ -2423,531 +1459,6 @@ d_ctrl_last_stop_event(void) return d_state->ctrl_last_stop_event; } -//////////////////////////////// -//~ rjf: Evaluation Context - -//- rjf: ctrl entity <-> eval space - -internal CTRL_Entity * -d_ctrl_entity_from_eval_space(E_Space space) -{ - CTRL_Entity *entity = &ctrl_entity_nil; - // TODO(rjf): @msgs - return entity; -} - -internal E_Space -d_eval_space_from_ctrl_entity(CTRL_Entity *entity) -{ - E_Space space = {0}; - // TODO(rjf): @msgs - return space; -} - -//- rjf: entity <-> eval space - -internal DF_Entity * -d_entity_from_eval_space(E_Space space) -{ - DF_Entity *entity = &d_nil_entity; - if(space.u64_0 != 0) - { - entity = (DF_Entity *)space.u64_0; - } - return entity; -} - -internal E_Space -d_eval_space_from_entity(DF_Entity *entity) -{ - E_Space space = {0}; - space.u64_0 = (U64)entity; - return space; -} - -//- rjf: eval space reads/writes - -internal B32 -d_eval_space_read(void *u, E_Space space, void *out, Rng1U64 range) -{ - B32 result = 0; - switch(space.kind) - { - case E_SpaceKind_FileSystem: - { - - }break; - case DF_EvalSpaceKind_CtrlEntity: - { - - }break; - case DF_EvalSpaceKind_CfgEntity: - { - - }break; - } - -#if 0 // TODO(rjf): @msgs - DF_Entity *entity = d_entity_from_eval_space(space); - switch(entity->kind) - { - //- rjf: nil-space -> fall back to file system - case DF_EntityKind_Nil: - { - U128 key = space.u128; - U128 hash = hs_hash_from_key(key, 0); - HS_Scope *scope = hs_scope_open(); - { - String8 data = hs_data_from_hash(scope, hash); - Rng1U64 legal_range = r1u64(0, data.size); - Rng1U64 read_range = intersect_1u64(range, legal_range); - if(read_range.min < read_range.max) - { - result = 1; - MemoryCopy(out, data.str + read_range.min, dim_1u64(read_range)); - } - } - hs_scope_close(scope); - }break; - - //- rjf: default -> evaluating a debugger entity; read from entity POD evaluation - default: - { - Temp scratch = scratch_begin(0, 0); - arena_push(scratch.arena, 0, 64); - U64 pos_min = arena_pos(scratch.arena); - D_EntityEval *eval = d_eval_from_entity(scratch.arena, entity); - U64 pos_opl = arena_pos(scratch.arena); - Rng1U64 legal_range = r1u64(0, pos_opl-pos_min); - if(contains_1u64(legal_range, range.min)) - { - result = 1; - U64 range_dim = dim_1u64(range); - U64 bytes_to_read = Min(range_dim, (legal_range.max - range.min)); - MemoryCopy(out, ((U8 *)eval) + range.min, bytes_to_read); - if(bytes_to_read < range_dim) - { - MemoryZero((U8 *)out + bytes_to_read, range_dim - bytes_to_read); - } - } - scratch_end(scratch); - }break; - - //- rjf: process -> reading process memory - case DF_EntityKind_Process: - { - Temp scratch = scratch_begin(0, 0); - CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, entity->ctrl_handle, range, d_state->frame_eval_memread_endt_us); - String8 data = slice.data; - if(data.size == dim_1u64(range)) - { - result = 1; - MemoryCopy(out, data.str, data.size); - } - scratch_end(scratch); - }break; - - //- rjf: thread -> reading from thread register block - case DF_EntityKind_Thread: - { - Temp scratch = scratch_begin(0, 0); - CTRL_Unwind unwind = d_query_cached_unwind_from_thread(entity); - U64 frame_idx = e_interpret_ctx->reg_unwind_count; - if(frame_idx < unwind.frames.count) - { - CTRL_UnwindFrame *f = &unwind.frames.v[frame_idx]; - U64 regs_size = regs_block_size_from_arch(e_interpret_ctx->reg_arch); - Rng1U64 legal_range = r1u64(0, regs_size); - Rng1U64 read_range = intersect_1u64(legal_range, range); - U64 read_size = dim_1u64(read_range); - MemoryCopy(out, (U8 *)f->regs + read_range.min, read_size); - result = (read_size == dim_1u64(range)); - } - scratch_end(scratch); - }break; - } -#endif - return result; -} - -internal B32 -d_eval_space_write(void *u, E_Space space, void *in, Rng1U64 range) -{ - B32 result = 0; -#if 0 // TODO(rjf): @msgs - DF_Entity *entity = d_entity_from_eval_space(space); - switch(entity->kind) - { - //- rjf: default -> making commits to entity evaluation - default: - { - Temp scratch = scratch_begin(0, 0); - D_EntityEval *eval = d_eval_from_entity(scratch.arena, entity); - U64 range_dim = dim_1u64(range); - if(range.min == OffsetOf(D_EntityEval, enabled) && - range_dim >= 1) - { - result = 1; - B32 new_enabled = !!((U8 *)in)[0]; - d_entity_equip_disabled(entity, !new_enabled); - } - else if(range.min == eval->label_off && - range_dim >= 1) - { - result = 1; - String8 new_name = str8_cstring_capped((U8 *)in, (U8 *)in+range_dim); - d_entity_equip_name(entity, new_name); - } - else if(range.min == eval->condition_off && - range_dim >= 1) - { - result = 1; - DF_Entity *condition = d_entity_child_from_kind(entity, DF_EntityKind_Condition); - if(d_entity_is_nil(condition)) - { - condition = d_entity_alloc(entity, DF_EntityKind_Condition); - } - String8 new_name = str8_cstring_capped((U8 *)in, (U8 *)in+range_dim); - d_entity_equip_name(condition, new_name); - } - scratch_end(scratch); - }break; - - //- rjf: process -> commit to process memory - case DF_EntityKind_Process: - { - result = ctrl_process_write(entity->ctrl_handle, range, in); - }break; - - //- rjf: thread -> commit to thread's register block - case DF_EntityKind_Thread: - { - CTRL_Unwind unwind = d_query_cached_unwind_from_thread(entity); - U64 frame_idx = 0; - if(frame_idx < unwind.frames.count) - { - Temp scratch = scratch_begin(0, 0); - U64 regs_size = regs_block_size_from_arch(d_arch_from_entity(entity)); - Rng1U64 legal_range = r1u64(0, regs_size); - Rng1U64 write_range = intersect_1u64(legal_range, range); - U64 write_size = dim_1u64(write_range); - CTRL_UnwindFrame *f = &unwind.frames.v[frame_idx]; - void *new_regs = push_array(scratch.arena, U8, regs_size); - MemoryCopy(new_regs, f->regs, regs_size); - MemoryCopy((U8 *)new_regs + write_range.min, in, write_size); - result = ctrl_thread_write_reg_block(entity->ctrl_handle, new_regs); - scratch_end(scratch); - } - }break; - } -#endif - return result; -} - -//- rjf: asynchronous streamed reads -> hashes from spaces - -internal U128 -d_key_from_eval_space_range(E_Space space, Rng1U64 range, B32 zero_terminated) -{ - U128 result = {0}; - DF_Entity *entity = d_entity_from_eval_space(space); - switch(entity->kind) - { - default:{}break; - - //- rjf: nil space -> filesystem key encoded inside of `space` - case DF_EntityKind_Nil: - { - result = space.u128; - }break; - - //- rjf: process space -> query - case DF_EntityKind_Process: - { - result = ctrl_hash_store_key_from_process_vaddr_range(entity->ctrl_handle, range, zero_terminated); - }break; - } - return result; -} - -//- rjf: space -> entire range - -internal Rng1U64 -d_whole_range_from_eval_space(E_Space space) -{ - // TODO(rjf): @msgs - Rng1U64 result = r1u64(0, 0); -#if 0 - DF_Entity *entity = d_entity_from_eval_space(space); - switch(entity->kind) - { - default:{}break; - - //- rjf: nil space -> filesystem key encoded inside of `space` - case DF_EntityKind_Nil: - { - HS_Scope *scope = hs_scope_open(); - U128 hash = {0}; - for(U64 idx = 0; idx < 2; idx += 1) - { - hash = hs_hash_from_key(space.u128, idx); - if(!u128_match(hash, u128_zero())) - { - break; - } - } - String8 data = hs_data_from_hash(scope, hash); - result = r1u64(0, data.size); - hs_scope_close(scope); - }break; - case DF_EntityKind_Process: - { - result = r1u64(0, 0x7FFFFFFFFFFFull); - }break; - } -#endif - return result; -} - -//////////////////////////////// -//~ rjf: Evaluation View Visualization & Interaction - -//- rjf: writing values back to child processes - -internal B32 -d_commit_eval_value_string(E_Eval dst_eval, String8 string) -{ - B32 result = 0; - if(dst_eval.mode == E_Mode_Offset) - { - Temp scratch = scratch_begin(0, 0); - E_TypeKey type_key = e_type_unwrap(dst_eval.type_key); - E_TypeKind type_kind = e_type_kind_from_key(type_key); - E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(dst_eval.type_key))); - E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key); - String8 commit_data = {0}; - B32 commit_at_ptr_dest = 0; - if(E_TypeKind_FirstBasic <= type_kind && type_kind <= E_TypeKind_LastBasic) - { - E_Eval src_eval = e_eval_from_string(scratch.arena, string); - commit_data = push_str8_copy(scratch.arena, str8_struct(&src_eval.value)); - commit_data.size = Min(commit_data.size, e_type_byte_size_from_key(type_key)); - } - else if(type_kind == E_TypeKind_Ptr || type_kind == E_TypeKind_Array) - { - E_Eval src_eval = e_eval_from_string(scratch.arena, string); - E_Eval src_eval_value = e_value_eval_from_eval(src_eval); - E_TypeKind src_eval_value_type_kind = e_type_kind_from_key(src_eval_value.type_key); - if(type_kind == E_TypeKind_Ptr && - (e_type_kind_is_pointer_or_ref(src_eval_value_type_kind) || - e_type_kind_is_integer(src_eval_value_type_kind)) && - src_eval_value.value.u64 != 0 && src_eval_value.mode == E_Mode_Value) - { - commit_data = push_str8_copy(scratch.arena, str8_struct(&src_eval.value)); - commit_data.size = Min(commit_data.size, e_type_byte_size_from_key(type_key)); - } - else if(direct_type_kind == E_TypeKind_Char8 || - direct_type_kind == E_TypeKind_UChar8 || - e_type_kind_is_integer(direct_type_kind)) - { - if(string.size >= 1 && string.str[0] == '"') - { - string = str8_skip(string, 1); - } - if(string.size >= 1 && string.str[string.size-1] == '"') - { - string = str8_chop(string, 1); - } - commit_data = e_raw_from_escaped_string(scratch.arena, string); - commit_data.size += 1; - if(type_kind == E_TypeKind_Ptr) - { - commit_at_ptr_dest = 1; - } - } - } - if(commit_data.size != 0 && e_type_byte_size_from_key(type_key) != 0) - { - U64 dst_offset = dst_eval.value.u64; - if(dst_eval.mode == E_Mode_Offset && commit_at_ptr_dest) - { - E_Eval dst_value_eval = e_value_eval_from_eval(dst_eval); - dst_offset = dst_value_eval.value.u64; - } - result = e_space_write(dst_eval.space, commit_data.str, r1u64(dst_offset, dst_offset + commit_data.size)); - } - scratch_end(scratch); - } - return result; -} - -//- rjf: view rule config tree info extraction - -internal U64 -d_base_offset_from_eval(E_Eval eval) -{ - if(e_type_kind_is_pointer_or_ref(e_type_kind_from_key(eval.type_key))) - { - eval = e_value_eval_from_eval(eval); - } - return eval.value.u64; -} - -internal E_Value -d_value_from_params_key(MD_Node *params, String8 key) -{ - Temp scratch = scratch_begin(0, 0); - MD_Node *key_node = md_child_from_string(params, key, 0); - String8 expr = md_string_from_children(scratch.arena, key_node); - E_Eval eval = e_eval_from_string(scratch.arena, expr); - E_Eval value_eval = e_value_eval_from_eval(eval); - scratch_end(scratch); - return value_eval.value; -} - -internal Rng1U64 -d_range_from_eval_params(E_Eval eval, MD_Node *params) -{ - Temp scratch = scratch_begin(0, 0); - U64 size = d_value_from_params_key(params, str8_lit("size")).u64; - E_TypeKey type_key = e_type_unwrap(eval.type_key); - E_TypeKind type_kind = e_type_kind_from_key(type_key); - E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(eval.type_key)); - E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key); - if(size == 0 && e_type_kind_is_pointer_or_ref(type_kind) && (direct_type_kind == E_TypeKind_Struct || - direct_type_kind == E_TypeKind_Union || - direct_type_kind == E_TypeKind_Class || - direct_type_kind == E_TypeKind_Array)) - { - size = e_type_byte_size_from_key(e_type_direct_from_key(e_type_unwrap(eval.type_key))); - } - if(size == 0 && eval.mode == E_Mode_Offset && (type_kind == E_TypeKind_Struct || - type_kind == E_TypeKind_Union || - type_kind == E_TypeKind_Class || - type_kind == E_TypeKind_Array)) - { - size = e_type_byte_size_from_key(e_type_unwrap(eval.type_key)); - } - if(size == 0) - { - size = 16384; - } - Rng1U64 result = {0}; - result.min = d_base_offset_from_eval(eval); - result.max = result.min + size; - scratch_end(scratch); - return result; -} - -internal TXT_LangKind -d_lang_kind_from_eval_params(E_Eval eval, MD_Node *params) -{ - TXT_LangKind lang_kind = TXT_LangKind_Null; - if(eval.expr->kind == E_ExprKind_LeafFilePath) - { - lang_kind = txt_lang_kind_from_extension(str8_skip_last_dot(eval.expr->string)); - } - else - { - MD_Node *lang_node = md_child_from_string(params, str8_lit("lang"), 0); - String8 lang_kind_string = lang_node->first->string; - lang_kind = txt_lang_kind_from_extension(lang_kind_string); - } - return lang_kind; -} - -internal Arch -d_arch_from_eval_params(E_Eval eval, MD_Node *params) -{ - Arch arch = Arch_Null; - MD_Node *arch_node = md_child_from_string(params, str8_lit("arch"), 0); - String8 arch_kind_string = arch_node->first->string; - if(str8_match(arch_kind_string, str8_lit("x64"), StringMatchFlag_CaseInsensitive)) - { - arch = Arch_x64; - } - return arch; -} - -internal Vec2S32 -d_dim2s32_from_eval_params(E_Eval eval, MD_Node *params) -{ - Vec2S32 dim = v2s32(1, 1); - { - dim.x = d_value_from_params_key(params, str8_lit("w")).s32; - dim.y = d_value_from_params_key(params, str8_lit("h")).s32; - } - return dim; -} - -internal R_Tex2DFormat -d_tex2dformat_from_eval_params(E_Eval eval, MD_Node *params) -{ - R_Tex2DFormat result = R_Tex2DFormat_RGBA8; - { - MD_Node *fmt_node = md_child_from_string(params, str8_lit("fmt"), 0); - for(EachNonZeroEnumVal(R_Tex2DFormat, fmt)) - { - if(str8_match(r_tex2d_format_display_string_table[fmt], fmt_node->first->string, StringMatchFlag_CaseInsensitive)) - { - result = fmt; - break; - } - } - } - return result; -} - -//- rjf: eval -> entity - -internal DF_Entity * -d_entity_from_eval_string(String8 string) -{ - DF_Entity *entity = &d_nil_entity; - { - Temp scratch = scratch_begin(0, 0); - E_Eval eval = e_eval_from_string(scratch.arena, string); - entity = d_entity_from_eval_space(eval.space); - scratch_end(scratch); - } - return entity; -} - -internal String8 -d_eval_string_from_entity(Arena *arena, DF_Entity *entity) -{ - String8 eval_string = push_str8f(arena, "macro:`$%I64u`", entity->id); - return eval_string; -} - -//- rjf: eval <-> file path - -internal String8 -d_file_path_from_eval_string(Arena *arena, String8 string) -{ - String8 result = {0}; - { - Temp scratch = scratch_begin(&arena, 1); - E_Eval eval = e_eval_from_string(scratch.arena, string); - if(eval.expr->kind == E_ExprKind_LeafFilePath) - { - result = d_cfg_raw_from_escaped_string(arena, eval.expr->string); - } - scratch_end(scratch); - } - return result; -} - -internal String8 -d_eval_string_from_file_path(Arena *arena, String8 string) -{ - Temp scratch = scratch_begin(&arena, 1); - String8 string_escaped = d_cfg_escaped_from_raw_string(scratch.arena, string); - String8 result = push_str8f(arena, "file:\"%S\"", string_escaped); - scratch_end(scratch); - return result; -} - //////////////////////////////// //~ rjf: Main State Accessors/Mutators @@ -3065,8 +1576,8 @@ d_cfg_strings_from_core(Arena *arena, String8 root_path, D_CfgSrc source) continue; } B32 first = 1; - D_EntityList entities = d_query_cached_entity_list_with_kind(k); - for(D_EntityNode *n = entities.first; n != 0; n = n->next) + DF_EntityList entities = d_query_cached_entity_list_with_kind(k); + for(DF_EntityNode *n = entities.first; n != 0; n = n->next) { DF_Entity *entity = n->entity; if(entity->cfg_src != source) @@ -3082,12 +1593,12 @@ d_cfg_strings_from_core(Arena *arena, String8 root_path, D_CfgSrc source) (int)Max(0, 79 - (title_name.size + 5)), slashes); } - D_EntityRec rec = {0}; + DF_EntityRec rec = {0}; S64 depth = 0; - for(DF_Entity *e = entity; !d_entity_is_nil(e); e = rec.next) + for(DF_Entity *e = entity; !df_entity_is_nil(e); e = rec.next) { //- rjf: get next iteration - rec = d_entity_rec_depth_first_pre(e, entity); + rec = df_entity_rec_depth_first_pre(e, entity); //- rjf: unpack entity info typedef U32 EntityInfoFlags; @@ -3115,10 +1626,10 @@ d_cfg_strings_from_core(Arena *arena, String8 root_path, D_CfgSrc source) EntityInfoFlags info_flags = 0; if(entity_name_escaped.size != 0) { info_flags |= EntityInfoFlag_HasName; } if(!!e->disabled) { info_flags |= EntityInfoFlag_HasDisabled; } - if(e->flags & D_EntityFlag_HasTextPoint) { info_flags |= EntityInfoFlag_HasTxtPt; } - if(e->flags & D_EntityFlag_HasVAddr) { info_flags |= EntityInfoFlag_HasVAddr; } - if(e->flags & D_EntityFlag_HasColor) { info_flags |= EntityInfoFlag_HasColor; } - if(!d_entity_is_nil(e->first)) { info_flags |= EntityInfoFlag_HasChildren; } + if(e->flags & DF_EntityFlag_HasTextPoint) { info_flags |= EntityInfoFlag_HasTxtPt; } + if(e->flags & DF_EntityFlag_HasVAddr) { info_flags |= EntityInfoFlag_HasVAddr; } + if(e->flags & DF_EntityFlag_HasColor) { info_flags |= EntityInfoFlag_HasColor; } + if(!df_entity_is_nil(e->first)) { info_flags |= EntityInfoFlag_HasChildren; } //- rjf: write entity info B32 opened_brace = 0; @@ -3141,18 +1652,18 @@ d_cfg_strings_from_core(Arena *arena, String8 root_path, D_CfgSrc source) { str8_list_pushf(arena, &strs, "disabled: 1\n"); } - if(e->flags & D_EntityFlag_HasColor) + if(e->flags & DF_EntityFlag_HasColor) { - Vec4F32 hsva = d_hsva_from_entity(e); + Vec4F32 hsva = df_hsva_from_entity(e); Vec4F32 rgba = rgba_from_hsva(hsva); U32 rgba_hex = u32_from_rgba(rgba); str8_list_pushf(arena, &strs, "color: 0x%x\n", rgba_hex); } - if(e->flags & D_EntityFlag_HasTextPoint) + if(e->flags & DF_EntityFlag_HasTextPoint) { str8_list_pushf(arena, &strs, "line: %I64d\n", e->text_point.line); } - if(e->flags & D_EntityFlag_HasVAddr) + if(e->flags & DF_EntityFlag_HasVAddr) { str8_list_pushf(arena, &strs, "vaddr: (0x%I64x)\n", e->vaddr); } @@ -3188,7 +1699,7 @@ d_cfg_strings_from_core(Arena *arena, String8 root_path, D_CfgSrc source) } // rjf: separate top-level entities with extra newline - if(d_entity_is_nil(rec.next) && (rec.pop_count != 0 || n->next == 0)) + if(df_entity_is_nil(rec.next) && (rec.pop_count != 0 || n->next == 0)) { str8_list_pushf(arena, &strs, "\n"); } @@ -3219,32 +1730,6 @@ d_cfg_strings_from_core(Arena *arena, String8 root_path, D_CfgSrc source) return strs; } -//- rjf: entity kind cache - -internal D_EntityList -d_query_cached_entity_list_with_kind(DF_EntityKind kind) -{ - ProfBeginFunction(); - D_EntityListCache *cache = &d_state->kind_caches[kind]; - - // rjf: build cached list if we're out-of-date - if(cache->alloc_gen != d_state->kind_alloc_gens[kind]) - { - cache->alloc_gen = d_state->kind_alloc_gens[kind]; - if(cache->arena == 0) - { - cache->arena = arena_alloc(); - } - arena_clear(cache->arena); - cache->list = d_push_entity_list_with_kind(cache->arena, kind); - } - - // rjf: grab & return cached list - D_EntityList result = cache->list; - ProfEnd(); - return result; -} - //- rjf: active entity based queries internal DI_KeyList @@ -3261,40 +1746,6 @@ d_push_active_dbgi_key_list(Arena *arena) return dbgis; } -internal D_EntityList -d_push_active_target_list(Arena *arena) -{ - D_EntityList active_targets = {0}; - D_EntityList all_targets = d_query_cached_entity_list_with_kind(DF_EntityKind_Target); - for(D_EntityNode *n = all_targets.first; n != 0; n = n->next) - { - if(!n->entity->disabled) - { - d_entity_list_push(arena, &active_targets, n->entity); - } - } - return active_targets; -} - -//- rjf: expand key based entity queries - -internal DF_Entity * -d_entity_from_ev_key_and_kind(EV_Key key, DF_EntityKind kind) -{ - DF_Entity *result = &d_nil_entity; - D_EntityList list = d_query_cached_entity_list_with_kind(kind); - for(D_EntityNode *n = list.first; n != 0; n = n->next) - { - DF_Entity *entity = n->entity; - if(ev_key_match(d_ev_key_from_entity(entity), key)) - { - result = entity; - break; - } - } - return result; -} - //- rjf: per-run caches internal CTRL_Unwind @@ -3584,13 +2035,8 @@ d_init(void) } d_state->cmds_arena = arena_alloc(); d_state->output_log_key = hs_hash_from_data(str8_lit("df_output_log_key")); - d_state->entities_arena = arena_alloc(.reserve_size = GB(64), .commit_size = KB(64)); - d_state->entities_root = &d_nil_entity; - d_state->entities_base = push_array(d_state->entities_arena, DF_Entity, 0); - d_state->entities_count = 0; d_state->ctrl_entity_store = ctrl_entity_store_alloc(); d_state->ctrl_stop_arena = arena_alloc(); - d_state->entities_root = d_entity_alloc(&d_nil_entity, DF_EntityKind_Root); d_state->view_rule_spec_table_size = 1024; d_state->view_rule_spec_table = push_array(arena, D_ViewRuleSpec *, d_state->view_rule_spec_table_size); d_state->ctrl_msg_arena = arena_alloc(); @@ -3604,13 +2050,6 @@ d_init(void) } } - // rjf: set up initial entities - { - DF_Entity *local_machine = d_entity_alloc(d_state->entities_root, DF_EntityKind_Machine); - d_entity_equip_ctrl_handle(local_machine, ctrl_handle_make(CTRL_MachineID_Local, dmn_handle_zero())); - d_entity_equip_name(local_machine, str8_lit("This PC")); - } - // rjf: register core view rules { D_ViewRuleSpecInfoArray array = {d_core_view_rule_spec_info_table, ArrayCount(d_core_view_rule_spec_info_table)}; @@ -3701,16 +2140,16 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P // rjf: kill all entities which are marked to die on stop { - DF_Entity *request = d_entity_from_id(event->msg_id); - if(d_entity_is_nil(request)) + DF_Entity *request = df_entity_from_id(event->msg_id); + if(df_entity_is_nil(request)) { - for(DF_Entity *entity = d_entity_root(); - !d_entity_is_nil(entity); - entity = d_entity_rec_depth_first_pre(entity, d_entity_root()).next) + for(DF_Entity *entity = df_entity_root(); + !df_entity_is_nil(entity); + entity = df_entity_rec_depth_first_pre(entity, df_entity_root()).next) { - if(entity->flags & D_EntityFlag_DiesOnRunStop) + if(entity->flags & DF_EntityFlag_DiesOnRunStop) { - d_entity_mark_for_deletion(entity); + df_entity_mark_for_deletion(entity); } } } @@ -3754,8 +2193,8 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P MTX_Op op = {r1u64(0, 0xffffffffffffffffull), str8_lit("[new session]\n")}; mtx_push_op(d_state->output_log_key, op); #if 0 // TODO(rjf): @msgs - D_EntityList bps = d_query_cached_entity_list_with_kind(DF_EntityKind_Breakpoint); - for(D_EntityNode *n = bps.first; n != 0; n = n->next) + DF_EntityList bps = d_query_cached_entity_list_with_kind(DF_EntityKind_Breakpoint); + for(DF_EntityNode *n = bps.first; n != 0; n = n->next) { n->entity->u64 = 0; } @@ -3763,39 +2202,39 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P } // rjf: create entity - DF_Entity *machine = d_machine_entity_from_machine_id(event->entity.machine_id); - DF_Entity *entity = d_entity_alloc(machine, DF_EntityKind_Process); - d_entity_equip_u64(entity, event->msg_id); - d_entity_equip_ctrl_handle(entity, event->entity); - d_entity_equip_ctrl_id(entity, event->entity_id); - d_entity_equip_arch(entity, event->arch); + DF_Entity *machine = df_machine_entity_from_machine_id(event->entity.machine_id); + DF_Entity *entity = df_entity_alloc(machine, DF_EntityKind_Process); + df_entity_equip_u64(entity, event->msg_id); + df_entity_equip_ctrl_handle(entity, event->entity); + df_entity_equip_ctrl_id(entity, event->entity_id); + df_entity_equip_arch(entity, event->arch); }break; case CTRL_EventKind_NewThread: { // rjf: create entity - DF_Entity *parent = d_entity_from_ctrl_handle(event->parent); - DF_Entity *entity = d_entity_alloc(parent, DF_EntityKind_Thread); - d_entity_equip_ctrl_handle(entity, event->entity); - d_entity_equip_arch(entity, event->arch); - d_entity_equip_ctrl_id(entity, event->entity_id); - d_entity_equip_stack_base(entity, event->stack_base); - d_entity_equip_vaddr(entity, event->rip_vaddr); + DF_Entity *parent = df_entity_from_ctrl_handle(event->parent); + DF_Entity *entity = df_entity_alloc(parent, DF_EntityKind_Thread); + df_entity_equip_ctrl_handle(entity, event->entity); + df_entity_equip_arch(entity, event->arch); + df_entity_equip_ctrl_id(entity, event->entity_id); + df_entity_equip_stack_base(entity, event->stack_base); + df_entity_equip_vaddr(entity, event->rip_vaddr); if(event->string.size != 0) { - d_entity_equip_name(entity, event->string); + df_entity_equip_name(entity, event->string); } // rjf: find any pending thread names correllating with this TID -> equip name if found match { - D_EntityList pending_thread_names = d_query_cached_entity_list_with_kind(DF_EntityKind_PendingThreadName); - for(D_EntityNode *n = pending_thread_names.first; n != 0; n = n->next) + DF_EntityList pending_thread_names = d_query_cached_entity_list_with_kind(DF_EntityKind_PendingThreadName); + for(DF_EntityNode *n = pending_thread_names.first; n != 0; n = n->next) { DF_Entity *pending_thread_name = n->entity; if(event->entity.machine_id == pending_thread_name->ctrl_handle.machine_id && event->entity_id == pending_thread_name->ctrl_id) { - d_entity_mark_for_deletion(pending_thread_name); - d_entity_equip_name(entity, pending_thread_name->string); + df_entity_mark_for_deletion(pending_thread_name); + df_entity_equip_name(entity, pending_thread_name->string); break; } } @@ -3803,7 +2242,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P // rjf: determine index in process U64 thread_idx_in_process = 0; - for(DF_Entity *child = parent->first; !d_entity_is_nil(child); child = child->next) + for(DF_Entity *child = parent->first; !df_entity_is_nil(child); child = child->next) { if(child == entity) { @@ -3832,49 +2271,49 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P Vec4F32 thread_color = thread_colors[thread_idx_in_process % ArrayCount(thread_colors)]; // rjf: equip color - d_entity_equip_color_rgba(entity, thread_color); + df_entity_equip_color_rgba(entity, thread_color); }break; case CTRL_EventKind_NewModule: { // rjf: grab process - DF_Entity *parent = d_entity_from_ctrl_handle(event->parent); + DF_Entity *parent = df_entity_from_ctrl_handle(event->parent); // rjf: determine if this is the first module B32 is_first = 0; - if(d_entity_is_nil(d_entity_child_from_kind(parent, DF_EntityKind_Module))) + if(df_entity_is_nil(df_entity_child_from_kind(parent, DF_EntityKind_Module))) { is_first = 1; } // rjf: create module entity - DF_Entity *module = d_entity_alloc(parent, DF_EntityKind_Module); - d_entity_equip_ctrl_handle(module, event->entity); - d_entity_equip_arch(module, event->arch); - d_entity_equip_name(module, event->string); - d_entity_equip_vaddr_rng(module, event->vaddr_rng); - d_entity_equip_vaddr(module, event->rip_vaddr); - d_entity_equip_timestamp(module, event->timestamp); + DF_Entity *module = df_entity_alloc(parent, DF_EntityKind_Module); + df_entity_equip_ctrl_handle(module, event->entity); + df_entity_equip_arch(module, event->arch); + df_entity_equip_name(module, event->string); + df_entity_equip_vaddr_rng(module, event->vaddr_rng); + df_entity_equip_vaddr(module, event->rip_vaddr); + df_entity_equip_timestamp(module, event->timestamp); // rjf: is first -> find target, equip process & module & first thread with target color if(is_first) { - D_EntityList targets = d_query_cached_entity_list_with_kind(DF_EntityKind_Target); - for(D_EntityNode *n = targets.first; n != 0; n = n->next) + DF_EntityList targets = d_query_cached_entity_list_with_kind(DF_EntityKind_Target); + for(DF_EntityNode *n = targets.first; n != 0; n = n->next) { DF_Entity *target = n->entity; - DF_Entity *exe = d_entity_child_from_kind(target, DF_EntityKind_Executable); + DF_Entity *exe = df_entity_child_from_kind(target, DF_EntityKind_Executable); String8 exe_name = exe->string; String8 exe_name_normalized = path_normalized_from_string(scratch.arena, exe_name); String8 module_name_normalized = path_normalized_from_string(scratch.arena, module->string); if(str8_match(exe_name_normalized, module_name_normalized, StringMatchFlag_CaseInsensitive) && - target->flags & D_EntityFlag_HasColor) + target->flags & DF_EntityFlag_HasColor) { - DF_Entity *first_thread = d_entity_child_from_kind(parent, DF_EntityKind_Thread); - Vec4F32 rgba = d_rgba_from_entity(target); - d_entity_equip_color_rgba(parent, rgba); - d_entity_equip_color_rgba(first_thread, rgba); - d_entity_equip_color_rgba(module, rgba); + DF_Entity *first_thread = df_entity_child_from_kind(parent, DF_EntityKind_Thread); + Vec4F32 rgba = df_rgba_from_entity(target); + df_entity_equip_color_rgba(parent, rgba); + df_entity_equip_color_rgba(first_thread, rgba); + df_entity_equip_color_rgba(module, rgba); break; } } @@ -3884,34 +2323,34 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case CTRL_EventKind_EndProc: { U32 pid = event->entity_id; - DF_Entity *process = d_entity_from_ctrl_handle(event->entity); - d_entity_mark_for_deletion(process); + DF_Entity *process = df_entity_from_ctrl_handle(event->entity); + df_entity_mark_for_deletion(process); }break; case CTRL_EventKind_EndThread: { - DF_Entity *thread = d_entity_from_ctrl_handle(event->entity); - d_entity_mark_for_deletion(thread); + DF_Entity *thread = df_entity_from_ctrl_handle(event->entity); + df_entity_mark_for_deletion(thread); }break; case CTRL_EventKind_EndModule: { - DF_Entity *module = d_entity_from_ctrl_handle(event->entity); - d_entity_mark_for_deletion(module); + DF_Entity *module = df_entity_from_ctrl_handle(event->entity); + df_entity_mark_for_deletion(module); }break; //- rjf: debug info changes case CTRL_EventKind_ModuleDebugInfoPathChange: { - DF_Entity *module = d_entity_from_ctrl_handle(event->entity); - DF_Entity *debug_info = d_entity_child_from_kind(module, DF_EntityKind_DebugInfoPath); - if(d_entity_is_nil(debug_info)) + DF_Entity *module = df_entity_from_ctrl_handle(event->entity); + DF_Entity *debug_info = df_entity_child_from_kind(module, DF_EntityKind_DebugInfoPath); + if(df_entity_is_nil(debug_info)) { - debug_info = d_entity_alloc(module, DF_EntityKind_DebugInfoPath); + debug_info = df_entity_alloc(module, DF_EntityKind_DebugInfoPath); } - d_entity_equip_name(debug_info, event->string); - d_entity_equip_timestamp(debug_info, event->timestamp); + df_entity_equip_name(debug_info, event->string); + df_entity_equip_timestamp(debug_info, event->timestamp); }break; //- rjf: debug strings @@ -3925,25 +2364,25 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case CTRL_EventKind_ThreadName: { String8 string = event->string; - DF_Entity *entity = d_entity_from_ctrl_handle(event->entity); + DF_Entity *entity = df_entity_from_ctrl_handle(event->entity); if(event->entity_id != 0) { - entity = d_entity_from_ctrl_id(event->entity.machine_id, event->entity_id); + entity = df_entity_from_ctrl_id(event->entity.machine_id, event->entity_id); } - if(d_entity_is_nil(entity)) + if(df_entity_is_nil(entity)) { - DF_Entity *process = d_entity_from_ctrl_handle(event->parent); - if(!d_entity_is_nil(process)) + DF_Entity *process = df_entity_from_ctrl_handle(event->parent); + if(!df_entity_is_nil(process)) { - entity = d_entity_alloc(process, DF_EntityKind_PendingThreadName); - d_entity_equip_name(entity, string); - d_entity_equip_ctrl_handle(entity, ctrl_handle_make(event->entity.machine_id, dmn_handle_zero())); - d_entity_equip_ctrl_id(entity, event->entity_id); + entity = df_entity_alloc(process, DF_EntityKind_PendingThreadName); + df_entity_equip_name(entity, string); + df_entity_equip_ctrl_handle(entity, ctrl_handle_make(event->entity.machine_id, dmn_handle_zero())); + df_entity_equip_ctrl_id(entity, event->entity_id); } } - if(!d_entity_is_nil(entity)) + if(!df_entity_is_nil(entity)) { - d_entity_equip_name(entity, string); + df_entity_equip_name(entity, string); } }break; @@ -4037,34 +2476,6 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P d_cmd(D_CmdKind_SoftHaltRefresh); } - ////////////////////////////// - //- rjf: eliminate entities that are marked for deletion - // - ProfScope("eliminate deleted entities") - { - for(DF_Entity *entity = d_entity_root(), *next = 0; !d_entity_is_nil(entity); entity = next) - { - next = d_entity_rec_depth_first_pre(entity, &d_nil_entity).next; - if(entity->flags & D_EntityFlag_MarkedForDeletion) - { - B32 undoable = (d_entity_kind_flags_table[entity->kind] & DF_EntityKindFlag_UserDefinedLifetime); - - // rjf: fixup next entity to iterate to - next = d_entity_rec_depth_first(entity, &d_nil_entity, OffsetOf(DF_Entity, next), OffsetOf(DF_Entity, next)).next; - - // rjf: eliminate root entity if we're freeing it - if(entity == d_state->entities_root) - { - d_state->entities_root = &d_nil_entity; - } - - // rjf: unhook & release this entity tree - d_entity_change_parent(entity, entity->parent, &d_nil_entity, &d_nil_entity); - d_entity_release(entity); - } - } - } - ////////////////////////////// //- rjf: garbage collect eliminated thread unwinds // @@ -4097,15 +2508,15 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P default:{}break; case DI_EventKind_ConversionStarted: { - DF_Entity *task = d_entity_alloc(d_entity_root(), DF_EntityKind_ConversionTask); - d_entity_equip_name(task, event->string); + DF_Entity *task = df_entity_alloc(df_entity_root(), DF_EntityKind_ConversionTask); + df_entity_equip_name(task, event->string); }break; case DI_EventKind_ConversionEnded: { - DF_Entity *task = d_entity_from_name_and_kind(event->string, DF_EntityKind_ConversionTask); - if(!d_entity_is_nil(task)) + DF_Entity *task = df_entity_from_name_and_kind(event->string, DF_EntityKind_ConversionTask); + if(!df_entity_is_nil(task)) { - d_entity_mark_for_deletion(task); + df_entity_mark_for_deletion(task); } }break; } @@ -4452,22 +2863,22 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P #if 0 // TODO(rjf): @msgs // rjf: gather targets corresponding to all launched processes - D_EntityList targets = {0}; + DF_EntityList targets = {0}; { - D_EntityList processes = d_query_cached_entity_list_with_kind(DF_EntityKind_Process); - for(D_EntityNode *n = processes.first; n != 0; n = n->next) + DF_EntityList processes = d_query_cached_entity_list_with_kind(DF_EntityKind_Process); + for(DF_EntityNode *n = processes.first; n != 0; n = n->next) { DF_Entity *process = n->entity; - DF_Entity *target = d_entity_from_handle(process->entity_handle); - if(!d_entity_is_nil(target)) + DF_Entity *target = df_entity_from_handle(process->entity_handle); + if(!df_entity_is_nil(target)) { - d_entity_list_push(scratch.arena, &targets, target); + df_entity_list_push(scratch.arena, &targets, target); } } } // rjf: re-launch targets - d_cmd(D_CmdKind_LaunchAndRun, .entity_list = d_handle_list_from_entity_list(scratch.arena, targets)); + d_cmd(D_CmdKind_LaunchAndRun, .entity_list = df_handle_list_from_entity_list(scratch.arena, targets)); #endif }break; case D_CmdKind_StepInto: diff --git a/src/dbg_engine/dbg_engine_core.h b/src/dbg_engine/dbg_engine_core.h index caa4f85f..552f3e3c 100644 --- a/src/dbg_engine/dbg_engine_core.h +++ b/src/dbg_engine/dbg_engine_core.h @@ -40,20 +40,20 @@ struct D_BreakpointArray D_Breakpoint *v; U64 count; }; - -typedef struct D_PathMap D_PathMap; -struct D_PathMap -{ - String8 src; - String8 dst; -}; - -typedef struct D_PathMapArray D_PathMapArray; -struct D_PathMapArray -{ - D_PathMap *v; - U64 count; -}; + +typedef struct D_PathMap D_PathMap; +struct D_PathMap +{ + String8 src; + String8 dst; +}; + +typedef struct D_PathMapArray D_PathMapArray; +struct D_PathMapArray +{ + D_PathMap *v; + U64 count; +}; //////////////////////////////// //~ rjf: Tick Output Types @@ -158,44 +158,6 @@ struct D_LineListArray DI_KeyList dbgi_keys; }; -//////////////////////////////// -//~ rjf: Entity Kind Flags - -typedef U32 DF_EntityKindFlags; -enum -{ - //- rjf: allowed operations - DF_EntityKindFlag_CanDelete = (1<<0), - DF_EntityKindFlag_CanFreeze = (1<<1), - DF_EntityKindFlag_CanEdit = (1<<2), - DF_EntityKindFlag_CanRename = (1<<3), - DF_EntityKindFlag_CanEnable = (1<<4), - DF_EntityKindFlag_CanCondition = (1<<5), - DF_EntityKindFlag_CanDuplicate = (1<<6), - - //- rjf: name categorization - DF_EntityKindFlag_NameIsCode = (1<<7), - DF_EntityKindFlag_NameIsPath = (1<<8), - - //- rjf: lifetime categorization - DF_EntityKindFlag_UserDefinedLifetime = (1<<9), - - //- rjf: serialization - DF_EntityKindFlag_IsSerializedToConfig = (1<<10), -}; - -//////////////////////////////// -//~ rjf: Entity Filesystem Lookup Flags - -typedef U32 D_EntityFromPathFlags; -enum -{ - D_EntityFromPathFlag_AllowOverrides = (1<<0), - D_EntityFromPathFlag_OpenAsNeeded = (1<<1), - D_EntityFromPathFlag_OpenMissing = (1<<2), - D_EntityFromPathFlag_All = 0xffffffff, -}; - //////////////////////////////// //~ rjf: Debug Engine Control Communication Types @@ -287,141 +249,6 @@ struct D_ViewRuleSpec D_ViewRuleSpecInfo info; }; -//////////////////////////////// -//~ rjf: Entity Types - -typedef U32 D_EntityFlags; -enum -{ - //- rjf: allocationless, simple equipment - D_EntityFlag_HasTextPoint = (1<<0), - D_EntityFlag_HasEntityHandle = (1<<2), - D_EntityFlag_HasU64 = (1<<4), - D_EntityFlag_HasColor = (1<<6), - D_EntityFlag_DiesOnRunStop = (1<<8), - - //- rjf: ctrl entity equipment - D_EntityFlag_HasCtrlHandle = (1<<9), - D_EntityFlag_HasArch = (1<<10), - D_EntityFlag_HasCtrlID = (1<<11), - D_EntityFlag_HasStackBase = (1<<12), - D_EntityFlag_HasTLSRoot = (1<<13), - D_EntityFlag_HasVAddrRng = (1<<14), - D_EntityFlag_HasVAddr = (1<<15), - - //- rjf: file properties - D_EntityFlag_IsFolder = (1<<16), - D_EntityFlag_IsMissing = (1<<17), - - //- rjf: deletion - D_EntityFlag_MarkedForDeletion = (1<<31), -}; - -typedef U64 DF_EntityID; - -typedef struct DF_Entity DF_Entity; -struct DF_Entity -{ - // rjf: tree links - DF_Entity *first; - DF_Entity *last; - DF_Entity *next; - DF_Entity *prev; - DF_Entity *parent; - - // rjf: metadata - DF_EntityKind kind; - D_EntityFlags flags; - DF_EntityID id; - U64 gen; - U64 alloc_time_us; - F32 alive_t; - - // rjf: basic equipment - TxtPt text_point; - D_Handle entity_handle; - B32 disabled; - U64 u64; - Vec4F32 color_hsva; - D_CfgSrc cfg_src; - U64 timestamp; - - // rjf: ctrl equipment - CTRL_Handle ctrl_handle; - Arch arch; - U32 ctrl_id; - U64 stack_base; - Rng1U64 vaddr_rng; - U64 vaddr; - - // rjf: string equipment - String8 string; - - // rjf: parameter tree - Arena *params_arena; - MD_Node *params_root; -}; - -typedef struct D_EntityNode D_EntityNode; -struct D_EntityNode -{ - D_EntityNode *next; - DF_Entity *entity; -}; - -typedef struct D_EntityList D_EntityList; -struct D_EntityList -{ - D_EntityNode *first; - D_EntityNode *last; - U64 count; -}; - -typedef struct D_EntityArray D_EntityArray; -struct D_EntityArray -{ - DF_Entity **v; - U64 count; -}; - -typedef struct D_EntityRec D_EntityRec; -struct D_EntityRec -{ - DF_Entity *next; - S32 push_count; - S32 pop_count; -}; - -//////////////////////////////// -//~ rjf: Entity Evaluation Types - -typedef struct D_EntityEval D_EntityEval; -struct D_EntityEval -{ - B64 enabled; - U64 hit_count; - U64 label_off; - U64 location_off; - U64 condition_off; -}; - -//////////////////////////////// -//~ rjf: Entity Fuzzy Listing Types - -typedef struct D_EntityFuzzyItem D_EntityFuzzyItem; -struct D_EntityFuzzyItem -{ - DF_Entity *entity; - FuzzyMatchRangeList matches; -}; - -typedef struct D_EntityFuzzyItemArray D_EntityFuzzyItemArray; -struct D_EntityFuzzyItemArray -{ - D_EntityFuzzyItem *v; - U64 count; -}; - //////////////////////////////// //~ rjf: Rich (Including Inline) Unwind Types @@ -459,87 +286,6 @@ struct D_Unwind D_UnwindFrameArray frames; }; -//////////////////////////////// -//~ rjf: Command Specification Types - -#if 0 -typedef U32 D_CmdQueryFlags; -enum -{ - D_CmdQueryFlag_AllowFiles = (1<<0), - D_CmdQueryFlag_AllowFolders = (1<<1), - D_CmdQueryFlag_CodeInput = (1<<2), - D_CmdQueryFlag_KeepOldInput = (1<<3), - D_CmdQueryFlag_SelectOldInput = (1<<4), - D_CmdQueryFlag_Required = (1<<5), -}; - -typedef struct D_CmdQuery D_CmdQuery; -struct D_CmdQuery -{ - D_CmdParamSlot slot; - DF_EntityKind entity_kind; - D_CmdQueryFlags flags; -}; - -typedef U32 D_CmdSpecFlags; -enum -{ - D_CmdSpecFlag_ListInUI = (1<<0), - D_CmdSpecFlag_ListInIPCDocs = (1<<1), -}; - -typedef struct D_CmdSpecInfo D_CmdSpecInfo; -struct D_CmdSpecInfo -{ - String8 string; - String8 description; - String8 search_tags; - String8 display_name; - D_CmdSpecFlags flags; - D_CmdQuery query; -}; - -typedef struct D_CmdSpec D_CmdSpec; -struct D_CmdSpec -{ - D_CmdSpec *hash_next; - D_CmdSpecInfo info; - U64 registrar_index; - U64 ordering_index; - U64 run_count; -}; - -typedef struct D_CmdSpecNode D_CmdSpecNode; -struct D_CmdSpecNode -{ - D_CmdSpecNode *next; - D_CmdSpec *spec; -}; - -typedef struct D_CmdSpecList D_CmdSpecList; -struct D_CmdSpecList -{ - D_CmdSpecNode *first; - D_CmdSpecNode *last; - U64 count; -}; - -typedef struct D_CmdSpecArray D_CmdSpecArray; -struct D_CmdSpecArray -{ - D_CmdSpec **v; - U64 count; -}; - -typedef struct D_CmdSpecInfoArray D_CmdSpecInfoArray; -struct D_CmdSpecInfoArray -{ - D_CmdSpecInfo *v; - U64 count; -}; -#endif - //////////////////////////////// //~ rjf: Command Types @@ -556,18 +302,6 @@ struct D_CmdParams B32 prefer_disasm; U32 pid; D_TargetArray targets; - //String8 string; - //String8 file_path; - //MD_Node * params_tree; - //U64 vaddr; - //U64 voff; - //U64 index; - //U64 id; - //B32 prefer_dasm; - //B32 force_confirm; - //Dir2 dir2; - //U64 unwind_index; - //U64 inline_depth; }; typedef struct D_Cmd D_Cmd; @@ -596,16 +330,6 @@ struct D_CmdList //////////////////////////////// //~ rjf: Main State Caches -//- rjf: per-entity-kind state cache - -typedef struct D_EntityListCache D_EntityListCache; -struct D_EntityListCache -{ - Arena *arena; - U64 alloc_gen; - D_EntityList list; -}; - //- rjf: per-thread unwind cache typedef struct D_UnwindCacheNode D_UnwindCacheNode; @@ -723,20 +447,6 @@ struct D_State // rjf: name allocator D_NameChunkNode *free_name_chunks[8]; - // rjf: entity state - Arena *entities_arena; - DF_Entity *entities_base; - U64 entities_count; - U64 entities_id_gen; - DF_Entity *entities_root; - DF_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[DF_EntityKind_COUNT]; - D_EntityListCache kind_caches[DF_EntityKind_COUNT]; - // rjf: per-run caches D_UnwindCache unwind_cache; U64 tls_base_cache_reggen_idx; @@ -760,8 +470,8 @@ struct D_State U64 ctrl_last_run_frame_idx; CTRL_Handle ctrl_last_run_thread_handle; CTRL_RunFlags ctrl_last_run_flags; - CTRL_TrapList ctrl_last_run_traps; - D_BreakpointArray ctrl_last_run_extra_bps; + CTRL_TrapList ctrl_last_run_traps; + D_BreakpointArray ctrl_last_run_extra_bps; U128 ctrl_last_run_param_state_hash; B32 ctrl_is_running; B32 ctrl_soft_halt_issued; @@ -781,14 +491,6 @@ struct D_State read_only global D_ViewRuleSpec d_nil_core_view_rule_spec = {0}; read_only global D_CfgTree d_nil_cfg_tree = {&d_nil_cfg_tree, D_CfgSrc_User, &md_nil_node}; read_only global D_CfgVal d_nil_cfg_val = {&d_nil_cfg_val, &d_nil_cfg_val, &d_nil_cfg_tree, &d_nil_cfg_tree}; -read_only global DF_Entity d_nil_entity = -{ - &d_nil_entity, - &d_nil_entity, - &d_nil_entity, - &d_nil_entity, - &d_nil_entity, -}; global D_State *d_state = 0; @@ -810,14 +512,14 @@ internal void d_handle_list_push(Arena *arena, D_HandleList *list, D_Handle hand internal D_HandleList d_handle_list_copy(Arena *arena, D_HandleList list); //////////////////////////////// -//~ rjf: Breakpoints - +//~ rjf: Breakpoints + internal D_BreakpointArray d_breakpoint_array_copy(Arena *arena, D_BreakpointArray *src); //////////////////////////////// //~ rjf: Path Map Application - -internal String8List d_possible_path_overrides_from_maps_path(Arena *arena, D_PathMapArray *path_maps, String8 file_path); + +internal String8List d_possible_path_overrides_from_maps_path(Arena *arena, D_PathMapArray *path_maps, String8 file_path); //////////////////////////////// //~ rjf: Config Type Pure Functions @@ -840,60 +542,6 @@ internal D_CmdParams d_cmd_params_copy(Arena *arena, D_CmdParams *src); //- rjf: command lists internal void d_cmd_list_push_new(Arena *arena, D_CmdList *cmds, D_CmdKind kind, D_CmdParams *params); -//////////////////////////////// -//~ rjf: Entity Type Pure Functions - -//- rjf: nil -internal B32 d_entity_is_nil(DF_Entity *entity); -#define d_require_entity_nonnil(entity, if_nil_stmts) do{if(d_entity_is_nil(entity)){if_nil_stmts;}}while(0) - -//- rjf: handle <-> entity conversions -internal U64 d_index_from_entity(DF_Entity *entity); -internal D_Handle d_handle_from_entity(DF_Entity *entity); -internal DF_Entity *d_entity_from_handle(D_Handle handle); -internal D_EntityList d_entity_list_from_handle_list(Arena *arena, D_HandleList handles); -internal D_HandleList d_handle_list_from_entity_list(Arena *arena, D_EntityList entities); - -//- rjf: entity recursion iterators -internal D_EntityRec d_entity_rec_depth_first(DF_Entity *entity, DF_Entity *subtree_root, U64 sib_off, U64 child_off); -#define d_entity_rec_depth_first_pre(entity, subtree_root) d_entity_rec_depth_first((entity), (subtree_root), OffsetOf(DF_Entity, next), OffsetOf(DF_Entity, first)) -#define d_entity_rec_depth_first_post(entity, subtree_root) d_entity_rec_depth_first((entity), (subtree_root), OffsetOf(DF_Entity, prev), OffsetOf(DF_Entity, last)) - -//- rjf: ancestor/child introspection -internal DF_Entity *d_entity_child_from_kind(DF_Entity *entity, DF_EntityKind kind); -internal DF_Entity *d_entity_ancestor_from_kind(DF_Entity *entity, DF_EntityKind kind); -internal D_EntityList d_push_entity_child_list_with_kind(Arena *arena, DF_Entity *entity, DF_EntityKind kind); -internal DF_Entity *d_entity_child_from_string_and_kind(DF_Entity *parent, String8 string, DF_EntityKind kind); - -//- rjf: entity list building -internal void d_entity_list_push(Arena *arena, D_EntityList *list, DF_Entity *entity); -internal D_EntityArray d_entity_array_from_list(Arena *arena, D_EntityList *list); -#define d_first_entity_from_list(list) ((list)->first != 0 ? (list)->first->entity : &d_nil_entity) - -//- rjf: entity fuzzy list building -internal D_EntityFuzzyItemArray d_entity_fuzzy_item_array_from_entity_list_needle(Arena *arena, D_EntityList *list, String8 needle); -internal D_EntityFuzzyItemArray d_entity_fuzzy_item_array_from_entity_array_needle(Arena *arena, D_EntityArray *array, String8 needle); - -//- rjf: full path building, from file/folder entities -internal String8 d_full_path_from_entity(Arena *arena, DF_Entity *entity); - -//- rjf: display string entities, for referencing entities in ui -internal String8 d_display_string_from_entity(Arena *arena, DF_Entity *entity); - -//- rjf: extra search tag strings for fuzzy filtering entities -internal String8 d_search_tags_from_entity(Arena *arena, DF_Entity *entity); - -//- rjf: entity -> color operations -internal Vec4F32 d_hsva_from_entity(DF_Entity *entity); -internal Vec4F32 d_rgba_from_entity(DF_Entity *entity); - -//- rjf: entity -> expansion tree keys -internal EV_Key d_ev_key_from_entity(DF_Entity *entity); -internal EV_Key d_parent_ev_key_from_entity(DF_Entity *entity); - -//- rjf: entity -> evaluation -internal D_EntityEval *d_eval_from_entity(Arena *arena, DF_Entity *entity); - //////////////////////////////// //~ rjf: Name Allocation @@ -901,49 +549,6 @@ internal U64 d_name_bucket_idx_from_string_size(U64 size); internal String8 d_name_alloc(String8 string); internal void d_name_release(String8 string); -//////////////////////////////// -//~ rjf: Entity Stateful Functions - -//- rjf: entity allocation + tree forming -internal DF_Entity *d_entity_alloc(DF_Entity *parent, DF_EntityKind kind); -internal void d_entity_mark_for_deletion(DF_Entity *entity); -internal void d_entity_release(DF_Entity *entity); -internal void d_entity_change_parent(DF_Entity *entity, DF_Entity *old_parent, DF_Entity *new_parent, DF_Entity *prev_child); - -//- rjf: entity simple equipment -internal void d_entity_equip_txt_pt(DF_Entity *entity, TxtPt point); -internal void d_entity_equip_entity_handle(DF_Entity *entity, D_Handle handle); -internal void d_entity_equip_disabled(DF_Entity *entity, B32 b32); -internal void d_entity_equip_u64(DF_Entity *entity, U64 u64); -internal void d_entity_equip_color_rgba(DF_Entity *entity, Vec4F32 rgba); -internal void d_entity_equip_color_hsva(DF_Entity *entity, Vec4F32 hsva); -internal void d_entity_equip_cfg_src(DF_Entity *entity, D_CfgSrc cfg_src); -internal void d_entity_equip_timestamp(DF_Entity *entity, U64 timestamp); - -//- rjf: control layer correllation equipment -internal void d_entity_equip_ctrl_handle(DF_Entity *entity, CTRL_Handle handle); -internal void d_entity_equip_arch(DF_Entity *entity, Arch arch); -internal void d_entity_equip_ctrl_id(DF_Entity *entity, U32 id); -internal void d_entity_equip_stack_base(DF_Entity *entity, U64 stack_base); -internal void d_entity_equip_vaddr_rng(DF_Entity *entity, Rng1U64 range); -internal void d_entity_equip_vaddr(DF_Entity *entity, U64 vaddr); - -//- rjf: name equipment -internal void d_entity_equip_name(DF_Entity *entity, String8 name); -internal void d_entity_equip_namef(DF_Entity *entity, char *fmt, ...); - -//- rjf: file path map override lookups -internal String8List d_possible_overrides_from_file_path(Arena *arena, String8 file_path); - -//- rjf: top-level state queries -internal DF_Entity *d_entity_root(void); -internal D_EntityList d_push_entity_list_with_kind(Arena *arena, DF_EntityKind kind); -internal DF_Entity *d_entity_from_id(DF_EntityID id); -internal DF_Entity *d_machine_entity_from_machine_id(CTRL_MachineID machine_id); -internal DF_Entity *d_entity_from_ctrl_handle(CTRL_Handle handle); -internal DF_Entity *d_entity_from_ctrl_id(CTRL_MachineID machine_id, U32 id); -internal DF_Entity *d_entity_from_name_and_kind(String8 string, DF_EntityKind kind); - //////////////////////////////// //~ rjf: View Rule Spec Stateful Functions @@ -989,50 +594,6 @@ internal D_Unwind d_unwind_from_ctrl_unwind(Arena *arena, DI_Scope *di_scope, CT //- rjf: stopped info from the control thread internal CTRL_Event d_ctrl_last_stop_event(void); -//////////////////////////////// -//~ rjf: Evaluation Spaces - -//- rjf: ctrl entity <-> eval space -internal CTRL_Entity *d_ctrl_entity_from_eval_space(E_Space space); -internal E_Space d_eval_space_from_ctrl_entity(CTRL_Entity *entity); - -//- rjf: entity <-> eval space -internal DF_Entity *d_entity_from_eval_space(E_Space space); -internal E_Space d_eval_space_from_entity(DF_Entity *entity); - -//- rjf: eval space reads/writes -internal B32 d_eval_space_read(void *u, E_Space space, void *out, Rng1U64 range); -internal B32 d_eval_space_write(void *u, E_Space space, void *in, Rng1U64 range); - -//- rjf: asynchronous streamed reads -> hashes from spaces -internal U128 d_key_from_eval_space_range(E_Space space, Rng1U64 range, B32 zero_terminated); - -//- rjf: space -> entire range -internal Rng1U64 d_whole_range_from_eval_space(E_Space space); - -//////////////////////////////// -//~ rjf: Evaluation Visualization - -//- rjf: writing values back to child processes -internal B32 d_commit_eval_value_string(E_Eval dst_eval, String8 string); - -//- rjf: eval / view rule params tree info extraction -internal U64 d_base_offset_from_eval(E_Eval eval); -internal E_Value d_value_from_params_key(MD_Node *params, String8 key); -internal Rng1U64 d_range_from_eval_params(E_Eval eval, MD_Node *params); -internal TXT_LangKind d_lang_kind_from_eval_params(E_Eval eval, MD_Node *params); -internal Arch d_arch_from_eval_params(E_Eval eval, MD_Node *params); -internal Vec2S32 d_dim2s32_from_eval_params(E_Eval eval, MD_Node *params); -internal R_Tex2DFormat d_tex2dformat_from_eval_params(E_Eval eval, MD_Node *params); - -//- rjf: eval <-> entity -internal DF_Entity *d_entity_from_eval_string(String8 string); -internal String8 d_eval_string_from_entity(Arena *arena, DF_Entity *entity); - -//- rjf: eval <-> file path -internal String8 d_file_path_from_eval_string(Arena *arena, String8 string); -internal String8 d_eval_string_from_file_path(Arena *arena, String8 string); - //////////////////////////////// //~ rjf: Main State Accessors/Mutators @@ -1050,15 +611,8 @@ internal String8 d_cfg_escaped_from_raw_string(Arena *arena, String8 string); internal String8 d_cfg_raw_from_escaped_string(Arena *arena, String8 string); internal String8List d_cfg_strings_from_core(Arena *arena, String8 root_path, D_CfgSrc source); -//- rjf: entity kind cache -internal D_EntityList d_query_cached_entity_list_with_kind(DF_EntityKind kind); - //- rjf: active entity based queries internal DI_KeyList d_push_active_dbgi_key_list(Arena *arena); -internal D_EntityList d_push_active_target_list(Arena *arena); - -//- rjf: expand key based entity queries -internal DF_Entity *d_entity_from_ev_key_and_kind(EV_Key key, DF_EntityKind kind); //- rjf: per-run caches internal CTRL_Unwind d_query_cached_unwind_from_thread(CTRL_Entity *thread); diff --git a/src/dbg_engine/generated/dbg_engine.meta.c b/src/dbg_engine/generated/dbg_engine.meta.c index 5437f04a..bcdac9cc 100644 --- a/src/dbg_engine/generated/dbg_engine.meta.c +++ b/src/dbg_engine/generated/dbg_engine.meta.c @@ -12,176 +12,6 @@ str8_lit_comp("command_line"), str8_lit_comp("transient"), }; -String8 d_entity_kind_display_string_table[30] = -{ -str8_lit_comp("Nil"), -str8_lit_comp("Root"), -str8_lit_comp("Machine"), -str8_lit_comp("File"), -str8_lit_comp("Auto View Rule"), -str8_lit_comp("File Path Map"), -str8_lit_comp("Watch Pin"), -str8_lit_comp("Watch"), -str8_lit_comp("View Rule"), -str8_lit_comp("Breakpoint"), -str8_lit_comp("Condition"), -str8_lit_comp("Location"), -str8_lit_comp("Target"), -str8_lit_comp("Executable"), -str8_lit_comp("Arguments"), -str8_lit_comp("Working Directory"), -str8_lit_comp("Entry Point"), -str8_lit_comp("Window"), -str8_lit_comp("Panel"), -str8_lit_comp("View"), -str8_lit_comp("Recent Project"), -str8_lit_comp("Source"), -str8_lit_comp("Destination"), -str8_lit_comp("Process"), -str8_lit_comp("Thread"), -str8_lit_comp("Module"), -str8_lit_comp("Pending Thread Name"), -str8_lit_comp("Debug Info Path"), -str8_lit_comp("Conversion Task"), -str8_lit_comp("Conversion Failure"), -}; - -String8 d_entity_kind_name_lower_table[30] = -{ -str8_lit_comp("nil"), -str8_lit_comp("root"), -str8_lit_comp("machine"), -str8_lit_comp("file"), -str8_lit_comp("auto_view_rule"), -str8_lit_comp("file_path_map"), -str8_lit_comp("watch_pin"), -str8_lit_comp("watch"), -str8_lit_comp("view_rule"), -str8_lit_comp("breakpoint"), -str8_lit_comp("condition"), -str8_lit_comp("location"), -str8_lit_comp("target"), -str8_lit_comp("executable"), -str8_lit_comp("arguments"), -str8_lit_comp("working_directory"), -str8_lit_comp("entry_point"), -str8_lit_comp("window"), -str8_lit_comp("panel"), -str8_lit_comp("view"), -str8_lit_comp("recent_project"), -str8_lit_comp("source"), -str8_lit_comp("dest"), -str8_lit_comp("process"), -str8_lit_comp("thread"), -str8_lit_comp("module"), -str8_lit_comp("pending_thread_name"), -str8_lit_comp("debug_info_path"), -str8_lit_comp("conversion_task"), -str8_lit_comp("conversion_fail"), -}; - -String8 d_entity_kind_name_lower_plural_table[30] = -{ -str8_lit_comp("nils"), -str8_lit_comp("roots"), -str8_lit_comp("machines"), -str8_lit_comp("files"), -str8_lit_comp("auto_view_rules"), -str8_lit_comp("file_path_maps"), -str8_lit_comp("watch_pins"), -str8_lit_comp("watches"), -str8_lit_comp("view_rules"), -str8_lit_comp("breakpoints"), -str8_lit_comp("conditions"), -str8_lit_comp("locations"), -str8_lit_comp("targets"), -str8_lit_comp("executables"), -str8_lit_comp("argumentses"), -str8_lit_comp("working_directories"), -str8_lit_comp("entry_points"), -str8_lit_comp("windows"), -str8_lit_comp("panels"), -str8_lit_comp("views"), -str8_lit_comp("recent_projects"), -str8_lit_comp("sources"), -str8_lit_comp("dests"), -str8_lit_comp("processes"), -str8_lit_comp("threads"), -str8_lit_comp("modules"), -str8_lit_comp("pending_thread_names"), -str8_lit_comp("debug_info_paths"), -str8_lit_comp("conversion_tasks"), -str8_lit_comp("conversion_fails"), -}; - -String8 d_entity_kind_name_label_table[30] = -{ -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Expression"), -str8_lit_comp("Expression"), -str8_lit_comp("Expression"), -str8_lit_comp("Label"), -str8_lit_comp("Expression"), -str8_lit_comp("Location"), -str8_lit_comp("Label"), -str8_lit_comp("Executable"), -str8_lit_comp("Arguments"), -str8_lit_comp("Execution Path"), -str8_lit_comp("Symbol Name"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Path"), -str8_lit_comp("Path"), -str8_lit_comp("Path"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -}; - -DF_EntityKindFlags d_entity_kind_flags_table[30] = -{ -(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), -(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), -(0*DF_EntityKindFlag_CanDelete) | (1*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (1*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), -(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), -(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (1*DF_EntityKindFlag_IsSerializedToConfig), -(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (1*DF_EntityKindFlag_IsSerializedToConfig), -(1*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (1*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (1*DF_EntityKindFlag_CanDuplicate) | (1*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (1*DF_EntityKindFlag_IsSerializedToConfig), -(1*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (1*DF_EntityKindFlag_CanRename) | (1*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (1*DF_EntityKindFlag_CanDuplicate) | (1*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (1*DF_EntityKindFlag_IsSerializedToConfig), -(1*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (1*DF_EntityKindFlag_CanRename) | (1*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (1*DF_EntityKindFlag_CanDuplicate) | (1*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), -(1*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (1*DF_EntityKindFlag_CanRename) | (1*DF_EntityKindFlag_CanEnable) | (1*DF_EntityKindFlag_CanCondition) | (1*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (1*DF_EntityKindFlag_IsSerializedToConfig), -(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (1*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), -(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (1*DF_EntityKindFlag_NameIsCode) | (1*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), -(1*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (1*DF_EntityKindFlag_CanEdit) | (1*DF_EntityKindFlag_CanRename) | (1*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (1*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (1*DF_EntityKindFlag_IsSerializedToConfig), -(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (1*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), -(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), -(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (1*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), -(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), -(1*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (1*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (1*DF_EntityKindFlag_IsSerializedToConfig), -(1*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (1*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (1*DF_EntityKindFlag_IsSerializedToConfig), -(1*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (1*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (1*DF_EntityKindFlag_IsSerializedToConfig), -(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (1*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (1*DF_EntityKindFlag_IsSerializedToConfig), -(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), -(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), -(0*DF_EntityKindFlag_CanDelete) | (1*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (1*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), -(0*DF_EntityKindFlag_CanDelete) | (1*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (1*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), -(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), -(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), -(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), -(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (1*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), -(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (1*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), -}; - D_ViewRuleSpecInfo d_core_view_rule_spec_info_table[21] = { {str8_lit_comp("default"), str8_lit_comp("Default"), str8_lit_comp(""), str8_lit_comp(""), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), }, diff --git a/src/dbg_engine/generated/dbg_engine.meta.h b/src/dbg_engine/generated/dbg_engine.meta.h index f7e89fc8..ea02fdbe 100644 --- a/src/dbg_engine/generated/dbg_engine.meta.h +++ b/src/dbg_engine/generated/dbg_engine.meta.h @@ -15,41 +15,6 @@ D_CfgSrc_Transient, D_CfgSrc_COUNT, } D_CfgSrc; -typedef enum DF_EntityKind -{ -DF_EntityKind_Nil, -DF_EntityKind_Root, -DF_EntityKind_Machine, -DF_EntityKind_File, -DF_EntityKind_AutoViewRule, -DF_EntityKind_FilePathMap, -DF_EntityKind_WatchPin, -DF_EntityKind_Watch, -DF_EntityKind_ViewRule, -DF_EntityKind_Breakpoint, -DF_EntityKind_Condition, -DF_EntityKind_Location, -DF_EntityKind_Target, -DF_EntityKind_Executable, -DF_EntityKind_Arguments, -DF_EntityKind_WorkingDirectory, -DF_EntityKind_EntryPoint, -DF_EntityKind_Window, -DF_EntityKind_Panel, -DF_EntityKind_View, -DF_EntityKind_RecentProject, -DF_EntityKind_Source, -DF_EntityKind_Dest, -DF_EntityKind_Process, -DF_EntityKind_Thread, -DF_EntityKind_Module, -DF_EntityKind_PendingThreadName, -DF_EntityKind_DebugInfoPath, -DF_EntityKind_ConversionTask, -DF_EntityKind_ConversionFail, -DF_EntityKind_COUNT, -} DF_EntityKind; - typedef enum D_CmdKind { D_CmdKind_Null, @@ -138,11 +103,6 @@ struct {B32 *value_ptr; String8 name;} DEV_toggle_table[] = }; C_LINKAGE_BEGIN extern String8 d_cfg_src_string_table[4]; -extern String8 d_entity_kind_display_string_table[30]; -extern String8 d_entity_kind_name_lower_table[30]; -extern String8 d_entity_kind_name_lower_plural_table[30]; -extern String8 d_entity_kind_name_label_table[30]; -extern DF_EntityKindFlags d_entity_kind_flags_table[30]; C_LINKAGE_END diff --git a/src/dbg_frontend/dbg_frontend.mdesk b/src/dbg_frontend/dbg_frontend.mdesk index 7065c45f..3244d910 100644 --- a/src/dbg_frontend/dbg_frontend.mdesk +++ b/src/dbg_frontend/dbg_frontend.mdesk @@ -28,6 +28,109 @@ @expand(D_CfgSrcTable a) `DF_CmdKind_$(a.apply_cmd)`; } +//////////////////////////////// +//~ rjf: Entity Kind Tables + +@table(name name_lower name_lower_plural op_delete op_freeze op_edit op_rename op_enable op_cond op_dup name_is_code name_is_path user_lifetime is_serialized name_label icon_kind display_string) +// | | +// | _____________________________________________________________________________________________________________________________________/ +// | / +// operations________ names lt sz +// /..................\ /...\ | | +// dl fz ed rn en cn dp nc np ul iz +DF_EntityKindTable: +{ + {Nil nil nils 0 0 0 0 0 0 0 0 0 0 0 "Label" Null "Nil" } + {Root root roots 0 0 0 0 0 0 0 0 0 0 0 "Label" Null "Root" } + + //- rjf: machines + {Machine machine machines 0 1 0 1 0 0 0 0 0 0 0 "Label" Machine "Machine" } + + //- rjf: filesystem modeling + {File file files 0 0 0 0 0 0 0 0 0 0 0 "Label" FileOutline "File" } + + //- rjf: auto view rules + {AutoViewRule auto_view_rule auto_view_rules 0 0 0 0 0 0 0 0 0 1 1 "Label" Binoculars "Auto View Rule" } + + //- rjf: file path maps + {FilePathMap file_path_map file_path_maps 0 0 0 0 0 0 0 0 0 0 1 "Label" FileOutline "File Path Map" } + + //- rjf: watch pins + {WatchPin watch_pin watch_pins 1 0 0 1 0 0 1 1 0 1 1 "Expression" Pin "Watch Pin" } + + //- rjf: watches + {Watch watch watches 1 0 0 1 1 0 1 1 0 1 1 "Expression" Binoculars "Watch" } + {ViewRule view_rule view_rules 1 0 0 1 1 0 1 1 0 1 0 "Expression" Binoculars "View Rule" } + + //- rjf: breakpoints + {Breakpoint breakpoint breakpoints 1 0 0 1 1 1 1 0 0 1 1 "Label" CircleFilled "Breakpoint" } + {Condition condition conditions 0 0 0 0 0 0 0 1 0 1 0 "Expression" CircleFilled "Condition" } + + //- rjf: user-controlled locations (source, addresses, symbol names) + {Location location locations 0 0 0 0 0 0 0 1 1 1 0 "Location" Null "Location" } + + //- rjf: targets + {Target target targets 1 0 1 1 1 0 1 0 0 1 1 "Label" Target "Target" } + {Executable executable executables 0 0 0 0 0 0 0 0 1 1 0 "Executable" Null "Executable" } + {Arguments arguments argumentses 0 0 0 0 0 0 0 0 0 1 0 "Arguments" Null "Arguments" } + {WorkingDirectory working_directory working_directories 0 0 0 0 0 0 0 0 1 1 0 "Execution Path" Null "Working Directory" } + {EntryPoint entry_point entry_points 0 0 0 0 0 0 0 0 0 1 0 "Symbol Name" Null "Entry Point" } + + //- rjf: frontend containers (windows, panels, views) + {Window window windows 1 0 0 0 0 0 1 0 0 1 1 "Label" Window "Window" } + {Panel panel panels 1 0 0 0 0 0 1 0 0 1 1 "Label" XSplit "Panel" } + {View view views 1 0 0 0 0 0 1 0 0 1 1 "Label" Null "View" } + + //- rjf: recent projects + {RecentProject recent_project recent_projects 0 0 0 0 0 0 0 0 1 0 1 "Path" Briefcase "Recent Project" } + + //- rjf: src -> dst mapping + {Source source sources 0 0 0 0 0 0 0 0 0 0 0 "Path" Null "Source" } + {Dest dest dests 0 0 0 0 0 0 0 0 0 0 0 "Path" Null "Destination" } + + //- rjf: control system entities + {Process process processes 0 1 0 1 0 0 0 0 0 0 0 "Label" Threads "Process" } + {Thread thread threads 0 1 0 1 0 0 0 0 0 0 0 "Label" Thread "Thread" } + {Module module modules 0 0 0 0 0 0 0 0 0 0 0 "Label" Module "Module" } + {PendingThreadName pending_thread_name pending_thread_names 0 0 0 0 0 0 0 0 0 0 0 "Label" Threads "Pending Thread Name" } + {DebugInfoPath debug_info_path debug_info_paths 0 0 0 0 0 0 0 0 0 0 0 "Label" Module "Debug Info Path" } + + //- rjf: parser task entities + {ConversionTask conversion_task conversion_tasks 0 0 0 1 0 0 0 0 0 0 0 "Label" Null "Conversion Task" } + {ConversionFail conversion_fail conversion_fails 0 0 0 1 0 0 0 0 0 0 0 "Label" Null "Conversion Failure" } +} + +@enum DF_EntityKind: +{ + @expand(DF_EntityKindTable a) `$(a.name)`, + COUNT, +} + +@data(String8) d_entity_kind_display_string_table: +{ + @expand(DF_EntityKindTable a) `str8_lit_comp("$(a.display_string)")`, +} + +@data(String8) d_entity_kind_name_lower_table: +{ + @expand(DF_EntityKindTable a) `str8_lit_comp("$(a.name_lower)")`, +} + +@data(String8) d_entity_kind_name_lower_plural_table: +{ + @expand(DF_EntityKindTable a) `str8_lit_comp("$(a.name_lower_plural)")`, +} + +@data(String8) d_entity_kind_name_label_table: +{ + @expand(DF_EntityKindTable a) `str8_lit_comp("$(a.name_label)")`, +} + +@data(DF_EntityKindFlags) d_entity_kind_flags_table: +{ + @expand(DF_EntityKindTable a) `($(a.op_delete)*DF_EntityKindFlag_CanDelete) | ($(a.op_freeze)*DF_EntityKindFlag_CanFreeze) | ($(a.op_edit)*DF_EntityKindFlag_CanEdit) | ($(a.op_rename)*DF_EntityKindFlag_CanRename) | ($(a.op_enable)*DF_EntityKindFlag_CanEnable) | ($(a.op_cond)*DF_EntityKindFlag_CanCondition) | ($(a.op_dup)*DF_EntityKindFlag_CanDuplicate) | ($(a.name_is_code)*DF_EntityKindFlag_NameIsCode) | ($(a.name_is_path)*DF_EntityKindFlag_NameIsPath) | ($(a.user_lifetime)*DF_EntityKindFlag_UserDefinedLifetime) | ($(a.is_serialized)*DF_EntityKindFlag_IsSerializedToConfig)`, +} + //////////////////////////////// //~ rjf: Registers Type Table diff --git a/src/dbg_frontend/dbg_frontend_core.c b/src/dbg_frontend/dbg_frontend_core.c index d1ceb650..182f7a73 100644 --- a/src/dbg_frontend/dbg_frontend_core.c +++ b/src/dbg_frontend/dbg_frontend_core.c @@ -49,6 +49,452 @@ df_cmd_list_push_new(Arena *arena, DF_CmdList *cmds, String8 name, DF_Regs *regs cmds->count += 1; } +//////////////////////////////// +//~ rjf: Entity Functions + +//- rjf: nil + +internal B32 +df_entity_is_nil(DF_Entity *entity) +{ + return (entity == 0 || entity == &d_nil_entity); +} + +//- rjf: handle <-> entity conversions + +internal U64 +df_index_from_entity(DF_Entity *entity) +{ + return (U64)(entity - df_state->entities_base); +} + +internal D_Handle +df_handle_from_entity(DF_Entity *entity) +{ + D_Handle handle = d_handle_zero(); + if(!df_entity_is_nil(entity)) + { + handle.u64[0] = df_index_from_entity(entity); + handle.u64[1] = entity->gen; + } + return handle; +} + +internal DF_Entity * +df_entity_from_handle(D_Handle handle) +{ + DF_Entity *result = df_state->entities_base + handle.u64[0]; + if(handle.u64[0] >= df_state->entities_count || result->gen != handle.u64[1]) + { + result = &d_nil_entity; + } + return result; +} + +internal D_HandleList +df_handle_list_from_entity_list(Arena *arena, DF_EntityList entities) +{ + D_HandleList result = {0}; + for(DF_EntityNode *n = entities.first; n != 0; n = n->next) + { + D_Handle handle = df_handle_from_entity(n->entity); + d_handle_list_push(arena, &result, handle); + } + return result; +} + +//- rjf: entity recursion iterators + +internal DF_EntityRec +df_entity_rec_depth_first(DF_Entity *entity, DF_Entity *subtree_root, U64 sib_off, U64 child_off) +{ + DF_EntityRec result = {0}; + if(!df_entity_is_nil(*MemberFromOffset(DF_Entity **, entity, child_off))) + { + result.next = *MemberFromOffset(DF_Entity **, entity, child_off); + result.push_count = 1; + } + else for(DF_Entity *parent = entity; parent != subtree_root && !df_entity_is_nil(parent); parent = parent->parent) + { + if(parent != subtree_root && !df_entity_is_nil(*MemberFromOffset(DF_Entity **, parent, sib_off))) + { + result.next = *MemberFromOffset(DF_Entity **, parent, sib_off); + break; + } + result.pop_count += 1; + } + return result; +} + +//- rjf: ancestor/child introspection + +internal DF_Entity * +df_entity_child_from_kind(DF_Entity *entity, DF_EntityKind kind) +{ + DF_Entity *result = &d_nil_entity; + for(DF_Entity *child = entity->first; !df_entity_is_nil(child); child = child->next) + { + if(child->kind == kind) + { + result = child; + break; + } + } + return result; +} + +internal DF_Entity * +df_entity_ancestor_from_kind(DF_Entity *entity, DF_EntityKind kind) +{ + DF_Entity *result = &d_nil_entity; + for(DF_Entity *p = entity->parent; !df_entity_is_nil(p); p = p->parent) + { + if(p->kind == kind) + { + result = p; + break; + } + } + return result; +} + +internal DF_EntityList +df_push_entity_child_list_with_kind(Arena *arena, DF_Entity *entity, DF_EntityKind kind) +{ + DF_EntityList result = {0}; + for(DF_Entity *child = entity->first; !df_entity_is_nil(child); child = child->next) + { + if(child->kind == kind) + { + df_entity_list_push(arena, &result, child); + } + } + return result; +} + +internal DF_Entity * +df_entity_child_from_string_and_kind(DF_Entity *parent, String8 string, DF_EntityKind kind) +{ + DF_Entity *result = &d_nil_entity; + for(DF_Entity *child = parent->first; !df_entity_is_nil(child); child = child->next) + { + if(str8_match(child->string, string, 0) && child->kind == kind) + { + result = child; + break; + } + } + return result; +} + +//- rjf: entity list building + +internal void +df_entity_list_push(Arena *arena, DF_EntityList *list, DF_Entity *entity) +{ + DF_EntityNode *n = push_array(arena, DF_EntityNode, 1); + n->entity = entity; + SLLQueuePush(list->first, list->last, n); + list->count += 1; +} + +internal DF_EntityArray +df_entity_array_from_list(Arena *arena, DF_EntityList *list) +{ + DF_EntityArray result = {0}; + result.count = list->count; + result.v = push_array(arena, DF_Entity *, result.count); + U64 idx = 0; + for(DF_EntityNode *n = list->first; n != 0; n = n->next, idx += 1) + { + result.v[idx] = n->entity; + } + return result; +} + +//- rjf: entity fuzzy list building + +internal DF_EntityFuzzyItemArray +df_entity_fuzzy_item_array_from_entity_list_needle(Arena *arena, DF_EntityList *list, String8 needle) +{ + Temp scratch = scratch_begin(&arena, 1); + DF_EntityArray array = df_entity_array_from_list(scratch.arena, list); + DF_EntityFuzzyItemArray result = df_entity_fuzzy_item_array_from_entity_array_needle(arena, &array, needle); + return result; +} + +internal DF_EntityFuzzyItemArray +df_entity_fuzzy_item_array_from_entity_array_needle(Arena *arena, DF_EntityArray *array, String8 needle) +{ + Temp scratch = scratch_begin(&arena, 1); + DF_EntityFuzzyItemArray result = {0}; + result.count = array->count; + result.v = push_array(arena, DF_EntityFuzzyItem, result.count); + U64 result_idx = 0; + for(U64 src_idx = 0; src_idx < array->count; src_idx += 1) + { + DF_Entity *entity = array->v[src_idx]; + String8 display_string = df_display_string_from_entity(scratch.arena, entity); + FuzzyMatchRangeList matches = fuzzy_match_find(arena, needle, display_string); + if(matches.count >= matches.needle_part_count) + { + result.v[result_idx].entity = entity; + result.v[result_idx].matches = matches; + result_idx += 1; + } + else + { + String8 search_tags = df_search_tags_from_entity(scratch.arena, entity); + if(search_tags.size != 0) + { + FuzzyMatchRangeList tag_matches = fuzzy_match_find(scratch.arena, needle, search_tags); + if(tag_matches.count >= tag_matches.needle_part_count) + { + result.v[result_idx].entity = entity; + result.v[result_idx].matches = matches; + result_idx += 1; + } + } + } + } + result.count = result_idx; + scratch_end(scratch); + return result; +} + +//- rjf: full path building, from file/folder entities + +internal String8 +df_full_path_from_entity(Arena *arena, DF_Entity *entity) +{ + String8 string = {0}; + { + Temp scratch = scratch_begin(&arena, 1); + String8List strs = {0}; + for(DF_Entity *e = entity; !df_entity_is_nil(e); e = e->parent) + { + if(e->kind == DF_EntityKind_File) + { + str8_list_push_front(scratch.arena, &strs, e->string); + } + } + StringJoin join = {0}; + join.sep = str8_lit("/"); + string = str8_list_join(arena, &strs, &join); + scratch_end(scratch); + } + return string; +} + +//- rjf: display string entities, for referencing entities in ui + +internal String8 +df_display_string_from_entity(Arena *arena, DF_Entity *entity) +{ + String8 result = {0}; + switch(entity->kind) + { + default: + { + if(entity->string.size != 0) + { + result = push_str8_copy(arena, entity->string); + } + else + { + String8 kind_string = d_entity_kind_display_string_table[entity->kind]; + result = push_str8f(arena, "%S $%I64u", kind_string, entity->id); + } + }break; + + case DF_EntityKind_Target: + { + if(entity->string.size != 0) + { + result = push_str8_copy(arena, entity->string); + } + else + { + DF_Entity *exe = df_entity_child_from_kind(entity, DF_EntityKind_Executable); + result = push_str8_copy(arena, exe->string); + } + }break; + + case DF_EntityKind_Breakpoint: + { + if(entity->string.size != 0) + { + result = push_str8_copy(arena, entity->string); + } + else + { + DF_Entity *loc = df_entity_child_from_kind(entity, DF_EntityKind_Location); + if(loc->flags & DF_EntityFlag_HasTextPoint) + { + result = push_str8f(arena, "%S:%I64d:%I64d", str8_skip_last_slash(loc->string), loc->text_point.line, loc->text_point.column); + } + else if(loc->flags & DF_EntityFlag_HasVAddr) + { + result = str8_from_u64(arena, loc->vaddr, 16, 16, 0); + } + else if(loc->string.size != 0) + { + result = push_str8_copy(arena, loc->string); + } + } + }break; + + case DF_EntityKind_Process: + { + DF_Entity *main_mod_child = df_entity_child_from_kind(entity, DF_EntityKind_Module); + String8 main_mod_name = str8_skip_last_slash(main_mod_child->string); + result = push_str8f(arena, "%S%s%sPID: %i%s", + main_mod_name, + main_mod_name.size != 0 ? " " : "", + main_mod_name.size != 0 ? "(" : "", + entity->ctrl_id, + main_mod_name.size != 0 ? ")" : ""); + }break; + + case DF_EntityKind_Thread: + { + String8 name = entity->string; + if(name.size == 0) + { + DF_Entity *process = df_entity_ancestor_from_kind(entity, DF_EntityKind_Process); + DF_Entity *first_thread = df_entity_child_from_kind(process, DF_EntityKind_Thread); + if(first_thread == entity) + { + name = str8_lit("Main Thread"); + } + } + result = push_str8f(arena, "%S%s%sTID: %i%s", + name, + name.size != 0 ? " " : "", + name.size != 0 ? "(" : "", + entity->ctrl_id, + name.size != 0 ? ")" : ""); + }break; + + case DF_EntityKind_Module: + { + result = push_str8_copy(arena, str8_skip_last_slash(entity->string)); + }break; + + case DF_EntityKind_RecentProject: + { + result = push_str8_copy(arena, str8_skip_last_slash(entity->string)); + }break; + } + return result; +} + +//- rjf: extra search tag strings for fuzzy filtering entities + +internal String8 +df_search_tags_from_entity(Arena *arena, DF_Entity *entity) +{ + String8 result = {0}; + if(entity->kind == DF_EntityKind_Thread) + { + Temp scratch = scratch_begin(&arena, 1); + CTRL_Entity *entity_ctrl = ctrl_entity_from_handle(d_state->ctrl_entity_store, entity->ctrl_handle); + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(entity_ctrl, DF_EntityKind_Process); + CTRL_Unwind unwind = d_query_cached_unwind_from_thread(entity_ctrl); + String8List strings = {0}; + for(U64 frame_num = unwind.frames.count; frame_num > 0; frame_num -= 1) + { + CTRL_UnwindFrame *f = &unwind.frames.v[frame_num-1]; + U64 rip_vaddr = regs_rip_from_arch_block(entity->arch, f->regs); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); + U64 rip_voff = ctrl_voff_from_vaddr(module, rip_vaddr); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + String8 procedure_name = d_symbol_name_from_dbgi_key_voff(scratch.arena, &dbgi_key, rip_voff, 0); + if(procedure_name.size != 0) + { + str8_list_push(scratch.arena, &strings, procedure_name); + } + } + StringJoin join = {0}; + join.sep = str8_lit(","); + result = str8_list_join(arena, &strings, &join); + scratch_end(scratch); + } + return result; +} + +//- rjf: entity -> color operations + +internal Vec4F32 +df_hsva_from_entity(DF_Entity *entity) +{ + Vec4F32 result = {0}; + if(entity->flags & DF_EntityFlag_HasColor) + { + result = entity->color_hsva; + } + return result; +} + +internal Vec4F32 +df_rgba_from_entity(DF_Entity *entity) +{ + Vec4F32 result = {0}; + if(entity->flags & DF_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); + } + return result; +} + +//- rjf: entity -> expansion tree keys + +internal EV_Key +df_ev_key_from_entity(DF_Entity *entity) +{ + EV_Key parent_key = df_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 +df_parent_ev_key_from_entity(DF_Entity *entity) +{ + EV_Key parent_key = ev_key_make(5381, (U64)entity); + return parent_key; +} + +//- rjf: entity -> evaluation + +internal DF_EntityEval * +df_eval_from_entity(Arena *arena, DF_Entity *entity) +{ + DF_EntityEval *eval = push_array(arena, DF_EntityEval, 1); + { + DF_Entity *loc = df_entity_child_from_kind(entity, DF_EntityKind_Location); + DF_Entity *cnd = df_entity_child_from_kind(entity, DF_EntityKind_Condition); + String8 label_string = push_str8_copy(arena, entity->string); + String8 loc_string = {0}; + if(loc->flags & DF_EntityFlag_HasTextPoint) + { + loc_string = push_str8f(arena, "%S:%I64u:%I64u", loc->string, loc->text_point.line, loc->text_point.column); + } + else if(loc->flags & DF_EntityFlag_HasVAddr) + { + loc_string = push_str8f(arena, "0x%I64x", loc->vaddr); + } + String8 cnd_string = push_str8_copy(arena, cnd->string); + eval->enabled = !entity->disabled; + eval->hit_count = entity->u64; + eval->label_off = (U64)((U8 *)label_string.str - (U8 *)eval); + eval->location_off = (U64)((U8 *)loc_string.str - (U8 *)eval); + eval->condition_off= (U64)((U8 *)cnd_string.str - (U8 *)eval); + } + return eval; +} + //////////////////////////////// //~ rjf: View Type Functions @@ -564,6 +1010,1022 @@ df_get_hover_regs(void) return df_state->hover_regs; } +//////////////////////////////// +//~ rjf: Entity State Functions + +//- rjf: entity allocation + tree forming + +internal DF_Entity * +df_entity_alloc(DF_Entity *parent, DF_EntityKind kind) +{ + B32 user_defined_lifetime = !!(d_entity_kind_flags_table[kind] & DF_EntityKindFlag_UserDefinedLifetime); + U64 free_list_idx = !!user_defined_lifetime; + if(df_entity_is_nil(parent)) { parent = df_state->entities_root; } + + // rjf: empty free list -> push new + if(!df_state->entities_free[free_list_idx]) + { + DF_Entity *entity = push_array(df_state->entities_arena, DF_Entity, 1); + df_state->entities_count += 1; + df_state->entities_free_count += 1; + SLLStackPush(df_state->entities_free[free_list_idx], entity); + } + + // rjf: pop new entity off free-list + DF_Entity *entity = df_state->entities_free[free_list_idx]; + SLLStackPop(df_state->entities_free[free_list_idx]); + df_state->entities_free_count -= 1; + df_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 = &d_nil_entity; + entity->parent = parent; + + // rjf: stitch up parent links + if(df_entity_is_nil(parent)) + { + df_state->entities_root = entity; + } + else + { + DLLPushBack_NPZ(&d_nil_entity, parent->first, parent->last, entity, next, prev); + } + + // rjf: fill out metadata + entity->kind = kind; + df_state->entities_id_gen += 1; + entity->id = df_state->entities_id_gen; + entity->gen += 1; + entity->alloc_time_us = os_now_microseconds(); + entity->params_root = &md_nil_node; + + // rjf: initialize to deleted, record history, then "undelete" if this allocation can be undone + if(user_defined_lifetime) + { + // TODO(rjf) + } + + // rjf: dirtify caches + df_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 +df_entity_mark_for_deletion(DF_Entity *entity) +{ + if(!df_entity_is_nil(entity)) + { + entity->flags |= DF_EntityFlag_MarkedForDeletion; + } +} + +internal void +df_entity_release(DF_Entity *entity) +{ + Temp scratch = scratch_begin(0, 0); + + // rjf: unpack + U64 free_list_idx = !!(d_entity_kind_flags_table[entity->kind] & DF_EntityKindFlag_UserDefinedLifetime); + + // rjf: release whole tree + typedef struct Task Task; + struct Task + { + Task *next; + DF_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(DF_Entity *child = task->e->first; !df_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") + { + String8 name = df_display_string_from_entity(scratch.arena, task->e); + log_infof("kind: \"%S\"\n", d_entity_kind_display_string_table[task->e->kind]); + log_infof("id: $0x%I64x\n", task->e->id); + log_infof("display_string: \"%S\"\n", name); + } + SLLStackPush(df_state->entities_free[free_list_idx], task->e); + df_state->entities_free_count += 1; + df_state->entities_active_count -= 1; + task->e->gen += 1; + if(task->e->string.size != 0) + { + d_name_release(task->e->string); + } + if(task->e->params_arena != 0) + { + arena_release(task->e->params_arena); + } + df_state->kind_alloc_gens[task->e->kind] += 1; + } + + scratch_end(scratch); +} + +internal void +df_entity_change_parent(DF_Entity *entity, DF_Entity *old_parent, DF_Entity *new_parent, DF_Entity *prev_child) +{ + Assert(entity->parent == old_parent); + Assert(prev_child->parent == old_parent || df_entity_is_nil(prev_child)); + + // rjf: fix up links + if(!df_entity_is_nil(old_parent)) + { + DLLRemove_NPZ(&d_nil_entity, old_parent->first, old_parent->last, entity, next, prev); + } + if(!df_entity_is_nil(new_parent)) + { + DLLInsert_NPZ(&d_nil_entity, new_parent->first, new_parent->last, prev_child, entity, next, prev); + } + entity->parent = new_parent; + + // rjf: notify + df_state->kind_alloc_gens[entity->kind] += 1; +} + +//- rjf: entity simple equipment + +internal void +df_entity_equip_txt_pt(DF_Entity *entity, TxtPt point) +{ + df_require_entity_nonnil(entity, return); + entity->text_point = point; + entity->flags |= DF_EntityFlag_HasTextPoint; +} + +internal void +df_entity_equip_entity_handle(DF_Entity *entity, D_Handle handle) +{ + df_require_entity_nonnil(entity, return); + entity->entity_handle = handle; + entity->flags |= DF_EntityFlag_HasEntityHandle; +} + +internal void +df_entity_equip_disabled(DF_Entity *entity, B32 value) +{ + df_require_entity_nonnil(entity, return); + entity->disabled = value; +} + +internal void +df_entity_equip_u64(DF_Entity *entity, U64 u64) +{ + df_require_entity_nonnil(entity, return); + entity->u64 = u64; + entity->flags |= DF_EntityFlag_HasU64; +} + +internal void +df_entity_equip_color_rgba(DF_Entity *entity, Vec4F32 rgba) +{ + df_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); + df_entity_equip_color_hsva(entity, hsva); +} + +internal void +df_entity_equip_color_hsva(DF_Entity *entity, Vec4F32 hsva) +{ + df_require_entity_nonnil(entity, return); + entity->color_hsva = hsva; + entity->flags |= DF_EntityFlag_HasColor; +} + +internal void +df_entity_equip_cfg_src(DF_Entity *entity, D_CfgSrc cfg_src) +{ + df_require_entity_nonnil(entity, return); + entity->cfg_src = cfg_src; +} + +internal void +df_entity_equip_timestamp(DF_Entity *entity, U64 timestamp) +{ + df_require_entity_nonnil(entity, return); + entity->timestamp = timestamp; +} + +//- rjf: control layer correllation equipment + +internal void +df_entity_equip_ctrl_handle(DF_Entity *entity, CTRL_Handle handle) +{ + df_require_entity_nonnil(entity, return); + entity->ctrl_handle = handle; + entity->flags |= DF_EntityFlag_HasCtrlHandle; +} + +internal void +df_entity_equip_arch(DF_Entity *entity, Arch arch) +{ + df_require_entity_nonnil(entity, return); + entity->arch = arch; + entity->flags |= DF_EntityFlag_HasArch; +} + +internal void +df_entity_equip_ctrl_id(DF_Entity *entity, U32 id) +{ + df_require_entity_nonnil(entity, return); + entity->ctrl_id = id; + entity->flags |= DF_EntityFlag_HasCtrlID; +} + +internal void +df_entity_equip_stack_base(DF_Entity *entity, U64 stack_base) +{ + df_require_entity_nonnil(entity, return); + entity->stack_base = stack_base; + entity->flags |= DF_EntityFlag_HasStackBase; +} + +internal void +df_entity_equip_vaddr_rng(DF_Entity *entity, Rng1U64 range) +{ + df_require_entity_nonnil(entity, return); + entity->vaddr_rng = range; + entity->flags |= DF_EntityFlag_HasVAddrRng; +} + +internal void +df_entity_equip_vaddr(DF_Entity *entity, U64 vaddr) +{ + df_require_entity_nonnil(entity, return); + entity->vaddr = vaddr; + entity->flags |= DF_EntityFlag_HasVAddr; +} + +//- rjf: name equipment + +internal void +df_entity_equip_name(DF_Entity *entity, String8 name) +{ + df_require_entity_nonnil(entity, return); + if(entity->string.size != 0) + { + d_name_release(entity->string); + } + if(name.size != 0) + { + entity->string = d_name_alloc(name); + } + else + { + entity->string = str8_zero(); + } +} + +//- rjf: file path map override lookups + +internal String8List +d_possible_overrides_from_file_path(Arena *arena, String8 file_path) +{ + // NOTE(rjf): This path, given some target file path, scans all file path map + // overrides, and collects the set of file paths which could've redirected + // to the target file path given the set of file path maps. + // + // For example, if I have a rule saying D:/devel/ maps to C:/devel/, and I + // feed in C:/devel/foo/bar.txt, then this path will construct + // D:/devel/foo/bar.txt, as a possible option. + // + // It will also preserve C:/devel/foo/bar.txt in the resultant list, so that + // overrideless files still work through this path, and both redirected + // files and non-redirected files can go through the same path. + // + String8List result = {0}; + str8_list_push(arena, &result, file_path); + Temp scratch = scratch_begin(&arena, 1); + PathStyle pth_style = PathStyle_Relative; + String8List pth_parts = path_normalized_list_from_string(scratch.arena, file_path, &pth_style); + { + DF_EntityList links = d_query_cached_entity_list_with_kind(DF_EntityKind_FilePathMap); + for(DF_EntityNode *n = links.first; n != 0; n = n->next) + { + //- rjf: unpack link + DF_Entity *link = n->entity; + DF_Entity *src = df_entity_child_from_kind(link, DF_EntityKind_Source); + DF_Entity *dst = df_entity_child_from_kind(link, DF_EntityKind_Dest); + PathStyle src_style = PathStyle_Relative; + PathStyle dst_style = PathStyle_Relative; + String8List src_parts = path_normalized_list_from_string(scratch.arena, src->string, &src_style); + String8List dst_parts = path_normalized_list_from_string(scratch.arena, dst->string, &dst_style); + + //- rjf: determine if this link can possibly redirect to the target file path + B32 dst_redirects_to_pth = 0; + String8Node *non_redirected_pth_first = 0; + if(dst_style == pth_style && dst_parts.first != 0 && pth_parts.first != 0) + { + dst_redirects_to_pth = 1; + String8Node *dst_n = dst_parts.first; + String8Node *pth_n = pth_parts.first; + for(;dst_n != 0 && pth_n != 0; dst_n = dst_n->next, pth_n = pth_n->next) + { + if(!str8_match(dst_n->string, pth_n->string, StringMatchFlag_CaseInsensitive)) + { + dst_redirects_to_pth = 0; + break; + } + non_redirected_pth_first = pth_n->next; + } + } + + //- rjf: if this link can redirect to this path via `src` -> `dst`, compute + // possible full source path, by taking `src` and appending non-redirected + // suffix (which did not show up in `dst`) + if(dst_redirects_to_pth) + { + String8List candidate_parts = src_parts; + for(String8Node *p = non_redirected_pth_first; p != 0; p = p->next) + { + str8_list_push(scratch.arena, &candidate_parts, p->string); + } + StringJoin join = {0}; + join.sep = str8_lit("/"); + String8 candidate_path = str8_list_join(arena, &candidate_parts, 0); + str8_list_push(arena, &result, candidate_path); + } + } + } + scratch_end(scratch); + return result; +} + +//- rjf: top-level state queries + +internal DF_Entity * +df_entity_root(void) +{ + return df_state->entities_root; +} + +internal DF_EntityList +df_push_entity_list_with_kind(Arena *arena, DF_EntityKind kind) +{ + ProfBeginFunction(); + DF_EntityList result = {0}; + for(DF_Entity *entity = df_state->entities_root; + !df_entity_is_nil(entity); + entity = df_entity_rec_depth_first_pre(entity, &d_nil_entity).next) + { + if(entity->kind == kind) + { + df_entity_list_push(arena, &result, entity); + } + } + ProfEnd(); + return result; +} + +internal DF_Entity * +df_entity_from_id(DF_EntityID id) +{ + DF_Entity *result = &d_nil_entity; + for(DF_Entity *e = df_entity_root(); + !df_entity_is_nil(e); + e = df_entity_rec_depth_first_pre(e, &d_nil_entity).next) + { + if(e->id == id) + { + result = e; + break; + } + } + return result; +} + +internal DF_Entity * +df_machine_entity_from_machine_id(CTRL_MachineID machine_id) +{ + DF_Entity *result = &d_nil_entity; + for(DF_Entity *e = df_entity_root(); + !df_entity_is_nil(e); + e = df_entity_rec_depth_first_pre(e, &d_nil_entity).next) + { + if(e->kind == DF_EntityKind_Machine && e->ctrl_handle.machine_id == machine_id) + { + result = e; + break; + } + } + if(df_entity_is_nil(result)) + { + result = df_entity_alloc(df_entity_root(), DF_EntityKind_Machine); + df_entity_equip_ctrl_handle(result, ctrl_handle_make(machine_id, dmn_handle_zero())); + } + return result; +} + +internal DF_Entity * +df_entity_from_ctrl_handle(CTRL_Handle handle) +{ + DF_Entity *result = &d_nil_entity; + if(handle.machine_id != 0 || handle.dmn_handle.u64[0] != 0) + { + for(DF_Entity *e = df_entity_root(); + !df_entity_is_nil(e); + e = df_entity_rec_depth_first_pre(e, &d_nil_entity).next) + { + if(e->flags & DF_EntityFlag_HasCtrlHandle && + ctrl_handle_match(e->ctrl_handle, handle)) + { + result = e; + break; + } + } + } + return result; +} + +internal DF_Entity * +df_entity_from_ctrl_id(CTRL_MachineID machine_id, U32 id) +{ + DF_Entity *result = &d_nil_entity; + if(id != 0) + { + for(DF_Entity *e = df_entity_root(); + !df_entity_is_nil(e); + e = df_entity_rec_depth_first_pre(e, &d_nil_entity).next) + { + if(e->flags & DF_EntityFlag_HasCtrlHandle && + e->flags & DF_EntityFlag_HasCtrlID && + e->ctrl_handle.machine_id == machine_id && + e->ctrl_id == id) + { + result = e; + break; + } + } + } + return result; +} + +internal DF_Entity * +df_entity_from_name_and_kind(String8 string, DF_EntityKind kind) +{ + DF_Entity *result = &d_nil_entity; + DF_EntityList all_of_this_kind = d_query_cached_entity_list_with_kind(kind); + for(DF_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: Evaluation Spaces + +//- rjf: ctrl entity <-> eval space + +internal CTRL_Entity * +d_ctrl_entity_from_eval_space(E_Space space) +{ + CTRL_Entity *entity = &ctrl_entity_nil; + // TODO(rjf): @msgs + return entity; +} + +internal E_Space +d_eval_space_from_ctrl_entity(CTRL_Entity *entity) +{ + E_Space space = {0}; + // TODO(rjf): @msgs + return space; +} + +//- rjf: entity <-> eval space + +internal DF_Entity * +d_entity_from_eval_space(E_Space space) +{ + DF_Entity *entity = &d_nil_entity; + if(space.u64_0 != 0) + { + entity = (DF_Entity *)space.u64_0; + } + return entity; +} + +internal E_Space +d_eval_space_from_entity(DF_Entity *entity) +{ + E_Space space = {0}; + space.u64_0 = (U64)entity; + return space; +} + +//- rjf: eval space reads/writes + +internal B32 +d_eval_space_read(void *u, E_Space space, void *out, Rng1U64 range) +{ + B32 result = 0; + switch(space.kind) + { + case E_SpaceKind_FileSystem: + { + + }break; + case DF_EvalSpaceKind_CtrlEntity: + { + + }break; + case DF_EvalSpaceKind_CfgEntity: + { + + }break; + } + +#if 0 // TODO(rjf): @msgs + DF_Entity *entity = d_entity_from_eval_space(space); + switch(entity->kind) + { + //- rjf: nil-space -> fall back to file system + case DF_EntityKind_Nil: + { + U128 key = space.u128; + U128 hash = hs_hash_from_key(key, 0); + HS_Scope *scope = hs_scope_open(); + { + String8 data = hs_data_from_hash(scope, hash); + Rng1U64 legal_range = r1u64(0, data.size); + Rng1U64 read_range = intersect_1u64(range, legal_range); + if(read_range.min < read_range.max) + { + result = 1; + MemoryCopy(out, data.str + read_range.min, dim_1u64(read_range)); + } + } + hs_scope_close(scope); + }break; + + //- rjf: default -> evaluating a debugger entity; read from entity POD evaluation + default: + { + Temp scratch = scratch_begin(0, 0); + arena_push(scratch.arena, 0, 64); + U64 pos_min = arena_pos(scratch.arena); + DF_EntityEval *eval = df_eval_from_entity(scratch.arena, entity); + U64 pos_opl = arena_pos(scratch.arena); + Rng1U64 legal_range = r1u64(0, pos_opl-pos_min); + if(contains_1u64(legal_range, range.min)) + { + result = 1; + U64 range_dim = dim_1u64(range); + U64 bytes_to_read = Min(range_dim, (legal_range.max - range.min)); + MemoryCopy(out, ((U8 *)eval) + range.min, bytes_to_read); + if(bytes_to_read < range_dim) + { + MemoryZero((U8 *)out + bytes_to_read, range_dim - bytes_to_read); + } + } + scratch_end(scratch); + }break; + + //- rjf: process -> reading process memory + case DF_EntityKind_Process: + { + Temp scratch = scratch_begin(0, 0); + CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, entity->ctrl_handle, range, d_state->frame_eval_memread_endt_us); + String8 data = slice.data; + if(data.size == dim_1u64(range)) + { + result = 1; + MemoryCopy(out, data.str, data.size); + } + scratch_end(scratch); + }break; + + //- rjf: thread -> reading from thread register block + case DF_EntityKind_Thread: + { + Temp scratch = scratch_begin(0, 0); + CTRL_Unwind unwind = d_query_cached_unwind_from_thread(entity); + U64 frame_idx = e_interpret_ctx->reg_unwind_count; + if(frame_idx < unwind.frames.count) + { + CTRL_UnwindFrame *f = &unwind.frames.v[frame_idx]; + U64 regs_size = regs_block_size_from_arch(e_interpret_ctx->reg_arch); + Rng1U64 legal_range = r1u64(0, regs_size); + Rng1U64 read_range = intersect_1u64(legal_range, range); + U64 read_size = dim_1u64(read_range); + MemoryCopy(out, (U8 *)f->regs + read_range.min, read_size); + result = (read_size == dim_1u64(range)); + } + scratch_end(scratch); + }break; + } +#endif + return result; +} + +internal B32 +d_eval_space_write(void *u, E_Space space, void *in, Rng1U64 range) +{ + B32 result = 0; +#if 0 // TODO(rjf): @msgs + DF_Entity *entity = d_entity_from_eval_space(space); + switch(entity->kind) + { + //- rjf: default -> making commits to entity evaluation + default: + { + Temp scratch = scratch_begin(0, 0); + DF_EntityEval *eval = df_eval_from_entity(scratch.arena, entity); + U64 range_dim = dim_1u64(range); + if(range.min == OffsetOf(DF_EntityEval, enabled) && + range_dim >= 1) + { + result = 1; + B32 new_enabled = !!((U8 *)in)[0]; + df_entity_equip_disabled(entity, !new_enabled); + } + else if(range.min == eval->label_off && + range_dim >= 1) + { + result = 1; + String8 new_name = str8_cstring_capped((U8 *)in, (U8 *)in+range_dim); + df_entity_equip_name(entity, new_name); + } + else if(range.min == eval->condition_off && + range_dim >= 1) + { + result = 1; + DF_Entity *condition = df_entity_child_from_kind(entity, DF_EntityKind_Condition); + if(df_entity_is_nil(condition)) + { + condition = df_entity_alloc(entity, DF_EntityKind_Condition); + } + String8 new_name = str8_cstring_capped((U8 *)in, (U8 *)in+range_dim); + df_entity_equip_name(condition, new_name); + } + scratch_end(scratch); + }break; + + //- rjf: process -> commit to process memory + case DF_EntityKind_Process: + { + result = ctrl_process_write(entity->ctrl_handle, range, in); + }break; + + //- rjf: thread -> commit to thread's register block + case DF_EntityKind_Thread: + { + CTRL_Unwind unwind = d_query_cached_unwind_from_thread(entity); + U64 frame_idx = 0; + if(frame_idx < unwind.frames.count) + { + Temp scratch = scratch_begin(0, 0); + U64 regs_size = regs_block_size_from_arch(d_arch_from_entity(entity)); + Rng1U64 legal_range = r1u64(0, regs_size); + Rng1U64 write_range = intersect_1u64(legal_range, range); + U64 write_size = dim_1u64(write_range); + CTRL_UnwindFrame *f = &unwind.frames.v[frame_idx]; + void *new_regs = push_array(scratch.arena, U8, regs_size); + MemoryCopy(new_regs, f->regs, regs_size); + MemoryCopy((U8 *)new_regs + write_range.min, in, write_size); + result = ctrl_thread_write_reg_block(entity->ctrl_handle, new_regs); + scratch_end(scratch); + } + }break; + } +#endif + return result; +} + +//- rjf: asynchronous streamed reads -> hashes from spaces + +internal U128 +d_key_from_eval_space_range(E_Space space, Rng1U64 range, B32 zero_terminated) +{ + U128 result = {0}; + DF_Entity *entity = d_entity_from_eval_space(space); + switch(entity->kind) + { + default:{}break; + + //- rjf: nil space -> filesystem key encoded inside of `space` + case DF_EntityKind_Nil: + { + result = space.u128; + }break; + + //- rjf: process space -> query + case DF_EntityKind_Process: + { + result = ctrl_hash_store_key_from_process_vaddr_range(entity->ctrl_handle, range, zero_terminated); + }break; + } + return result; +} + +//- rjf: space -> entire range + +internal Rng1U64 +d_whole_range_from_eval_space(E_Space space) +{ + // TODO(rjf): @msgs + Rng1U64 result = r1u64(0, 0); +#if 0 + DF_Entity *entity = d_entity_from_eval_space(space); + switch(entity->kind) + { + default:{}break; + + //- rjf: nil space -> filesystem key encoded inside of `space` + case DF_EntityKind_Nil: + { + HS_Scope *scope = hs_scope_open(); + U128 hash = {0}; + for(U64 idx = 0; idx < 2; idx += 1) + { + hash = hs_hash_from_key(space.u128, idx); + if(!u128_match(hash, u128_zero())) + { + break; + } + } + String8 data = hs_data_from_hash(scope, hash); + result = r1u64(0, data.size); + hs_scope_close(scope); + }break; + case DF_EntityKind_Process: + { + result = r1u64(0, 0x7FFFFFFFFFFFull); + }break; + } +#endif + return result; +} + +//////////////////////////////// +//~ rjf: Evaluation View Visualization & Interaction + +//- rjf: writing values back to child processes + +internal B32 +d_commit_eval_value_string(E_Eval dst_eval, String8 string) +{ + B32 result = 0; + if(dst_eval.mode == E_Mode_Offset) + { + Temp scratch = scratch_begin(0, 0); + E_TypeKey type_key = e_type_unwrap(dst_eval.type_key); + E_TypeKind type_kind = e_type_kind_from_key(type_key); + E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(dst_eval.type_key))); + E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key); + String8 commit_data = {0}; + B32 commit_at_ptr_dest = 0; + if(E_TypeKind_FirstBasic <= type_kind && type_kind <= E_TypeKind_LastBasic) + { + E_Eval src_eval = e_eval_from_string(scratch.arena, string); + commit_data = push_str8_copy(scratch.arena, str8_struct(&src_eval.value)); + commit_data.size = Min(commit_data.size, e_type_byte_size_from_key(type_key)); + } + else if(type_kind == E_TypeKind_Ptr || type_kind == E_TypeKind_Array) + { + E_Eval src_eval = e_eval_from_string(scratch.arena, string); + E_Eval src_eval_value = e_value_eval_from_eval(src_eval); + E_TypeKind src_eval_value_type_kind = e_type_kind_from_key(src_eval_value.type_key); + if(type_kind == E_TypeKind_Ptr && + (e_type_kind_is_pointer_or_ref(src_eval_value_type_kind) || + e_type_kind_is_integer(src_eval_value_type_kind)) && + src_eval_value.value.u64 != 0 && src_eval_value.mode == E_Mode_Value) + { + commit_data = push_str8_copy(scratch.arena, str8_struct(&src_eval.value)); + commit_data.size = Min(commit_data.size, e_type_byte_size_from_key(type_key)); + } + else if(direct_type_kind == E_TypeKind_Char8 || + direct_type_kind == E_TypeKind_UChar8 || + e_type_kind_is_integer(direct_type_kind)) + { + if(string.size >= 1 && string.str[0] == '"') + { + string = str8_skip(string, 1); + } + if(string.size >= 1 && string.str[string.size-1] == '"') + { + string = str8_chop(string, 1); + } + commit_data = e_raw_from_escaped_string(scratch.arena, string); + commit_data.size += 1; + if(type_kind == E_TypeKind_Ptr) + { + commit_at_ptr_dest = 1; + } + } + } + if(commit_data.size != 0 && e_type_byte_size_from_key(type_key) != 0) + { + U64 dst_offset = dst_eval.value.u64; + if(dst_eval.mode == E_Mode_Offset && commit_at_ptr_dest) + { + E_Eval dst_value_eval = e_value_eval_from_eval(dst_eval); + dst_offset = dst_value_eval.value.u64; + } + result = e_space_write(dst_eval.space, commit_data.str, r1u64(dst_offset, dst_offset + commit_data.size)); + } + scratch_end(scratch); + } + return result; +} + +//- rjf: view rule config tree info extraction + +internal U64 +d_base_offset_from_eval(E_Eval eval) +{ + if(e_type_kind_is_pointer_or_ref(e_type_kind_from_key(eval.type_key))) + { + eval = e_value_eval_from_eval(eval); + } + return eval.value.u64; +} + +internal E_Value +d_value_from_params_key(MD_Node *params, String8 key) +{ + Temp scratch = scratch_begin(0, 0); + MD_Node *key_node = md_child_from_string(params, key, 0); + String8 expr = md_string_from_children(scratch.arena, key_node); + E_Eval eval = e_eval_from_string(scratch.arena, expr); + E_Eval value_eval = e_value_eval_from_eval(eval); + scratch_end(scratch); + return value_eval.value; +} + +internal Rng1U64 +d_range_from_eval_params(E_Eval eval, MD_Node *params) +{ + Temp scratch = scratch_begin(0, 0); + U64 size = d_value_from_params_key(params, str8_lit("size")).u64; + E_TypeKey type_key = e_type_unwrap(eval.type_key); + E_TypeKind type_kind = e_type_kind_from_key(type_key); + E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(eval.type_key)); + E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key); + if(size == 0 && e_type_kind_is_pointer_or_ref(type_kind) && (direct_type_kind == E_TypeKind_Struct || + direct_type_kind == E_TypeKind_Union || + direct_type_kind == E_TypeKind_Class || + direct_type_kind == E_TypeKind_Array)) + { + size = e_type_byte_size_from_key(e_type_direct_from_key(e_type_unwrap(eval.type_key))); + } + if(size == 0 && eval.mode == E_Mode_Offset && (type_kind == E_TypeKind_Struct || + type_kind == E_TypeKind_Union || + type_kind == E_TypeKind_Class || + type_kind == E_TypeKind_Array)) + { + size = e_type_byte_size_from_key(e_type_unwrap(eval.type_key)); + } + if(size == 0) + { + size = 16384; + } + Rng1U64 result = {0}; + result.min = d_base_offset_from_eval(eval); + result.max = result.min + size; + scratch_end(scratch); + return result; +} + +internal TXT_LangKind +d_lang_kind_from_eval_params(E_Eval eval, MD_Node *params) +{ + TXT_LangKind lang_kind = TXT_LangKind_Null; + if(eval.expr->kind == E_ExprKind_LeafFilePath) + { + lang_kind = txt_lang_kind_from_extension(str8_skip_last_dot(eval.expr->string)); + } + else + { + MD_Node *lang_node = md_child_from_string(params, str8_lit("lang"), 0); + String8 lang_kind_string = lang_node->first->string; + lang_kind = txt_lang_kind_from_extension(lang_kind_string); + } + return lang_kind; +} + +internal Arch +d_arch_from_eval_params(E_Eval eval, MD_Node *params) +{ + Arch arch = Arch_Null; + MD_Node *arch_node = md_child_from_string(params, str8_lit("arch"), 0); + String8 arch_kind_string = arch_node->first->string; + if(str8_match(arch_kind_string, str8_lit("x64"), StringMatchFlag_CaseInsensitive)) + { + arch = Arch_x64; + } + return arch; +} + +internal Vec2S32 +d_dim2s32_from_eval_params(E_Eval eval, MD_Node *params) +{ + Vec2S32 dim = v2s32(1, 1); + { + dim.x = d_value_from_params_key(params, str8_lit("w")).s32; + dim.y = d_value_from_params_key(params, str8_lit("h")).s32; + } + return dim; +} + +internal R_Tex2DFormat +d_tex2dformat_from_eval_params(E_Eval eval, MD_Node *params) +{ + R_Tex2DFormat result = R_Tex2DFormat_RGBA8; + { + MD_Node *fmt_node = md_child_from_string(params, str8_lit("fmt"), 0); + for(EachNonZeroEnumVal(R_Tex2DFormat, fmt)) + { + if(str8_match(r_tex2d_format_display_string_table[fmt], fmt_node->first->string, StringMatchFlag_CaseInsensitive)) + { + result = fmt; + break; + } + } + } + return result; +} + +//- rjf: eval -> entity + +internal DF_Entity * +d_entity_from_eval_string(String8 string) +{ + DF_Entity *entity = &d_nil_entity; + { + Temp scratch = scratch_begin(0, 0); + E_Eval eval = e_eval_from_string(scratch.arena, string); + entity = d_entity_from_eval_space(eval.space); + scratch_end(scratch); + } + return entity; +} + +internal String8 +d_eval_string_from_entity(Arena *arena, DF_Entity *entity) +{ + String8 eval_string = push_str8f(arena, "macro:`$%I64u`", entity->id); + return eval_string; +} + +//- rjf: eval <-> file path + +internal String8 +d_file_path_from_eval_string(Arena *arena, String8 string) +{ + String8 result = {0}; + { + Temp scratch = scratch_begin(&arena, 1); + E_Eval eval = e_eval_from_string(scratch.arena, string); + if(eval.expr->kind == E_ExprKind_LeafFilePath) + { + result = d_cfg_raw_from_escaped_string(arena, eval.expr->string); + } + scratch_end(scratch); + } + return result; +} + +internal String8 +d_eval_string_from_file_path(Arena *arena, String8 string) +{ + Temp scratch = scratch_begin(&arena, 1); + String8 string_escaped = d_cfg_escaped_from_raw_string(scratch.arena, string); + String8 result = push_str8f(arena, "file:\"%S\"", string_escaped); + scratch_end(scratch); + return result; +} + //////////////////////////////// //~ rjf: View Spec State Functions @@ -1110,8 +2572,8 @@ df_window_frame(DF_Window *ws) view = view->order_next) { DF_Entity *entity = d_entity_from_eval_string(str8(view->query_buffer, view->query_string_size)); - if(entity->flags & D_EntityFlag_MarkedForDeletion || - (d_entity_is_nil(entity) && view->spec->info.flags & DF_ViewSpecFlag_ParameterizedByEntity)) + if(entity->flags & DF_EntityFlag_MarkedForDeletion || + (df_entity_is_nil(entity) && view->spec->info.flags & DF_ViewSpecFlag_ParameterizedByEntity)) { df_cmd(DF_CmdKind_CloseTab, .panel = df_handle_from_panel(panel), @@ -1370,7 +2832,7 @@ df_window_frame(DF_Window *ws) Temp scratch = scratch_begin(0, 0); DF_DragDropPayload *payload = &df_drag_drop_payload; DF_Panel *panel = df_panel_from_handle(payload->panel); - DF_Entity *entity = d_entity_from_handle(payload->entity); + DF_Entity *entity = df_entity_from_handle(payload->entity); DF_View *view = df_view_from_handle(payload->view); { //- rjf: tab dragging @@ -1421,12 +2883,12 @@ df_window_frame(DF_Window *ws) } //- rjf: entity dragging - else if(!d_entity_is_nil(entity)) UI_Tooltip + else if(!df_entity_is_nil(entity)) UI_Tooltip { ui_set_next_pref_width(ui_children_sum(1)); UI_Row UI_HeightFill { - String8 display_name = d_display_string_from_entity(scratch.arena, entity); + String8 display_name = df_display_string_from_entity(scratch.arena, entity); DF_IconKind icon_kind = df_entity_kind_icon_kind_table[entity->kind]; DF_Font(DF_FontSlot_Icons) UI_FontSize(df_font_size_from_slot(DF_FontSlot_Icons)) @@ -1525,18 +2987,18 @@ df_window_frame(DF_Window *ws) ui_divider(ui_em(1.f, 1.f)); //- rjf: draw entity tree - D_EntityRec rec = {0}; + DF_EntityRec rec = {0}; S32 indent = 0; UI_PrefWidth(ui_text_dim(10, 1)) ui_labelf("Entity Tree:"); - for(DF_Entity *e = d_entity_root(); !d_entity_is_nil(e); e = rec.next) + for(DF_Entity *e = df_entity_root(); !df_entity_is_nil(e); e = rec.next) { ui_set_next_pref_width(ui_children_sum(1)); ui_set_next_pref_height(ui_children_sum(1)); UI_Row { ui_spacer(ui_em(2.f*indent, 1.f)); - DF_Entity *dst = d_entity_from_handle(e->entity_handle); - if(!d_entity_is_nil(dst)) + DF_Entity *dst = df_entity_from_handle(e->entity_handle); + if(!df_entity_is_nil(dst)) { ui_labelf("[link] %S -> %S", e->string, dst->string); } @@ -1545,7 +3007,7 @@ df_window_frame(DF_Window *ws) ui_labelf("%S: %S", d_entity_kind_display_string_table[e->kind], e->string); } } - rec = d_entity_rec_depth_first_pre(e, d_entity_root()); + rec = df_entity_rec_depth_first_pre(e, df_entity_root()); indent += rec.push_count; indent -= rec.pop_count; } @@ -1562,8 +3024,8 @@ df_window_frame(DF_Window *ws) //- rjf: auto-close entity ctx menu if(ui_ctx_menu_is_open(df_state->entity_ctx_menu_key)) { - DF_Entity *entity = d_entity_from_handle(ws->entity_ctx_menu_entity); - if(d_entity_is_nil(entity)) + DF_Entity *entity = df_entity_from_handle(ws->entity_ctx_menu_entity); + if(df_entity_is_nil(entity)) { ui_ctx_menu_close(); } @@ -1699,11 +3161,11 @@ df_window_frame(DF_Window *ws) UI_PrefWidth(ui_em(40.f, 1.f)) DF_Palette(DF_PaletteCode_ImplicitButton) { - DF_Entity *entity = d_entity_from_handle(ws->entity_ctx_menu_entity); + DF_Entity *entity = df_entity_from_handle(ws->entity_ctx_menu_entity); CTRL_Entity *entity_ctrl = ctrl_entity_from_handle(d_state->ctrl_entity_store, entity->ctrl_handle); DF_IconKind entity_icon = df_entity_kind_icon_kind_table[entity->kind]; DF_EntityKindFlags kind_flags = d_entity_kind_flags_table[entity->kind]; - String8 display_name = d_display_string_from_entity(scratch.arena, entity); + String8 display_name = df_display_string_from_entity(scratch.arena, entity); // rjf: title UI_Row @@ -1721,9 +3183,9 @@ df_window_frame(DF_Window *ws) ui_label(d_entity_kind_display_string_table[entity->kind]); { UI_Palette *palette = ui_top_palette(); - if(entity->flags & D_EntityFlag_HasColor) + if(entity->flags & DF_EntityFlag_HasColor) { - palette = ui_build_palette(ui_top_palette(), .text = d_rgba_from_entity(entity)); + palette = ui_build_palette(ui_top_palette(), .text = df_rgba_from_entity(entity)); } UI_Palette(palette) UI_PrefWidth(ui_text_dim(10, 1)) @@ -1741,7 +3203,7 @@ df_window_frame(DF_Window *ws) if(ui_committed(sig)) { df_cmd(DF_CmdKind_NameEntity, - .entity = d_handle_from_entity(entity), + .entity = df_handle_from_entity(entity), .string = str8(ws->entity_ctx_menu_input_buffer, ws->entity_ctx_menu_input_size)); } } @@ -1751,22 +3213,22 @@ df_window_frame(DF_Window *ws) DF_Font(DF_FontSlot_Code) UI_TextPadding(ui_top_font_size()*1.5f) { - DF_Entity *condition = d_entity_child_from_kind(entity, DF_EntityKind_Condition); + DF_Entity *condition = df_entity_child_from_kind(entity, DF_EntityKind_Condition); UI_Signal sig = df_line_editf(DF_LineEditFlag_Border|DF_LineEditFlag_CodeContents, 0, 0, &ws->entity_ctx_menu_input_cursor, &ws->entity_ctx_menu_input_mark, ws->entity_ctx_menu_input_buffer, sizeof(ws->entity_ctx_menu_input_buffer), &ws->entity_ctx_menu_input_size, 0, condition->string, "Condition###entity_cond_edit_%p", entity); if(ui_committed(sig)) { String8 new_string = str8(ws->entity_ctx_menu_input_buffer, ws->entity_ctx_menu_input_size); if(new_string.size != 0) { - if(d_entity_is_nil(condition)) + if(df_entity_is_nil(condition)) { - condition = d_entity_alloc(entity, DF_EntityKind_Condition); + condition = df_entity_alloc(entity, DF_EntityKind_Condition); } - df_cmd(DF_CmdKind_NameEntity, .entity = d_handle_from_entity(condition), .string = new_string); + df_cmd(DF_CmdKind_NameEntity, .entity = df_handle_from_entity(condition), .string = new_string); } - else if(!d_entity_is_nil(condition)) + else if(!df_entity_is_nil(condition)) { - d_entity_mark_for_deletion(condition); + df_entity_mark_for_deletion(condition); } } } @@ -1774,22 +3236,22 @@ df_window_frame(DF_Window *ws) // rjf: exe editor if(entity->kind == DF_EntityKind_Target) UI_TextPadding(ui_top_font_size()*1.5f) { - DF_Entity *exe = d_entity_child_from_kind(entity, DF_EntityKind_Executable); + DF_Entity *exe = df_entity_child_from_kind(entity, DF_EntityKind_Executable); UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &ws->entity_ctx_menu_input_cursor, &ws->entity_ctx_menu_input_mark, ws->entity_ctx_menu_input_buffer, sizeof(ws->entity_ctx_menu_input_buffer), &ws->entity_ctx_menu_input_size, 0, exe->string, "Executable###entity_exe_edit_%p", entity); if(ui_committed(sig)) { String8 new_string = str8(ws->entity_ctx_menu_input_buffer, ws->entity_ctx_menu_input_size); if(new_string.size != 0) { - if(d_entity_is_nil(exe)) + if(df_entity_is_nil(exe)) { - exe = d_entity_alloc(entity, DF_EntityKind_Executable); + exe = df_entity_alloc(entity, DF_EntityKind_Executable); } - df_cmd(DF_CmdKind_NameEntity, .entity = d_handle_from_entity(exe), .string = new_string); + df_cmd(DF_CmdKind_NameEntity, .entity = df_handle_from_entity(exe), .string = new_string); } - else if(!d_entity_is_nil(exe)) + else if(!df_entity_is_nil(exe)) { - d_entity_mark_for_deletion(exe); + df_entity_mark_for_deletion(exe); } } } @@ -1797,22 +3259,22 @@ df_window_frame(DF_Window *ws) // rjf: arguments editors if(entity->kind == DF_EntityKind_Target) UI_TextPadding(ui_top_font_size()*1.5f) { - DF_Entity *args = d_entity_child_from_kind(entity, DF_EntityKind_Arguments); + DF_Entity *args = df_entity_child_from_kind(entity, DF_EntityKind_Arguments); UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &ws->entity_ctx_menu_input_cursor, &ws->entity_ctx_menu_input_mark, ws->entity_ctx_menu_input_buffer, sizeof(ws->entity_ctx_menu_input_buffer), &ws->entity_ctx_menu_input_size, 0, args->string, "Arguments###entity_args_edit_%p", entity); if(ui_committed(sig)) { String8 new_string = str8(ws->entity_ctx_menu_input_buffer, ws->entity_ctx_menu_input_size); if(new_string.size != 0) { - if(d_entity_is_nil(args)) + if(df_entity_is_nil(args)) { - args = d_entity_alloc(entity, DF_EntityKind_Arguments); + args = df_entity_alloc(entity, DF_EntityKind_Arguments); } - df_cmd(DF_CmdKind_NameEntity, .entity = d_handle_from_entity(args), .string = new_string); + df_cmd(DF_CmdKind_NameEntity, .entity = df_handle_from_entity(args), .string = new_string); } - else if(!d_entity_is_nil(args)) + else if(!df_entity_is_nil(args)) { - d_entity_mark_for_deletion(args); + df_entity_mark_for_deletion(args); } } } @@ -1827,27 +3289,27 @@ df_window_frame(DF_Window *ws) // rjf: is command line only? -> make permanent if(entity->cfg_src == D_CfgSrc_CommandLine && ui_clicked(df_icon_buttonf(DF_IconKind_Save, 0, "Save To Project"))) { - d_entity_equip_cfg_src(entity, D_CfgSrc_Project); + df_entity_equip_cfg_src(entity, D_CfgSrc_Project); } // rjf: duplicate if(kind_flags & DF_EntityKindFlag_CanDuplicate && ui_clicked(df_icon_buttonf(DF_IconKind_XSplit, 0, "Duplicate"))) { - df_cmd(DF_CmdKind_DuplicateEntity, .entity = d_handle_from_entity(entity)); + df_cmd(DF_CmdKind_DuplicateEntity, .entity = df_handle_from_entity(entity)); ui_ctx_menu_close(); } // rjf: edit if(kind_flags & DF_EntityKindFlag_CanEdit && ui_clicked(df_icon_buttonf(DF_IconKind_Pencil, 0, "Edit"))) { - df_cmd(DF_CmdKind_EditEntity, .entity = d_handle_from_entity(entity)); + df_cmd(DF_CmdKind_EditEntity, .entity = df_handle_from_entity(entity)); ui_ctx_menu_close(); } // rjf: deletion if(kind_flags & DF_EntityKindFlag_CanDelete && ui_clicked(df_icon_buttonf(DF_IconKind_Trash, 0, "Delete"))) { - df_cmd(DF_CmdKind_RemoveEntity, .entity = d_handle_from_entity(entity)); + df_cmd(DF_CmdKind_RemoveEntity, .entity = df_handle_from_entity(entity)); ui_ctx_menu_close(); } @@ -1857,11 +3319,11 @@ df_window_frame(DF_Window *ws) B32 is_enabled = !entity->disabled; if(!is_enabled && ui_clicked(df_icon_buttonf(DF_IconKind_CheckHollow, 0, "Enable###enabler"))) { - df_cmd(DF_CmdKind_EnableEntity, .entity = d_handle_from_entity(entity)); + df_cmd(DF_CmdKind_EnableEntity, .entity = df_handle_from_entity(entity)); } if(is_enabled && ui_clicked(df_icon_buttonf(DF_IconKind_CheckFilled, 0, "Disable###enabler"))) { - df_cmd(DF_CmdKind_DisableEntity, .entity = d_handle_from_entity(entity)); + df_cmd(DF_CmdKind_DisableEntity, .entity = df_handle_from_entity(entity)); } } @@ -1872,18 +3334,18 @@ df_window_frame(DF_Window *ws) ui_set_next_palette(df_palette_from_code(is_frozen ? DF_PaletteCode_NegativePopButton : DF_PaletteCode_PositivePopButton)); if(is_frozen && ui_clicked(df_icon_buttonf(DF_IconKind_Locked, 0, "Thaw###freeze_thaw"))) { - df_cmd(DF_CmdKind_ThawEntity, .entity = d_handle_from_entity(entity)); + df_cmd(DF_CmdKind_ThawEntity, .entity = df_handle_from_entity(entity)); } if(!is_frozen && ui_clicked(df_icon_buttonf(DF_IconKind_Unlocked, 0, "Freeze###freeze_thaw"))) { - df_cmd(DF_CmdKind_FreezeEntity, .entity = d_handle_from_entity(entity)); + df_cmd(DF_CmdKind_FreezeEntity, .entity = df_handle_from_entity(entity)); } } // rjf: go-to-location { - DF_Entity *loc = d_entity_child_from_kind(entity, DF_EntityKind_Location); - if(!d_entity_is_nil(loc) && ui_clicked(df_icon_buttonf(DF_IconKind_FileOutline, 0, "Go To Location"))) + DF_Entity *loc = df_entity_child_from_kind(entity, DF_EntityKind_Location); + if(!df_entity_is_nil(loc) && ui_clicked(df_icon_buttonf(DF_IconKind_FileOutline, 0, "Go To Location"))) { df_cmd(DF_CmdKind_FindCodeLocation, .file_path = loc->string, @@ -1992,7 +3454,7 @@ df_window_frame(DF_Window *ws) { if(ui_clicked(df_icon_buttonf(DF_IconKind_FileOutline, 0, "Find"))) { - df_cmd(DF_CmdKind_FindThread, .entity = d_handle_from_entity(entity)); + df_cmd(DF_CmdKind_FindThread, .entity = df_handle_from_entity(entity)); ui_ctx_menu_close(); } } @@ -2032,12 +3494,12 @@ df_window_frame(DF_Window *ws) { if(ui_clicked(df_icon_buttonf(DF_IconKind_Play, 0, "Launch And Run"))) { - df_cmd(DF_CmdKind_LaunchAndRun, .entity = d_handle_from_entity(entity)); + df_cmd(DF_CmdKind_LaunchAndRun, .entity = df_handle_from_entity(entity)); ui_ctx_menu_close(); } if(ui_clicked(df_icon_buttonf(DF_IconKind_PlayStepForward, 0, "Launch And Initialize"))) { - df_cmd(DF_CmdKind_LaunchAndInit, .entity = d_handle_from_entity(entity)); + df_cmd(DF_CmdKind_LaunchAndInit, .entity = df_handle_from_entity(entity)); ui_ctx_menu_close(); } }break; @@ -2047,7 +3509,7 @@ df_window_frame(DF_Window *ws) // rjf: color editor { - B32 entity_has_color = entity->flags & D_EntityFlag_HasColor; + B32 entity_has_color = entity->flags & DF_EntityFlag_HasColor; if(entity_has_color) { UI_Padding(ui_em(1.5f, 1.f)) @@ -2108,7 +3570,7 @@ df_window_frame(DF_Window *ws) { if(ui_clicked(df_icon_buttonf(DF_IconKind_Trash, 0, "Remove Color###color_toggle"))) { - entity->flags &= ~D_EntityFlag_HasColor; + entity->flags &= ~DF_EntityFlag_HasColor; } } @@ -2116,7 +3578,7 @@ df_window_frame(DF_Window *ws) } if(!entity_has_color && ui_clicked(df_icon_buttonf(DF_IconKind_Palette, 0, "Apply Color###color_toggle"))) { - d_entity_equip_color_rgba(entity, v4f32(1, 1, 1, 1)); + df_entity_equip_color_rgba(entity, v4f32(1, 1, 1, 1)); } } } @@ -2850,21 +4312,21 @@ df_window_frame(DF_Window *ws) Assert(ArrayCount(codepoints) == ArrayCount(cmds)); df_cmd_list_menu_buttons(ArrayCount(cmds), cmds, codepoints); DF_Palette(DF_PaletteCode_Floating) ui_divider(ui_em(1.f, 1.f)); - D_EntityList targets_list = d_query_cached_entity_list_with_kind(DF_EntityKind_Target); - for(D_EntityNode *n = targets_list.first; n != 0; n = n->next) + DF_EntityList targets_list = d_query_cached_entity_list_with_kind(DF_EntityKind_Target); + for(DF_EntityNode *n = targets_list.first; n != 0; n = n->next) { DF_Entity *target = n->entity; UI_Palette *palette = ui_top_palette(); - if(target->flags & D_EntityFlag_HasColor) + if(target->flags & DF_EntityFlag_HasColor) { - palette = ui_build_palette(ui_top_palette(), .text = d_rgba_from_entity(target)); + palette = ui_build_palette(ui_top_palette(), .text = df_rgba_from_entity(target)); } - String8 target_name = d_display_string_from_entity(scratch.arena, target); + String8 target_name = df_display_string_from_entity(scratch.arena, target); UI_Signal sig = {0}; UI_Palette(palette) sig = df_icon_buttonf(DF_IconKind_Target, 0, "%S##%p", target_name, target); if(ui_clicked(sig)) { - df_cmd(DF_CmdKind_EditTarget, .entity = d_handle_from_entity(target)); + df_cmd(DF_CmdKind_EditTarget, .entity = df_handle_from_entity(target)); ui_ctx_menu_close(); ws->menu_bar_focused = 0; } @@ -3055,8 +4517,8 @@ df_window_frame(DF_Window *ws) DF_Palette(DF_PaletteCode_NeutralPopButton) { Temp scratch = scratch_begin(0, 0); - D_EntityList tasks = d_query_cached_entity_list_with_kind(DF_EntityKind_ConversionTask); - for(D_EntityNode *n = tasks.first; n != 0; n = n->next) + DF_EntityList tasks = d_query_cached_entity_list_with_kind(DF_EntityKind_ConversionTask); + for(DF_EntityNode *n = tasks.first; n != 0; n = n->next) { DF_Entity *task = n->entity; if(task->alloc_time_us + 500000 < os_now_microseconds()) @@ -3086,8 +4548,8 @@ df_window_frame(DF_Window *ws) UI_FontSize(ui_top_font_size()*0.85f) { Temp scratch = scratch_begin(0, 0); - D_EntityList targets = d_push_active_target_list(scratch.arena); - D_EntityList processes = d_query_cached_entity_list_with_kind(DF_EntityKind_Process); + DF_EntityList targets = d_push_active_target_list(scratch.arena); + DF_EntityList processes = d_query_cached_entity_list_with_kind(DF_EntityKind_Process); B32 have_targets = targets.count != 0; B32 can_send_signal = !d_ctrl_targets_running(); B32 can_play = (have_targets && (can_send_signal || d_ctrl_last_run_frame_idx()+4 > df_state->frame_index)); @@ -3123,9 +4585,9 @@ df_window_frame(DF_Window *ws) else { ui_labelf("Launch all active targets:"); - for(D_EntityNode *n = targets.first; n != 0; n = n->next) + for(DF_EntityNode *n = targets.first; n != 0; n = n->next) { - String8 target_display_name = d_display_string_from_entity(scratch.arena, n->entity); + String8 target_display_name = df_display_string_from_entity(scratch.arena, n->entity); ui_label(target_display_name); } } @@ -3151,14 +4613,14 @@ df_window_frame(DF_Window *ws) { ui_labelf("Restart all running targets:"); { - D_EntityList processes = d_query_cached_entity_list_with_kind(DF_EntityKind_Process); - for(D_EntityNode *n = processes.first; n != 0; n = n->next) + DF_EntityList processes = d_query_cached_entity_list_with_kind(DF_EntityKind_Process); + for(DF_EntityNode *n = processes.first; n != 0; n = n->next) { DF_Entity *process = n->entity; - DF_Entity *target = d_entity_from_handle(process->entity_handle); - if(!d_entity_is_nil(target)) + DF_Entity *target = df_entity_from_handle(process->entity_handle); + if(!df_entity_is_nil(target)) { - String8 target_display_name = d_display_string_from_entity(scratch.arena, target); + String8 target_display_name = df_display_string_from_entity(scratch.arena, target); ui_label(target_display_name); } } @@ -5230,7 +6692,7 @@ df_window_frame(DF_Window *ws) { DF_Panel *src_panel = df_panel_from_handle(payload.panel); DF_View *view = df_view_from_handle(payload.view); - DF_Entity *entity = d_entity_from_handle(payload.entity); + DF_Entity *entity = df_entity_from_handle(payload.entity); // rjf: view drop if(!df_view_is_nil(view)) @@ -5243,12 +6705,12 @@ df_window_frame(DF_Window *ws) } // rjf: entity drop - if(!d_entity_is_nil(entity)) + if(!df_entity_is_nil(entity)) { df_cmd(DF_CmdKind_SpawnEntityView, .panel = df_handle_from_panel(panel), .cursor = payload.text_point, - .entity = d_handle_from_entity(entity)); + .entity = df_handle_from_entity(entity)); } } } @@ -7253,13 +8715,13 @@ df_stop_explanation_string_icon_from_ctrl_event(Arena *arena, CTRL_Event *event, DF_IconKind icon = DF_IconKind_Null; String8 explanation = {0}; Temp scratch = scratch_begin(&arena, 1); - DF_Entity *thread = d_entity_from_ctrl_handle(event->entity); - String8 thread_display_string = d_display_string_from_entity(scratch.arena, thread); + DF_Entity *thread = df_entity_from_ctrl_handle(event->entity); + String8 thread_display_string = df_display_string_from_entity(scratch.arena, thread); String8 process_thread_string = thread_display_string; - DF_Entity *process = d_entity_ancestor_from_kind(thread, DF_EntityKind_Process); + DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); if(process->kind == DF_EntityKind_Process) { - String8 process_display_string = d_display_string_from_entity(scratch.arena, process); + String8 process_display_string = df_display_string_from_entity(scratch.arena, process); process_thread_string = push_str8f(scratch.arena, "%S: %S", process_display_string, thread_display_string); } switch(event->kind) @@ -7271,7 +8733,7 @@ df_stop_explanation_string_icon_from_ctrl_event(Arena *arena, CTRL_Event *event, default:{}break; case CTRL_EventCause_Finished: { - if(!d_entity_is_nil(thread)) + if(!df_entity_is_nil(thread)) { explanation = push_str8f(arena, "%S completed step", process_thread_string); } @@ -7282,7 +8744,7 @@ df_stop_explanation_string_icon_from_ctrl_event(Arena *arena, CTRL_Event *event, }break; case CTRL_EventCause_UserBreakpoint: { - if(!d_entity_is_nil(thread)) + if(!df_entity_is_nil(thread)) { icon = DF_IconKind_CircleFilled; explanation = push_str8f(arena, "%S hit a breakpoint", process_thread_string); @@ -7290,7 +8752,7 @@ df_stop_explanation_string_icon_from_ctrl_event(Arena *arena, CTRL_Event *event, }break; case CTRL_EventCause_InterruptedByException: { - if(!d_entity_is_nil(thread)) + if(!df_entity_is_nil(thread)) { icon = DF_IconKind_WarningBig; switch(event->exception_kind) @@ -7382,6 +8844,64 @@ df_cfg_path_from_src(D_CfgSrc src) return df_state->cfg_paths[src]; } +//- rjf: entity cache queries + +internal DF_EntityList +d_query_cached_entity_list_with_kind(DF_EntityKind kind) +{ + ProfBeginFunction(); + D_EntityListCache *cache = &df_state->kind_caches[kind]; + + // rjf: build cached list if we're out-of-date + if(cache->alloc_gen != df_state->kind_alloc_gens[kind]) + { + cache->alloc_gen = df_state->kind_alloc_gens[kind]; + if(cache->arena == 0) + { + cache->arena = arena_alloc(); + } + arena_clear(cache->arena); + cache->list = df_push_entity_list_with_kind(cache->arena, kind); + } + + // rjf: grab & return cached list + DF_EntityList result = cache->list; + ProfEnd(); + return result; +} + +internal DF_EntityList +d_push_active_target_list(Arena *arena) +{ + DF_EntityList active_targets = {0}; + DF_EntityList all_targets = d_query_cached_entity_list_with_kind(DF_EntityKind_Target); + for(DF_EntityNode *n = all_targets.first; n != 0; n = n->next) + { + if(!n->entity->disabled) + { + df_entity_list_push(arena, &active_targets, n->entity); + } + } + return active_targets; +} + +internal DF_Entity * +d_entity_from_ev_key_and_kind(EV_Key key, DF_EntityKind kind) +{ + DF_Entity *result = &d_nil_entity; + DF_EntityList list = d_query_cached_entity_list_with_kind(kind); + for(DF_EntityNode *n = list.first; n != 0; n = n->next) + { + DF_Entity *entity = n->entity; + if(ev_key_match(df_ev_key_from_entity(entity), key)) + { + result = entity; + break; + } + } + return result; +} + //- rjf: config state internal D_CfgTable * @@ -7619,6 +9139,11 @@ df_init(CmdLine *cmdln) df_state->num_frames_requested = 2; df_state->seconds_until_autosave = 0.5f; df_state->cmds_arena = arena_alloc(); + df_state->entities_arena = arena_alloc(.reserve_size = GB(64), .commit_size = KB(64)); + df_state->entities_root = &d_nil_entity; + df_state->entities_base = push_array(df_state->entities_arena, DF_Entity, 0); + df_state->entities_count = 0; + df_state->entities_root = df_entity_alloc(&d_nil_entity, DF_EntityKind_Root); df_state->key_map_arena = arena_alloc(); df_state->confirm_arena = arena_alloc(); df_state->view_spec_table_size = 256; @@ -7637,6 +9162,13 @@ df_init(CmdLine *cmdln) df_state->top_regs = &df_state->base_regs; df_clear_bindings(); + // rjf: set up initial entities + { + DF_Entity *local_machine = df_entity_alloc(df_state->entities_root, DF_EntityKind_Machine); + df_entity_equip_ctrl_handle(local_machine, ctrl_handle_make(CTRL_MachineID_Local, dmn_handle_zero())); + df_entity_equip_name(local_machine, str8_lit("This PC")); + } + // rjf: register gfx layer views { DF_ViewSpecInfoArray array = {df_g_gfx_view_kind_spec_info_table, ArrayCount(df_g_gfx_view_kind_spec_info_table)}; @@ -8151,8 +9683,8 @@ df_frame(void) }; for(U64 idx = 0; idx < ArrayCount(evallable_kinds); idx += 1) { - D_EntityList entities = d_query_cached_entity_list_with_kind(evallable_kinds[idx]); - for(D_EntityNode *n = entities.first; n != 0; n = n->next) + DF_EntityList entities = d_query_cached_entity_list_with_kind(evallable_kinds[idx]); + for(DF_EntityNode *n = entities.first; n != 0; n = n->next) { DF_Entity *entity = n->entity; E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); @@ -8169,8 +9701,8 @@ df_frame(void) } //- rjf: add macros for all watches which define identifiers - D_EntityList watches = d_query_cached_entity_list_with_kind(DF_EntityKind_Watch); - for(D_EntityNode *n = watches.first; n != 0; n = n->next) + DF_EntityList watches = d_query_cached_entity_list_with_kind(DF_EntityKind_Watch); + for(DF_EntityNode *n = watches.first; n != 0; n = n->next) { DF_Entity *watch = n->entity; String8 expr = watch->string; @@ -8432,7 +9964,7 @@ df_frame(void) //- rjf: config path saving/loading/applying case DF_CmdKind_OpenRecentProject: { - DF_Entity *entity = d_entity_from_handle(df_regs()->entity); + DF_Entity *entity = df_entity_from_handle(df_regs()->entity); if(entity->kind == DF_EntityKind_RecentProject) { df_cmd(DF_CmdKind_OpenProject, .file_path = entity->string); @@ -8607,9 +10139,9 @@ df_frame(void) //- rjf: keep track of recent projects if(src == D_CfgSrc_Project) { - D_EntityList recent_projects = d_query_cached_entity_list_with_kind(DF_EntityKind_RecentProject); + DF_EntityList recent_projects = d_query_cached_entity_list_with_kind(DF_EntityKind_RecentProject); DF_Entity *recent_project = &d_nil_entity; - for(D_EntityNode *n = recent_projects.first; n != 0; n = n->next) + for(DF_EntityNode *n = recent_projects.first; n != 0; n = n->next) { if(path_match_normalized(cfg_path, n->entity->string)) { @@ -8617,11 +10149,11 @@ df_frame(void) break; } } - if(d_entity_is_nil(recent_project)) + if(df_entity_is_nil(recent_project)) { - recent_project = d_entity_alloc(d_entity_root(), DF_EntityKind_RecentProject); - d_entity_equip_name(recent_project, path_normalized_from_string(scratch.arena, cfg_path)); - d_entity_equip_cfg_src(recent_project, D_CfgSrc_User); + recent_project = df_entity_alloc(df_entity_root(), DF_EntityKind_RecentProject); + df_entity_equip_name(recent_project, path_normalized_from_string(scratch.arena, cfg_path)); + df_entity_equip_cfg_src(recent_project, D_CfgSrc_User); } } @@ -8632,12 +10164,12 @@ df_frame(void) DF_EntityKindFlags k_flags = d_entity_kind_flags_table[k]; if(k_flags & DF_EntityKindFlag_IsSerializedToConfig) { - D_EntityList entities = d_query_cached_entity_list_with_kind(k); - for(D_EntityNode *n = entities.first; n != 0; n = n->next) + DF_EntityList entities = d_query_cached_entity_list_with_kind(k); + for(DF_EntityNode *n = entities.first; n != 0; n = n->next) { if(n->entity->cfg_src == src) { - d_entity_mark_for_deletion(n->entity); + df_entity_mark_for_deletion(n->entity); } } } @@ -8660,8 +10192,8 @@ df_frame(void) { continue; } - DF_Entity *entity = d_entity_alloc(d_entity_root(), k); - d_entity_equip_cfg_src(entity, k_tree->source); + DF_Entity *entity = df_entity_alloc(df_entity_root(), k); + df_entity_equip_cfg_src(entity, k_tree->source); // rjf: iterate config tree typedef struct Task Task; @@ -8687,7 +10219,7 @@ df_frame(void) { string = path_absolute_dst_from_relative_dst_src(scratch.arena, string, cfg_folder); } - d_entity_equip_name(t->entity, string); + df_entity_equip_name(t->entity, string); } // rjf: standalone string literals under an entity, with a numeric child -> name & text location @@ -8698,11 +10230,11 @@ df_frame(void) { string = path_absolute_dst_from_relative_dst_src(scratch.arena, string, cfg_folder); } - d_entity_equip_name(t->entity, string); + df_entity_equip_name(t->entity, string); S64 line = 0; try_s64_from_str8_c_rules(child->first->string, &line); TxtPt pt = txt_pt(line, 1); - d_entity_equip_txt_pt(t->entity, pt); + df_entity_equip_txt_pt(t->entity, pt); } // rjf: standalone hex literals under an entity -> vaddr @@ -8710,7 +10242,7 @@ df_frame(void) { U64 vaddr = 0; try_u64_from_str8_c_rules(child->string, &vaddr); - d_entity_equip_vaddr(t->entity, vaddr); + df_entity_equip_vaddr(t->entity, vaddr); } // rjf: specifically named entity equipment @@ -8723,17 +10255,17 @@ df_frame(void) { string = path_absolute_dst_from_relative_dst_src(scratch.arena, string, cfg_folder); } - d_entity_equip_name(t->entity, string); + df_entity_equip_name(t->entity, string); } if((str8_match(child->string, str8_lit("active"), StringMatchFlag_CaseInsensitive) || str8_match(child->string, str8_lit("enabled"), StringMatchFlag_CaseInsensitive)) && child->first != &md_nil_node) { - d_entity_equip_disabled(t->entity, !str8_match(child->first->string, str8_lit("1"), 0)); + df_entity_equip_disabled(t->entity, !str8_match(child->first->string, str8_lit("1"), 0)); } if(str8_match(child->string, str8_lit("disabled"), StringMatchFlag_CaseInsensitive) && child->first != &md_nil_node) { - d_entity_equip_disabled(t->entity, str8_match(child->first->string, str8_lit("1"), 0)); + df_entity_equip_disabled(t->entity, str8_match(child->first->string, str8_lit("1"), 0)); } if(str8_match(child->string, str8_lit("hsva"), StringMatchFlag_CaseInsensitive) && child->first != &md_nil_node) { @@ -8742,20 +10274,20 @@ df_frame(void) hsva.y = (F32)f64_from_str8(child->first->next->string); hsva.z = (F32)f64_from_str8(child->first->next->next->string); hsva.w = (F32)f64_from_str8(child->first->next->next->next->string); - d_entity_equip_color_hsva(t->entity, hsva); + df_entity_equip_color_hsva(t->entity, hsva); } if(str8_match(child->string, str8_lit("color"), StringMatchFlag_CaseInsensitive) && child->first != &md_nil_node) { Vec4F32 rgba = rgba_from_hex_string_4f32(child->first->string); Vec4F32 hsva = hsva_from_rgba(rgba); - d_entity_equip_color_hsva(t->entity, hsva); + df_entity_equip_color_hsva(t->entity, hsva); } if(str8_match(child->string, str8_lit("line"), StringMatchFlag_CaseInsensitive) && child->first != &md_nil_node) { S64 line = 0; try_s64_from_str8_c_rules(child->first->string, &line); TxtPt pt = txt_pt(line, 1); - d_entity_equip_txt_pt(t->entity, pt); + df_entity_equip_txt_pt(t->entity, pt); } if((str8_match(child->string, str8_lit("vaddr"), StringMatchFlag_CaseInsensitive) || str8_match(child->string, str8_lit("addr"), StringMatchFlag_CaseInsensitive)) && @@ -8763,7 +10295,7 @@ df_frame(void) { U64 vaddr = 0; try_u64_from_str8_c_rules(child->first->string, &vaddr); - d_entity_equip_vaddr(t->entity, vaddr); + df_entity_equip_vaddr(t->entity, vaddr); } // rjf: sub-entity -> create new task @@ -8776,7 +10308,7 @@ df_frame(void) { Task *task = push_array(scratch.arena, Task, 1); task->next = t->next; - task->entity = d_entity_alloc(t->entity, k2); + task->entity = df_entity_alloc(t->entity, k2); task->n = child; t->next = task; break; @@ -9761,7 +11293,7 @@ df_frame(void) { #if 0 // TODO(rjf): @msgs // rjf: unpack args - DF_Entity *map = d_entity_from_handle(df_regs()->entity); + DF_Entity *map = df_entity_from_handle(df_regs()->entity); String8 path = path_normalized_from_string(scratch.arena, df_regs()->file_path); String8 path_folder = str8_chop_last_slash(path); String8 path_file = str8_skip_last_slash(path); @@ -9772,36 +11304,36 @@ df_frame(void) default:{}break; case DF_CmdKind_SetFileOverrideLinkSrc: { - DF_Entity *map_parent = (df_regs()->file_path.size != 0) ? d_entity_from_path(path_folder, D_EntityFromPathFlag_OpenAsNeeded|D_EntityFromPathFlag_OpenMissing) : d_entity_root(); - if(d_entity_is_nil(map)) + DF_Entity *map_parent = (df_regs()->file_path.size != 0) ? d_entity_from_path(path_folder, D_EntityFromPathFlag_OpenAsNeeded|D_EntityFromPathFlag_OpenMissing) : df_entity_root(); + if(df_entity_is_nil(map)) { - map = d_entity_alloc(map_parent, DF_EntityKind_FilePathMap); + map = df_entity_alloc(map_parent, DF_EntityKind_FilePathMap); } else { - d_entity_change_parent(map, map->parent, map_parent, &d_nil_entity); + df_entity_change_parent(map, map->parent, map_parent, &d_nil_entity); } - d_entity_equip_name(map, path_file); + df_entity_equip_name(map, path_file); }break; case DF_CmdKind_SetFileOverrideLinkDst: { - if(d_entity_is_nil(map)) + if(df_entity_is_nil(map)) { - map = d_entity_alloc(d_entity_root(), DF_EntityKind_FilePathMap); + map = df_entity_alloc(df_entity_root(), DF_EntityKind_FilePathMap); } DF_Entity *map_dst_entity = &d_nil_entity; if(df_regs()->file_path.size != 0) { map_dst_entity = d_entity_from_path(path, D_EntityFromPathFlag_All); } - d_entity_equip_entity_handle(map, d_handle_from_entity(map_dst_entity)); + df_entity_equip_entity_handle(map, df_handle_from_entity(map_dst_entity)); }break; } // rjf: empty src/dest -> delete - if(!d_entity_is_nil(map) && map->string.size == 0 && d_entity_is_nil(d_entity_from_handle(map->entity_handle))) + if(!df_entity_is_nil(map) && map->string.size == 0 && df_entity_is_nil(df_entity_from_handle(map->entity_handle))) { - d_entity_mark_for_deletion(map); + df_entity_mark_for_deletion(map); } #endif }break; @@ -9827,13 +11359,13 @@ df_frame(void) #if 0 // TODO(rjf): @msgs //- rjf: grab src file & chosen replacement - DF_Entity *file = d_entity_from_handle(params.entity); + DF_Entity *file = df_entity_from_handle(params.entity); DF_Entity *replacement = d_entity_from_path(params.file_path, D_EntityFromPathFlag_OpenAsNeeded|D_EntityFromPathFlag_OpenMissing); //- rjf: find DF_Entity *first_diff_src = file; DF_Entity *first_diff_dst = replacement; - for(;!d_entity_is_nil(first_diff_src) && !d_entity_is_nil(first_diff_dst);) + for(;!df_entity_is_nil(first_diff_src) && !df_entity_is_nil(first_diff_dst);) { if(!str8_match(first_diff_src->string, first_diff_dst->string, StringMatchFlag_CaseInsensitive) || first_diff_src->parent->kind != DF_EntityKind_File || @@ -9848,15 +11380,15 @@ df_frame(void) } //- rjf: override first different - if(!d_entity_is_nil(first_diff_src) && !d_entity_is_nil(first_diff_dst)) + if(!df_entity_is_nil(first_diff_src) && !df_entity_is_nil(first_diff_dst)) { - DF_Entity *link = d_entity_child_from_string_and_kind(first_diff_src->parent, first_diff_src->name, DF_EntityKind_FilePathMap); - if(d_entity_is_nil(link)) + DF_Entity *link = df_entity_child_from_string_and_kind(first_diff_src->parent, first_diff_src->name, DF_EntityKind_FilePathMap); + if(df_entity_is_nil(link)) { - link = d_entity_alloc(first_diff_src->parent, DF_EntityKind_FilePathMap); - d_entity_equip_name(link, first_diff_src->name); + link = df_entity_alloc(first_diff_src->parent, DF_EntityKind_FilePathMap); + df_entity_equip_name(link, first_diff_src->name); } - d_entity_equip_entity_handle(link, d_handle_from_entity(first_diff_dst)); + df_entity_equip_entity_handle(link, df_handle_from_entity(first_diff_dst)); } #endif }break; @@ -10016,13 +11548,13 @@ df_frame(void) DF_Entity *entity = &d_nil_entity; if(spec->info.flags & DF_ViewSpecFlag_ParameterizedByEntity) { - entity = d_entity_from_handle(df_regs()->entity); + entity = df_entity_from_handle(df_regs()->entity); } if(!df_panel_is_nil(panel) && spec != &df_nil_view_spec) { DF_View *view = df_view_alloc(); String8 query = {0}; - if(!d_entity_is_nil(entity)) + if(!df_entity_is_nil(entity)) { query = d_eval_string_from_entity(scratch.arena, entity); } @@ -10112,8 +11644,8 @@ df_frame(void) for(DF_View *v = panel->first_tab_view; !df_view_is_nil(v); v = v->next) { if(df_view_is_project_filtered(v)) { continue; } - DF_Entity *v_param_entity = d_entity_from_handle(v->params_entity); - if(v_param_entity == d_entity_from_handle(df_regs()->entity)) + DF_Entity *v_param_entity = df_entity_from_handle(v->params_entity); + if(v_param_entity == df_entity_from_handle(df_regs()->entity)) { panel->selected_tab_view = df_handle_from_view(v); already_opened = 1; @@ -10163,7 +11695,7 @@ df_frame(void) { // TODO(rjf): //D_CmdParams p = df_cmd_params_from_panel(ws, panel); - //p.entity = d_handle_from_entity(candidate); + //p.entity = df_handle_from_entity(candidate); //d_cmd_list_push(arena, cmds, &p, d_cmd_spec_from_kind(D_CmdKind_Switch)); break; } @@ -10653,7 +12185,7 @@ df_frame(void) DF_Entity *file = &d_nil_entity; if(name_resolved == 0) { - DF_Entity *src_entity = d_entity_from_handle(df_regs()->entity); + DF_Entity *src_entity = df_entity_from_handle(df_regs()->entity); String8 file_part_of_name = name; U64 quote_pos = str8_find_needle(name, 0, str8_lit("\""), 0); if(quote_pos < name.size) @@ -10675,29 +12207,29 @@ df_frame(void) DF_Entity *root_folder = &d_nil_entity; // rjf: try to find root folder as if it's an absolute path - if(d_entity_is_nil(root_folder)) + if(df_entity_is_nil(root_folder)) { root_folder = d_entity_from_path(first_folder_name, D_EntityFromPathFlag_OpenAsNeeded); } // rjf: try to find root folder as if it's a path we've already loaded - if(d_entity_is_nil(root_folder)) + if(df_entity_is_nil(root_folder)) { - root_folder = d_entity_from_name_and_kind(first_folder_name, DF_EntityKind_File); + root_folder = df_entity_from_name_and_kind(first_folder_name, DF_EntityKind_File); } // rjf: try to find root folder as if it's inside of a path we've already loaded - if(d_entity_is_nil(root_folder)) + if(df_entity_is_nil(root_folder)) { - D_EntityList all_files = d_query_cached_entity_list_with_kind(DF_EntityKind_File); - for(D_EntityNode *n = all_files.first; n != 0; n = n->next) + DF_EntityList all_files = d_query_cached_entity_list_with_kind(DF_EntityKind_File); + for(DF_EntityNode *n = all_files.first; n != 0; n = n->next) { - if(n->entity->flags & D_EntityFlag_IsFolder) + if(n->entity->flags & DF_EntityFlag_IsFolder) { - String8 n_entity_path = d_full_path_from_entity(scratch.arena, n->entity); + String8 n_entity_path = df_full_path_from_entity(scratch.arena, n->entity); String8 estimated_full_path = push_str8f(scratch.arena, "%S/%S", n_entity_path, first_folder_name); root_folder = d_entity_from_path(estimated_full_path, D_EntityFromPathFlag_OpenAsNeeded); - if(!d_entity_is_nil(root_folder)) + if(!df_entity_is_nil(root_folder)) { break; } @@ -10706,9 +12238,9 @@ df_frame(void) } // rjf: has root folder -> descend downwards - if(!d_entity_is_nil(root_folder)) + if(!df_entity_is_nil(root_folder)) { - String8 root_folder_path = d_full_path_from_entity(scratch.arena, root_folder); + String8 root_folder_path = df_full_path_from_entity(scratch.arena, root_folder); String8List full_file_path_parts = {0}; str8_list_push(scratch.arena, &full_file_path_parts, root_folder_path); for(String8Node *n = folders.first->next; n != 0; n = n->next) @@ -10726,17 +12258,17 @@ df_frame(void) // rjf: no folders specified => just try the local folder, then try globally else if(src_entity->kind == DF_EntityKind_File) { - file = d_entity_from_name_and_kind(file_name, DF_EntityKind_File); - if(d_entity_is_nil(file)) + file = df_entity_from_name_and_kind(file_name, DF_EntityKind_File); + if(df_entity_is_nil(file)) { - String8 src_entity_full_path = d_full_path_from_entity(scratch.arena, src_entity); + String8 src_entity_full_path = df_full_path_from_entity(scratch.arena, src_entity); String8 src_entity_folder = str8_chop_last_slash(src_entity_full_path); String8 estimated_full_path = push_str8f(scratch.arena, "%S/%S", src_entity_folder, file_name); file = d_entity_from_path(estimated_full_path, D_EntityFromPathFlag_All); } } } - name_resolved = !d_entity_is_nil(file) && !(file->flags & D_EntityFlag_IsMissing) && !(file->flags & D_EntityFlag_IsFolder); + name_resolved = !df_entity_is_nil(file) && !(file->flags & DF_EntityFlag_IsMissing) && !(file->flags & DF_EntityFlag_IsFolder); } #endif @@ -10775,9 +12307,9 @@ df_frame(void) // rjf: name resolved to a file #if 0 // TODO(rjf): @msgs - if(name_resolved != 0 && !d_entity_is_nil(file)) + if(name_resolved != 0 && !df_entity_is_nil(file)) { - String8 path = d_full_path_from_entity(scratch.arena, file); + String8 path = df_full_path_from_entity(scratch.arena, file); D_CmdParams p = *params; p.file_path = path; p.text_point = txt_pt(1, 1); @@ -10791,7 +12323,7 @@ df_frame(void) case DF_CmdKind_EditEntity: { #if 0 // TODO(rjf): @msgs - DF_Entity *entity = d_entity_from_handle(df_regs()->entity); + DF_Entity *entity = df_entity_from_handle(df_regs()->entity); switch(entity->kind) { default: break; @@ -10807,8 +12339,8 @@ df_frame(void) case DF_CmdKind_EditTarget: { #if 0 // TODO(rjf): @msgs - DF_Entity *entity = d_entity_from_handle(df_regs()->entity); - if(!d_entity_is_nil(entity) && entity->kind == DF_EntityKind_Target) + DF_Entity *entity = df_entity_from_handle(df_regs()->entity); + if(!df_entity_is_nil(entity) && entity->kind == DF_EntityKind_Target) { df_push_cmd(df_cmd_spec_from_kind(DF_CmdKind_Target), params); } @@ -10822,20 +12354,20 @@ df_frame(void) //- rjf: catchall general entity activation paths (drag/drop, clicking) case DF_CmdKind_EntityRefFastPath: { - DF_Entity *entity = d_entity_from_handle(df_regs()->entity); + DF_Entity *entity = df_entity_from_handle(df_regs()->entity); switch(entity->kind) { default: { - df_cmd(DF_CmdKind_SpawnEntityView, .entity = d_handle_from_entity(entity)); + df_cmd(DF_CmdKind_SpawnEntityView, .entity = df_handle_from_entity(entity)); }break; case DF_EntityKind_Thread: { - df_cmd(DF_CmdKind_SelectThread, .entity = d_handle_from_entity(entity)); + df_cmd(DF_CmdKind_SelectThread, .entity = df_handle_from_entity(entity)); }break; case DF_EntityKind_Target: { - df_cmd(DF_CmdKind_SelectTarget, .entity = d_handle_from_entity(entity)); + df_cmd(DF_CmdKind_SelectTarget, .entity = df_handle_from_entity(entity)); }break; } }break; @@ -10844,7 +12376,7 @@ df_frame(void) #if 0 // TODO(rjf): @msgs DF_Window *ws = df_window_from_handle(df_regs()->window); DF_Panel *panel = df_panel_from_handle(df_regs()->panel); - DF_Entity *entity = d_entity_from_handle(df_regs()->entity); + DF_Entity *entity = df_entity_from_handle(df_regs()->entity); switch(entity->kind) { default:{}break; @@ -10852,7 +12384,7 @@ df_frame(void) case DF_EntityKind_Target: { D_CmdParams params = df_cmd_params_from_panel(ws, panel); - params.entity = d_handle_from_entity(entity); + params.entity = df_handle_from_entity(entity); df_push_cmd(df_cmd_spec_from_kind(DF_CmdKind_EditTarget), ¶ms); }break; } @@ -11249,37 +12781,37 @@ df_frame(void) case DF_CmdKind_EnableBreakpoint: case DF_CmdKind_EnableTarget: { - DF_Entity *entity = d_entity_from_handle(df_regs()->entity); - d_entity_equip_disabled(entity, 0); + DF_Entity *entity = df_entity_from_handle(df_regs()->entity); + df_entity_equip_disabled(entity, 0); }break; case DF_CmdKind_DisableEntity: case DF_CmdKind_DisableBreakpoint: case DF_CmdKind_DisableTarget: { - DF_Entity *entity = d_entity_from_handle(df_regs()->entity); - d_entity_equip_disabled(entity, 1); + DF_Entity *entity = df_entity_from_handle(df_regs()->entity); + df_entity_equip_disabled(entity, 1); }break; case DF_CmdKind_RemoveEntity: case DF_CmdKind_RemoveBreakpoint: case DF_CmdKind_RemoveTarget: { - DF_Entity *entity = d_entity_from_handle(df_regs()->entity); + DF_Entity *entity = df_entity_from_handle(df_regs()->entity); DF_EntityKindFlags kind_flags = d_entity_kind_flags_table[entity->kind]; if(kind_flags & DF_EntityKindFlag_CanDelete) { - d_entity_mark_for_deletion(entity); + df_entity_mark_for_deletion(entity); } }break; case DF_CmdKind_NameEntity: { - DF_Entity *entity = d_entity_from_handle(df_regs()->entity); + DF_Entity *entity = df_entity_from_handle(df_regs()->entity); String8 string = df_regs()->string; - d_entity_equip_name(entity, string); + df_entity_equip_name(entity, string); }break; case DF_CmdKind_DuplicateEntity: { - DF_Entity *src = d_entity_from_handle(df_regs()->entity); - if(!d_entity_is_nil(src)) + DF_Entity *src = df_entity_from_handle(df_regs()->entity); + if(!df_entity_is_nil(src)) { typedef struct Task Task; struct Task @@ -11294,16 +12826,16 @@ df_frame(void) for(Task *task = first_task; task != 0; task = task->next) { DF_Entity *src_n = task->src_n; - DF_Entity *dst_n = d_entity_alloc(task->dst_parent, task->src_n->kind); - if(src_n->flags & D_EntityFlag_HasTextPoint) {d_entity_equip_txt_pt(dst_n, src_n->text_point);} - if(src_n->flags & D_EntityFlag_HasU64) {d_entity_equip_u64(dst_n, src_n->u64);} - if(src_n->flags & D_EntityFlag_HasColor) {d_entity_equip_color_hsva(dst_n, d_hsva_from_entity(src_n));} - if(src_n->flags & D_EntityFlag_HasVAddrRng) {d_entity_equip_vaddr_rng(dst_n, src_n->vaddr_rng);} - if(src_n->flags & D_EntityFlag_HasVAddr) {d_entity_equip_vaddr(dst_n, src_n->vaddr);} - if(src_n->disabled) {d_entity_equip_disabled(dst_n, 1);} - if(src_n->string.size != 0) {d_entity_equip_name(dst_n, src_n->string);} + DF_Entity *dst_n = df_entity_alloc(task->dst_parent, task->src_n->kind); + if(src_n->flags & DF_EntityFlag_HasTextPoint) {df_entity_equip_txt_pt(dst_n, src_n->text_point);} + if(src_n->flags & DF_EntityFlag_HasU64) {df_entity_equip_u64(dst_n, src_n->u64);} + if(src_n->flags & DF_EntityFlag_HasColor) {df_entity_equip_color_hsva(dst_n, df_hsva_from_entity(src_n));} + if(src_n->flags & DF_EntityFlag_HasVAddrRng) {df_entity_equip_vaddr_rng(dst_n, src_n->vaddr_rng);} + if(src_n->flags & DF_EntityFlag_HasVAddr) {df_entity_equip_vaddr(dst_n, src_n->vaddr);} + if(src_n->disabled) {df_entity_equip_disabled(dst_n, 1);} + if(src_n->string.size != 0) {df_entity_equip_name(dst_n, src_n->string);} dst_n->cfg_src = src_n->cfg_src; - for(DF_Entity *src_child = task->src_n->first; !d_entity_is_nil(src_child); src_child = src_child->next) + for(DF_Entity *src_child = task->src_n->first; !df_entity_is_nil(src_child); src_child = src_child->next) { Task *child_task = push_array(scratch.arena, Task, 1); child_task->src_n = src_child; @@ -11315,25 +12847,25 @@ df_frame(void) }break; case DF_CmdKind_RelocateEntity: { - DF_Entity *entity = d_entity_from_handle(df_regs()->entity); - DF_Entity *location = d_entity_child_from_kind(entity, DF_EntityKind_Location); - if(d_entity_is_nil(location)) + DF_Entity *entity = df_entity_from_handle(df_regs()->entity); + DF_Entity *location = df_entity_child_from_kind(entity, DF_EntityKind_Location); + if(df_entity_is_nil(location)) { - location = d_entity_alloc(entity, DF_EntityKind_Location); + location = df_entity_alloc(entity, DF_EntityKind_Location); } - location->flags &= ~D_EntityFlag_HasTextPoint; - location->flags &= ~D_EntityFlag_HasVAddr; + location->flags &= ~DF_EntityFlag_HasTextPoint; + location->flags &= ~DF_EntityFlag_HasVAddr; if(df_regs()->cursor.line != 0) { - d_entity_equip_txt_pt(location, df_regs()->cursor); + df_entity_equip_txt_pt(location, df_regs()->cursor); } if(df_regs()->vaddr != 0) { - d_entity_equip_vaddr(location, df_regs()->vaddr); + df_entity_equip_vaddr(location, df_regs()->vaddr); } if(df_regs()->file_path.size != 0) { - d_entity_equip_name(location, df_regs()->file_path); + df_entity_equip_name(location, df_regs()->file_path); } }break; @@ -11348,16 +12880,16 @@ df_frame(void) B32 removed_already_existing = 0; if(kind == DF_CmdKind_ToggleBreakpoint) { - D_EntityList bps = d_query_cached_entity_list_with_kind(DF_EntityKind_Breakpoint); - for(D_EntityNode *n = bps.first; n != 0; n = n->next) + DF_EntityList bps = d_query_cached_entity_list_with_kind(DF_EntityKind_Breakpoint); + for(DF_EntityNode *n = bps.first; n != 0; n = n->next) { DF_Entity *bp = n->entity; - DF_Entity *loc = d_entity_child_from_kind(bp, DF_EntityKind_Location); - if((loc->flags & D_EntityFlag_HasTextPoint && path_match_normalized(loc->string, file_path) && loc->text_point.line == pt.line) || - (loc->flags & D_EntityFlag_HasVAddr && loc->vaddr == vaddr) || - (!(loc->flags & D_EntityFlag_HasTextPoint) && str8_match(loc->string, string, 0))) + DF_Entity *loc = df_entity_child_from_kind(bp, DF_EntityKind_Location); + if((loc->flags & DF_EntityFlag_HasTextPoint && path_match_normalized(loc->string, file_path) && loc->text_point.line == pt.line) || + (loc->flags & DF_EntityFlag_HasVAddr && loc->vaddr == vaddr) || + (!(loc->flags & DF_EntityFlag_HasTextPoint) && str8_match(loc->string, string, 0))) { - d_entity_mark_for_deletion(bp); + df_entity_mark_for_deletion(bp); removed_already_existing = 1; break; } @@ -11365,21 +12897,21 @@ df_frame(void) } if(!removed_already_existing) { - DF_Entity *bp = d_entity_alloc(d_entity_root(), DF_EntityKind_Breakpoint); - d_entity_equip_cfg_src(bp, D_CfgSrc_Project); - DF_Entity *loc = d_entity_alloc(bp, DF_EntityKind_Location); + DF_Entity *bp = df_entity_alloc(df_entity_root(), DF_EntityKind_Breakpoint); + df_entity_equip_cfg_src(bp, D_CfgSrc_Project); + DF_Entity *loc = df_entity_alloc(bp, DF_EntityKind_Location); if(file_path.size != 0 && pt.line != 0) { - d_entity_equip_name(loc, file_path); - d_entity_equip_txt_pt(loc, pt); + df_entity_equip_name(loc, file_path); + df_entity_equip_txt_pt(loc, pt); } else if(string.size != 0) { - d_entity_equip_name(loc, string); + df_entity_equip_name(loc, string); } else if(vaddr != 0) { - d_entity_equip_vaddr(loc, vaddr); + df_entity_equip_vaddr(loc, vaddr); } } }break; @@ -11400,16 +12932,16 @@ df_frame(void) B32 removed_already_existing = 0; if(kind == DF_CmdKind_ToggleWatchPin) { - D_EntityList wps = d_query_cached_entity_list_with_kind(DF_EntityKind_WatchPin); - for(D_EntityNode *n = wps.first; n != 0; n = n->next) + DF_EntityList wps = d_query_cached_entity_list_with_kind(DF_EntityKind_WatchPin); + for(DF_EntityNode *n = wps.first; n != 0; n = n->next) { DF_Entity *wp = n->entity; - DF_Entity *loc = d_entity_child_from_kind(wp, DF_EntityKind_Location); - if((loc->flags & D_EntityFlag_HasTextPoint && path_match_normalized(loc->string, file_path) && loc->text_point.line == pt.line) || - (loc->flags & D_EntityFlag_HasVAddr && loc->vaddr == vaddr) || - (!(loc->flags & D_EntityFlag_HasTextPoint) && str8_match(loc->string, string, 0))) + DF_Entity *loc = df_entity_child_from_kind(wp, DF_EntityKind_Location); + if((loc->flags & DF_EntityFlag_HasTextPoint && path_match_normalized(loc->string, file_path) && loc->text_point.line == pt.line) || + (loc->flags & DF_EntityFlag_HasVAddr && loc->vaddr == vaddr) || + (!(loc->flags & DF_EntityFlag_HasTextPoint) && str8_match(loc->string, string, 0))) { - d_entity_mark_for_deletion(wp); + df_entity_mark_for_deletion(wp); removed_already_existing = 1; break; } @@ -11417,18 +12949,18 @@ df_frame(void) } if(!removed_already_existing) { - DF_Entity *wp = d_entity_alloc(d_entity_root(), DF_EntityKind_WatchPin); - d_entity_equip_name(wp, string); - d_entity_equip_cfg_src(wp, D_CfgSrc_Project); - DF_Entity *loc = d_entity_alloc(wp, DF_EntityKind_Location); + DF_Entity *wp = df_entity_alloc(df_entity_root(), DF_EntityKind_WatchPin); + df_entity_equip_name(wp, string); + df_entity_equip_cfg_src(wp, D_CfgSrc_Project); + DF_Entity *loc = df_entity_alloc(wp, DF_EntityKind_Location); if(file_path.size != 0 && pt.line != 0) { - d_entity_equip_name(loc, file_path); - d_entity_equip_txt_pt(loc, pt); + df_entity_equip_name(loc, file_path); + df_entity_equip_txt_pt(loc, pt); } else if(vaddr != 0) { - d_entity_equip_vaddr(loc, vaddr); + df_entity_equip_vaddr(loc, vaddr); } } }break; @@ -11437,17 +12969,17 @@ df_frame(void) case DF_CmdKind_ToggleWatchExpression: if(df_regs()->string.size != 0) { - DF_Entity *existing_watch = d_entity_from_name_and_kind(df_regs()->string, DF_EntityKind_Watch); - if(d_entity_is_nil(existing_watch)) + DF_Entity *existing_watch = df_entity_from_name_and_kind(df_regs()->string, DF_EntityKind_Watch); + if(df_entity_is_nil(existing_watch)) { DF_Entity *watch = &d_nil_entity; - watch = d_entity_alloc(d_entity_root(), DF_EntityKind_Watch); - d_entity_equip_cfg_src(watch, D_CfgSrc_Project); - d_entity_equip_name(watch, df_regs()->string); + watch = df_entity_alloc(df_entity_root(), DF_EntityKind_Watch); + df_entity_equip_cfg_src(watch, D_CfgSrc_Project); + df_entity_equip_name(watch, df_regs()->string); } else { - d_entity_mark_for_deletion(existing_watch); + df_entity_mark_for_deletion(existing_watch); } }break; @@ -11540,36 +13072,36 @@ df_frame(void) { // rjf: build target DF_Entity *entity = &d_nil_entity; - entity = d_entity_alloc(d_entity_root(), DF_EntityKind_Target); - d_entity_equip_disabled(entity, 1); - d_entity_equip_cfg_src(entity, D_CfgSrc_Project); - DF_Entity *exe = d_entity_alloc(entity, DF_EntityKind_Executable); - d_entity_equip_name(exe, df_regs()->file_path); + entity = df_entity_alloc(df_entity_root(), DF_EntityKind_Target); + df_entity_equip_disabled(entity, 1); + df_entity_equip_cfg_src(entity, D_CfgSrc_Project); + DF_Entity *exe = df_entity_alloc(entity, DF_EntityKind_Executable); + df_entity_equip_name(exe, df_regs()->file_path); String8 working_dir = str8_chop_last_slash(df_regs()->file_path); if(working_dir.size != 0) { String8 working_dir_path = push_str8f(scratch.arena, "%S/", working_dir); - DF_Entity *execution_path = d_entity_alloc(entity, DF_EntityKind_WorkingDirectory); - d_entity_equip_name(execution_path, working_dir_path); + DF_Entity *execution_path = df_entity_alloc(entity, DF_EntityKind_WorkingDirectory); + df_entity_equip_name(execution_path, working_dir_path); } - df_cmd(DF_CmdKind_EditTarget, .entity = d_handle_from_entity(entity)); - df_cmd(DF_CmdKind_SelectTarget, .entity = d_handle_from_entity(entity)); + df_cmd(DF_CmdKind_EditTarget, .entity = df_handle_from_entity(entity)); + df_cmd(DF_CmdKind_SelectTarget, .entity = df_handle_from_entity(entity)); }break; case DF_CmdKind_SelectTarget: { - DF_Entity *entity = d_entity_from_handle(df_regs()->entity); + DF_Entity *entity = df_entity_from_handle(df_regs()->entity); if(entity->kind == DF_EntityKind_Target) { - D_EntityList all_targets = d_query_cached_entity_list_with_kind(DF_EntityKind_Target); + DF_EntityList all_targets = d_query_cached_entity_list_with_kind(DF_EntityKind_Target); B32 is_selected = !entity->disabled; - for(D_EntityNode *n = all_targets.first; n != 0; n = n->next) + for(DF_EntityNode *n = all_targets.first; n != 0; n = n->next) { DF_Entity *target = n->entity; - d_entity_equip_disabled(target, 1); + df_entity_equip_disabled(target, 1); } if(!is_selected) { - d_entity_equip_disabled(entity, 0); + df_entity_equip_disabled(entity, 0); } } }break; @@ -12165,17 +13697,17 @@ df_frame(void) // D_TargetArray targets = {0}; { - D_EntityList target_entities = d_query_cached_entity_list_with_kind(DF_EntityKind_Target); + DF_EntityList target_entities = d_query_cached_entity_list_with_kind(DF_EntityKind_Target); targets.count = target_entities.count; targets.v = push_array(scratch.arena, D_Target, targets.count); U64 idx = 0; - for(D_EntityNode *n = target_entities.first; n != 0; n = n->next, idx += 1) + for(DF_EntityNode *n = target_entities.first; n != 0; n = n->next, idx += 1) { DF_Entity *src_target = n->entity; - DF_Entity *src_target_exe = d_entity_child_from_kind(src_target, DF_EntityKind_Executable); - DF_Entity *src_target_args = d_entity_child_from_kind(src_target, DF_EntityKind_Arguments); - DF_Entity *src_target_wdir = d_entity_child_from_kind(src_target, DF_EntityKind_WorkingDirectory); - DF_Entity *src_target_entry = d_entity_child_from_kind(src_target, DF_EntityKind_EntryPoint); + DF_Entity *src_target_exe = df_entity_child_from_kind(src_target, DF_EntityKind_Executable); + DF_Entity *src_target_args = df_entity_child_from_kind(src_target, DF_EntityKind_Arguments); + DF_Entity *src_target_wdir = df_entity_child_from_kind(src_target, DF_EntityKind_WorkingDirectory); + DF_Entity *src_target_entry = df_entity_child_from_kind(src_target, DF_EntityKind_EntryPoint); D_Target *dst_target = &targets.v[idx]; dst_target->exe = src_target_exe->string; dst_target->args = src_target_args->string; @@ -12189,11 +13721,11 @@ df_frame(void) // D_BreakpointArray breakpoints = {0}; { - D_EntityList bp_entities = d_query_cached_entity_list_with_kind(DF_EntityKind_Breakpoint); + DF_EntityList bp_entities = d_query_cached_entity_list_with_kind(DF_EntityKind_Breakpoint); breakpoints.count = bp_entities.count; breakpoints.v = push_array(scratch.arena, D_Breakpoint, breakpoints.count); U64 idx = 0; - for(D_EntityNode *n = bp_entities.first; n != 0; n = n->next) + for(DF_EntityNode *n = bp_entities.first; n != 0; n = n->next) { DF_Entity *src_bp = n->entity; if(src_bp->disabled) @@ -12201,8 +13733,8 @@ df_frame(void) breakpoints.count -= 1; continue; } - DF_Entity *src_bp_loc = d_entity_child_from_kind(src_bp, DF_EntityKind_Location); - DF_Entity *src_bp_cnd = d_entity_child_from_kind(src_bp, DF_EntityKind_Condition); + DF_Entity *src_bp_loc = df_entity_child_from_kind(src_bp, DF_EntityKind_Location); + DF_Entity *src_bp_cnd = df_entity_child_from_kind(src_bp, DF_EntityKind_Condition); D_Breakpoint *dst_bp = &breakpoints.v[idx]; dst_bp->file_path = src_bp_loc->string; dst_bp->pt = src_bp_loc->text_point; @@ -12282,11 +13814,11 @@ df_frame(void) // rjf: increment breakpoint hit counts if(evt->cause == D_EventCause_UserBreakpoint) { - D_EntityList user_bps = d_query_cached_entity_list_with_kind(DF_EntityKind_Breakpoint); - for(D_EntityNode *n = user_bps.first; n != 0; n = n->next) + DF_EntityList user_bps = d_query_cached_entity_list_with_kind(DF_EntityKind_Breakpoint); + for(DF_EntityNode *n = user_bps.first; n != 0; n = n->next) { DF_Entity *bp = n->entity; - DF_Entity *loc = d_entity_child_from_kind(bp, DF_EntityKind_Location); + DF_Entity *loc = df_entity_child_from_kind(bp, DF_EntityKind_Location); D_LineList loc_lines = d_lines_from_file_path_line_num(scratch.arena, loc->string, loc->text_point.line); if(loc_lines.first != 0) { @@ -12299,7 +13831,7 @@ df_frame(void) } } } - else if(loc->flags & D_EntityFlag_HasVAddr && vaddr == loc->vaddr) + else if(loc->flags & DF_EntityFlag_HasVAddr && vaddr == loc->vaddr) { bp->u64 += 1; } @@ -12360,7 +13892,7 @@ df_frame(void) // { F32 rate = 1.f - pow_f32(2.f, -20.f*df_state->frame_dt); - for(DF_Entity *e = d_entity_root(); !d_entity_is_nil(e); e = d_entity_rec_depth_first_pre(e, d_entity_root()).next) + for(DF_Entity *e = df_entity_root(); !df_entity_is_nil(e); e = df_entity_rec_depth_first_pre(e, df_entity_root()).next) { F32 diff = (1.f - e->alive_t); e->alive_t += diff * rate; @@ -12484,6 +14016,34 @@ df_frame(void) } } + ////////////////////////////// + //- rjf: eliminate entities that are marked for deletion + // + ProfScope("eliminate deleted entities") + { + for(DF_Entity *entity = df_entity_root(), *next = 0; !df_entity_is_nil(entity); entity = next) + { + next = df_entity_rec_depth_first_pre(entity, &d_nil_entity).next; + if(entity->flags & DF_EntityFlag_MarkedForDeletion) + { + B32 undoable = (d_entity_kind_flags_table[entity->kind] & DF_EntityKindFlag_UserDefinedLifetime); + + // rjf: fixup next entity to iterate to + next = df_entity_rec_depth_first(entity, &d_nil_entity, OffsetOf(DF_Entity, next), OffsetOf(DF_Entity, next)).next; + + // rjf: eliminate root entity if we're freeing it + if(entity == df_state->entities_root) + { + df_state->entities_root = &d_nil_entity; + } + + // rjf: unhook & release this entity tree + df_entity_change_parent(entity, entity->parent, &d_nil_entity, &d_nil_entity); + df_entity_release(entity); + } + } + } + ////////////////////////////// //- rjf: determine frame time, record into history // diff --git a/src/dbg_frontend/dbg_frontend_core.h b/src/dbg_frontend/dbg_frontend_core.h index 405254d8..53aa4f80 100644 --- a/src/dbg_frontend/dbg_frontend_core.h +++ b/src/dbg_frontend/dbg_frontend_core.h @@ -4,6 +4,62 @@ #ifndef DBG_FRONTEND_CORE_H #define DBG_FRONTEND_CORE_H +//////////////////////////////// +//~ rjf: Entity Kind Flags + +typedef U32 DF_EntityKindFlags; +enum +{ + //- rjf: allowed operations + DF_EntityKindFlag_CanDelete = (1<<0), + DF_EntityKindFlag_CanFreeze = (1<<1), + DF_EntityKindFlag_CanEdit = (1<<2), + DF_EntityKindFlag_CanRename = (1<<3), + DF_EntityKindFlag_CanEnable = (1<<4), + DF_EntityKindFlag_CanCondition = (1<<5), + DF_EntityKindFlag_CanDuplicate = (1<<6), + + //- rjf: name categorization + DF_EntityKindFlag_NameIsCode = (1<<7), + DF_EntityKindFlag_NameIsPath = (1<<8), + + //- rjf: lifetime categorization + DF_EntityKindFlag_UserDefinedLifetime = (1<<9), + + //- rjf: serialization + DF_EntityKindFlag_IsSerializedToConfig = (1<<10), +}; + +//////////////////////////////// +//~ rjf: Entity Kind Flags + +typedef U32 DF_EntityFlags; +enum +{ + //- rjf: allocationless, simple equipment + DF_EntityFlag_HasTextPoint = (1<<0), + DF_EntityFlag_HasEntityHandle = (1<<2), + DF_EntityFlag_HasU64 = (1<<4), + DF_EntityFlag_HasColor = (1<<6), + DF_EntityFlag_DiesOnRunStop = (1<<8), + + //- rjf: ctrl entity equipment + DF_EntityFlag_HasCtrlHandle = (1<<9), + DF_EntityFlag_HasArch = (1<<10), + DF_EntityFlag_HasCtrlID = (1<<11), + DF_EntityFlag_HasStackBase = (1<<12), + DF_EntityFlag_HasTLSRoot = (1<<13), + DF_EntityFlag_HasVAddrRng = (1<<14), + DF_EntityFlag_HasVAddr = (1<<15), + + //- rjf: file properties + DF_EntityFlag_IsFolder = (1<<16), + DF_EntityFlag_IsMissing = (1<<17), + + //- rjf: deletion + DF_EntityFlag_MarkedForDeletion = (1<<31), +}; + //////////////////////////////// //~ rjf: Evaluation Spaces @@ -398,6 +454,114 @@ enum #include "generated/dbg_frontend.meta.h" +//////////////////////////////// +//~ rjf: Entity Types + +typedef U64 DF_EntityID; + +typedef struct DF_Entity DF_Entity; +struct DF_Entity +{ + // rjf: tree links + DF_Entity *first; + DF_Entity *last; + DF_Entity *next; + DF_Entity *prev; + DF_Entity *parent; + + // rjf: metadata + DF_EntityKind kind; + DF_EntityFlags flags; + DF_EntityID id; + U64 gen; + U64 alloc_time_us; + F32 alive_t; + + // rjf: basic equipment + TxtPt text_point; + D_Handle entity_handle; + B32 disabled; + U64 u64; + Vec4F32 color_hsva; + D_CfgSrc cfg_src; + U64 timestamp; + + // rjf: ctrl equipment + CTRL_Handle ctrl_handle; + Arch arch; + U32 ctrl_id; + U64 stack_base; + Rng1U64 vaddr_rng; + U64 vaddr; + + // rjf: string equipment + String8 string; + + // rjf: parameter tree + Arena *params_arena; + MD_Node *params_root; +}; + +typedef struct DF_EntityNode DF_EntityNode; +struct DF_EntityNode +{ + DF_EntityNode *next; + DF_Entity *entity; +}; + +typedef struct DF_EntityList DF_EntityList; +struct DF_EntityList +{ + DF_EntityNode *first; + DF_EntityNode *last; + U64 count; +}; + +typedef struct DF_EntityArray DF_EntityArray; +struct DF_EntityArray +{ + DF_Entity **v; + U64 count; +}; + +typedef struct DF_EntityRec DF_EntityRec; +struct DF_EntityRec +{ + DF_Entity *next; + S32 push_count; + S32 pop_count; +}; + +//////////////////////////////// +//~ rjf: Entity Evaluation Types + +typedef struct DF_EntityEval DF_EntityEval; +struct DF_EntityEval +{ + B64 enabled; + U64 hit_count; + U64 label_off; + U64 location_off; + U64 condition_off; +}; + +//////////////////////////////// +//~ rjf: Entity Fuzzy Listing Types + +typedef struct DF_EntityFuzzyItem DF_EntityFuzzyItem; +struct DF_EntityFuzzyItem +{ + DF_Entity *entity; + FuzzyMatchRangeList matches; +}; + +typedef struct DF_EntityFuzzyItemArray DF_EntityFuzzyItemArray; +struct DF_EntityFuzzyItemArray +{ + DF_EntityFuzzyItem *v; + U64 count; +}; + //////////////////////////////// //~ rjf: Command Types @@ -668,6 +832,14 @@ struct DF_EvalVizViewCacheSlot //////////////////////////////// //~ rjf: Main Per-Process Graphical State +typedef struct D_EntityListCache D_EntityListCache; +struct D_EntityListCache +{ + Arena *arena; + U64 alloc_gen; + DF_EntityList list; +}; + typedef struct DF_State DF_State; struct DF_State { @@ -700,6 +872,20 @@ struct DF_State // rjf: autosave timer F32 seconds_until_autosave; + // rjf: entity state + Arena *entities_arena; + DF_Entity *entities_base; + U64 entities_count; + U64 entities_id_gen; + DF_Entity *entities_root; + DF_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[DF_EntityKind_COUNT]; + D_EntityListCache kind_caches[DF_EntityKind_COUNT]; + // rjf: key map table Arena *key_map_arena; U64 key_map_table_size; @@ -796,6 +982,15 @@ struct DF_State //////////////////////////////// //~ rjf: Globals +read_only global DF_Entity d_nil_entity = +{ + &d_nil_entity, + &d_nil_entity, + &d_nil_entity, + &d_nil_entity, + &d_nil_entity, +}; + read_only global DF_CmdKindInfo df_nil_cmd_kind_info = {0}; read_only global DF_ViewSpec df_nil_view_spec = @@ -853,6 +1048,59 @@ internal DF_Regs *df_regs_copy(Arena *arena, DF_Regs *src); internal void df_cmd_list_push_new(Arena *arena, DF_CmdList *cmds, String8 name, DF_Regs *regs); +//////////////////////////////// +//~ rjf: Entity Type Pure Functions + +//- rjf: nil +internal B32 df_entity_is_nil(DF_Entity *entity); +#define df_require_entity_nonnil(entity, if_nil_stmts) do{if(df_entity_is_nil(entity)){if_nil_stmts;}}while(0) + +//- rjf: handle <-> entity conversions +internal U64 df_index_from_entity(DF_Entity *entity); +internal D_Handle df_handle_from_entity(DF_Entity *entity); +internal DF_Entity *df_entity_from_handle(D_Handle handle); +internal D_HandleList df_handle_list_from_entity_list(Arena *arena, DF_EntityList entities); + +//- rjf: entity recursion iterators +internal DF_EntityRec df_entity_rec_depth_first(DF_Entity *entity, DF_Entity *subtree_root, U64 sib_off, U64 child_off); +#define df_entity_rec_depth_first_pre(entity, subtree_root) df_entity_rec_depth_first((entity), (subtree_root), OffsetOf(DF_Entity, next), OffsetOf(DF_Entity, first)) +#define df_entity_rec_depth_first_post(entity, subtree_root) df_entity_rec_depth_first((entity), (subtree_root), OffsetOf(DF_Entity, prev), OffsetOf(DF_Entity, last)) + +//- rjf: ancestor/child introspection +internal DF_Entity *df_entity_child_from_kind(DF_Entity *entity, DF_EntityKind kind); +internal DF_Entity *df_entity_ancestor_from_kind(DF_Entity *entity, DF_EntityKind kind); +internal DF_EntityList df_push_entity_child_list_with_kind(Arena *arena, DF_Entity *entity, DF_EntityKind kind); +internal DF_Entity *df_entity_child_from_string_and_kind(DF_Entity *parent, String8 string, DF_EntityKind kind); + +//- rjf: entity list building +internal void df_entity_list_push(Arena *arena, DF_EntityList *list, DF_Entity *entity); +internal DF_EntityArray df_entity_array_from_list(Arena *arena, DF_EntityList *list); +#define df_first_entity_from_list(list) ((list)->first != 0 ? (list)->first->entity : &d_nil_entity) + +//- rjf: entity fuzzy list building +internal DF_EntityFuzzyItemArray df_entity_fuzzy_item_array_from_entity_list_needle(Arena *arena, DF_EntityList *list, String8 needle); +internal DF_EntityFuzzyItemArray df_entity_fuzzy_item_array_from_entity_array_needle(Arena *arena, DF_EntityArray *array, String8 needle); + +//- rjf: full path building, from file/folder entities +internal String8 df_full_path_from_entity(Arena *arena, DF_Entity *entity); + +//- rjf: display string entities, for referencing entities in ui +internal String8 df_display_string_from_entity(Arena *arena, DF_Entity *entity); + +//- rjf: extra search tag strings for fuzzy filtering entities +internal String8 df_search_tags_from_entity(Arena *arena, DF_Entity *entity); + +//- rjf: entity -> color operations +internal Vec4F32 df_hsva_from_entity(DF_Entity *entity); +internal Vec4F32 df_rgba_from_entity(DF_Entity *entity); + +//- rjf: entity -> expansion tree keys +internal EV_Key df_ev_key_from_entity(DF_Entity *entity); +internal EV_Key df_parent_ev_key_from_entity(DF_Entity *entity); + +//- rjf: entity -> evaluation +internal DF_EntityEval *df_eval_from_entity(Arena *arena, DF_Entity *entity); + //////////////////////////////// //~ rjf: View Type Functions @@ -925,6 +1173,92 @@ internal void df_queue_drag_drop(void); internal void df_set_hover_regs(void); internal DF_Regs *df_get_hover_regs(void); +//////////////////////////////// +//~ rjf: Entity Stateful Functions + +//- rjf: entity allocation + tree forming +internal DF_Entity *df_entity_alloc(DF_Entity *parent, DF_EntityKind kind); +internal void df_entity_mark_for_deletion(DF_Entity *entity); +internal void df_entity_release(DF_Entity *entity); +internal void df_entity_change_parent(DF_Entity *entity, DF_Entity *old_parent, DF_Entity *new_parent, DF_Entity *prev_child); + +//- rjf: entity simple equipment +internal void df_entity_equip_txt_pt(DF_Entity *entity, TxtPt point); +internal void df_entity_equip_entity_handle(DF_Entity *entity, D_Handle handle); +internal void df_entity_equip_disabled(DF_Entity *entity, B32 b32); +internal void df_entity_equip_u64(DF_Entity *entity, U64 u64); +internal void df_entity_equip_color_rgba(DF_Entity *entity, Vec4F32 rgba); +internal void df_entity_equip_color_hsva(DF_Entity *entity, Vec4F32 hsva); +internal void df_entity_equip_cfg_src(DF_Entity *entity, D_CfgSrc cfg_src); +internal void df_entity_equip_timestamp(DF_Entity *entity, U64 timestamp); + +//- rjf: control layer correllation equipment +internal void df_entity_equip_ctrl_handle(DF_Entity *entity, CTRL_Handle handle); +internal void df_entity_equip_arch(DF_Entity *entity, Arch arch); +internal void df_entity_equip_ctrl_id(DF_Entity *entity, U32 id); +internal void df_entity_equip_stack_base(DF_Entity *entity, U64 stack_base); +internal void df_entity_equip_vaddr_rng(DF_Entity *entity, Rng1U64 range); +internal void df_entity_equip_vaddr(DF_Entity *entity, U64 vaddr); + +//- rjf: name equipment +internal void df_entity_equip_name(DF_Entity *entity, String8 name); + +//- rjf: file path map override lookups +internal String8List d_possible_overrides_from_file_path(Arena *arena, String8 file_path); + +//- rjf: top-level state queries +internal DF_Entity *df_entity_root(void); +internal DF_EntityList df_push_entity_list_with_kind(Arena *arena, DF_EntityKind kind); +internal DF_Entity *df_entity_from_id(DF_EntityID id); +internal DF_Entity *df_machine_entity_from_machine_id(CTRL_MachineID machine_id); +internal DF_Entity *df_entity_from_ctrl_handle(CTRL_Handle handle); +internal DF_Entity *df_entity_from_ctrl_id(CTRL_MachineID machine_id, U32 id); +internal DF_Entity *df_entity_from_name_and_kind(String8 string, DF_EntityKind kind); + +//////////////////////////////// +//~ rjf: Evaluation Spaces + +//- rjf: ctrl entity <-> eval space +internal CTRL_Entity *d_ctrl_entity_from_eval_space(E_Space space); +internal E_Space d_eval_space_from_ctrl_entity(CTRL_Entity *entity); + +//- rjf: entity <-> eval space +internal DF_Entity *d_entity_from_eval_space(E_Space space); +internal E_Space d_eval_space_from_entity(DF_Entity *entity); + +//- rjf: eval space reads/writes +internal B32 d_eval_space_read(void *u, E_Space space, void *out, Rng1U64 range); +internal B32 d_eval_space_write(void *u, E_Space space, void *in, Rng1U64 range); + +//- rjf: asynchronous streamed reads -> hashes from spaces +internal U128 d_key_from_eval_space_range(E_Space space, Rng1U64 range, B32 zero_terminated); + +//- rjf: space -> entire range +internal Rng1U64 d_whole_range_from_eval_space(E_Space space); + +//////////////////////////////// +//~ rjf: Evaluation Visualization + +//- rjf: writing values back to child processes +internal B32 d_commit_eval_value_string(E_Eval dst_eval, String8 string); + +//- rjf: eval / view rule params tree info extraction +internal U64 d_base_offset_from_eval(E_Eval eval); +internal E_Value d_value_from_params_key(MD_Node *params, String8 key); +internal Rng1U64 d_range_from_eval_params(E_Eval eval, MD_Node *params); +internal TXT_LangKind d_lang_kind_from_eval_params(E_Eval eval, MD_Node *params); +internal Arch d_arch_from_eval_params(E_Eval eval, MD_Node *params); +internal Vec2S32 d_dim2s32_from_eval_params(E_Eval eval, MD_Node *params); +internal R_Tex2DFormat d_tex2dformat_from_eval_params(E_Eval eval, MD_Node *params); + +//- rjf: eval <-> entity +internal DF_Entity *d_entity_from_eval_string(String8 string); +internal String8 d_eval_string_from_entity(Arena *arena, DF_Entity *entity); + +//- rjf: eval <-> file path +internal String8 d_file_path_from_eval_string(Arena *arena, String8 string); +internal String8 d_eval_string_from_file_path(Arena *arena, String8 string); + //////////////////////////////// //~ rjf: View Spec State Functions @@ -1063,6 +1397,11 @@ internal Arena *df_frame_arena(void); //- rjf: config paths internal String8 df_cfg_path_from_src(D_CfgSrc src); +//- rjf: entity cache queries +internal DF_EntityList d_query_cached_entity_list_with_kind(DF_EntityKind kind); +internal DF_EntityList d_push_active_target_list(Arena *arena); +internal DF_Entity *d_entity_from_ev_key_and_kind(EV_Key key, DF_EntityKind kind); + //- rjf: config state internal D_CfgTable *df_cfg_table(void); diff --git a/src/dbg_frontend/dbg_frontend_views.c b/src/dbg_frontend/dbg_frontend_views.c index 332e30ca..04466eda 100644 --- a/src/dbg_frontend/dbg_frontend_views.c +++ b/src/dbg_frontend/dbg_frontend_views.c @@ -168,9 +168,9 @@ df_code_view_build(Arena *arena, DF_View *view, DF_CodeViewState *cv, DF_CodeVie code_slice_params.line_text = push_array(scratch.arena, String8, visible_line_count); code_slice_params.line_ranges = push_array(scratch.arena, Rng1U64, visible_line_count); code_slice_params.line_tokens = push_array(scratch.arena, TXT_TokenArray, visible_line_count); - code_slice_params.line_bps = push_array(scratch.arena, D_EntityList, visible_line_count); + code_slice_params.line_bps = push_array(scratch.arena, DF_EntityList, visible_line_count); code_slice_params.line_ips = push_array(scratch.arena, CTRL_EntityList, visible_line_count); - code_slice_params.line_pins = push_array(scratch.arena, D_EntityList, visible_line_count); + code_slice_params.line_pins = push_array(scratch.arena, DF_EntityList, visible_line_count); code_slice_params.line_vaddrs = push_array(scratch.arena, U64, visible_line_count); code_slice_params.line_infos = push_array(scratch.arena, D_LineList, visible_line_count); code_slice_params.font = code_font; @@ -199,16 +199,16 @@ df_code_view_build(Arena *arena, DF_View *view, DF_CodeViewState *cv, DF_CodeVie // rjf: find visible breakpoints for source code ProfScope("find visible breakpoints") { - D_EntityList bps = d_query_cached_entity_list_with_kind(DF_EntityKind_Breakpoint); - for(D_EntityNode *n = bps.first; n != 0; n = n->next) + DF_EntityList bps = d_query_cached_entity_list_with_kind(DF_EntityKind_Breakpoint); + for(DF_EntityNode *n = bps.first; n != 0; n = n->next) { DF_Entity *bp = n->entity; - DF_Entity *loc = d_entity_child_from_kind(bp, DF_EntityKind_Location); + DF_Entity *loc = df_entity_child_from_kind(bp, DF_EntityKind_Location); if(path_match_normalized(loc->string, df_regs()->file_path) && visible_line_num_range.min <= loc->text_point.line && loc->text_point.line <= visible_line_num_range.max) { U64 slice_line_idx = (loc->text_point.line-visible_line_num_range.min); - d_entity_list_push(scratch.arena, &code_slice_params.line_bps[slice_line_idx], bp); + df_entity_list_push(scratch.arena, &code_slice_params.line_bps[slice_line_idx], bp); } } } @@ -245,16 +245,16 @@ df_code_view_build(Arena *arena, DF_View *view, DF_CodeViewState *cv, DF_CodeVie // rjf: find visible watch pins for source code ProfScope("find visible watch pins") { - D_EntityList wps = d_query_cached_entity_list_with_kind(DF_EntityKind_WatchPin); - for(D_EntityNode *n = wps.first; n != 0; n = n->next) + DF_EntityList wps = d_query_cached_entity_list_with_kind(DF_EntityKind_WatchPin); + for(DF_EntityNode *n = wps.first; n != 0; n = n->next) { DF_Entity *wp = n->entity; - DF_Entity *loc = d_entity_child_from_kind(wp, DF_EntityKind_Location); + DF_Entity *loc = df_entity_child_from_kind(wp, DF_EntityKind_Location); if(path_match_normalized(loc->string, df_regs()->file_path) && visible_line_num_range.min <= loc->text_point.line && loc->text_point.line <= visible_line_num_range.max) { U64 slice_line_idx = (loc->text_point.line-visible_line_num_range.min); - d_entity_list_push(scratch.arena, &code_slice_params.line_pins[slice_line_idx], wp); + df_entity_list_push(scratch.arena, &code_slice_params.line_pins[slice_line_idx], wp); } } } @@ -297,12 +297,12 @@ df_code_view_build(Arena *arena, DF_View *view, DF_CodeViewState *cv, DF_CodeVie // rjf: find breakpoints mapping to this disasm if(dasm_lines) ProfScope("find breakpoints mapping to this disassembly") { - D_EntityList bps = d_query_cached_entity_list_with_kind(DF_EntityKind_Breakpoint); - for(D_EntityNode *n = bps.first; n != 0; n = n->next) + DF_EntityList bps = d_query_cached_entity_list_with_kind(DF_EntityKind_Breakpoint); + for(DF_EntityNode *n = bps.first; n != 0; n = n->next) { DF_Entity *bp = n->entity; - DF_Entity *loc = d_entity_child_from_kind(bp, DF_EntityKind_Location); - if(loc->flags & D_EntityFlag_HasVAddr && contains_1u64(dasm_vaddr_range, loc->vaddr)) + DF_Entity *loc = df_entity_child_from_kind(bp, DF_EntityKind_Location); + if(loc->flags & DF_EntityFlag_HasVAddr && contains_1u64(dasm_vaddr_range, loc->vaddr)) { U64 off = loc->vaddr-dasm_vaddr_range.min; U64 idx = dasm_line_array_idx_from_code_off__linear_scan(dasm_lines, off); @@ -310,7 +310,7 @@ df_code_view_build(Arena *arena, DF_View *view, DF_CodeViewState *cv, DF_CodeVie if(contains_1s64(visible_line_num_range, line_num)) { U64 slice_line_idx = (line_num-visible_line_num_range.min); - d_entity_list_push(scratch.arena, &code_slice_params.line_bps[slice_line_idx], bp); + df_entity_list_push(scratch.arena, &code_slice_params.line_bps[slice_line_idx], bp); } } } @@ -319,12 +319,12 @@ df_code_view_build(Arena *arena, DF_View *view, DF_CodeViewState *cv, DF_CodeVie // rjf: find watch pins mapping to this disasm if(dasm_lines) ProfScope("find watch pins mapping to this disassembly") { - D_EntityList pins = d_query_cached_entity_list_with_kind(DF_EntityKind_WatchPin); - for(D_EntityNode *n = pins.first; n != 0; n = n->next) + DF_EntityList pins = d_query_cached_entity_list_with_kind(DF_EntityKind_WatchPin); + for(DF_EntityNode *n = pins.first; n != 0; n = n->next) { DF_Entity *pin = n->entity; - DF_Entity *loc = d_entity_child_from_kind(pin, DF_EntityKind_Location); - if(loc->flags & D_EntityFlag_HasVAddr && contains_1u64(dasm_vaddr_range, loc->vaddr)) + DF_Entity *loc = df_entity_child_from_kind(pin, DF_EntityKind_Location); + if(loc->flags & DF_EntityFlag_HasVAddr && contains_1u64(dasm_vaddr_range, loc->vaddr)) { U64 off = loc->vaddr-dasm_vaddr_range.min; U64 idx = dasm_line_array_idx_from_code_off__linear_scan(dasm_lines, off); @@ -332,7 +332,7 @@ df_code_view_build(Arena *arena, DF_View *view, DF_CodeViewState *cv, DF_CodeVie if(contains_1s64(visible_line_num_range, line_num)) { U64 slice_line_idx = (line_num-visible_line_num_range.min); - d_entity_list_push(scratch.arena, &code_slice_params.line_pins[slice_line_idx], pin); + df_entity_list_push(scratch.arena, &code_slice_params.line_pins[slice_line_idx], pin); } } } @@ -1007,17 +1007,17 @@ df_watch_view_build(DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 d case DF_WatchViewFillKind_Watch: { mutable_entity_kind = DF_EntityKind_Watch; - D_EntityList watches = d_query_cached_entity_list_with_kind(mutable_entity_kind); - for(D_EntityNode *n = watches.first; n != 0; n = n->next) + DF_EntityList watches = d_query_cached_entity_list_with_kind(mutable_entity_kind); + for(DF_EntityNode *n = watches.first; n != 0; n = n->next) { DF_Entity *watch = n->entity; - if(watch->flags & D_EntityFlag_MarkedForDeletion) + if(watch->flags & DF_EntityFlag_MarkedForDeletion) { continue; } - EV_Key parent_key = d_parent_ev_key_from_entity(watch); - EV_Key key = d_ev_key_from_entity(watch); - DF_Entity *view_rule = d_entity_child_from_kind(watch, DF_EntityKind_ViewRule); + EV_Key parent_key = df_parent_ev_key_from_entity(watch); + EV_Key key = df_ev_key_from_entity(watch); + DF_Entity *view_rule = df_entity_child_from_kind(watch, DF_EntityKind_ViewRule); ev_key_set_view_rule(eval_view, key, view_rule->string); String8 expr_string = watch->string; FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, expr_string); @@ -1036,17 +1036,17 @@ df_watch_view_build(DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 d { mutable_entity_kind = DF_EntityKind_Breakpoint; ev_view_rule_list_push_string(scratch.arena, &top_level_view_rules, str8_lit("no_addr")); - D_EntityList bps = d_query_cached_entity_list_with_kind(mutable_entity_kind); - for(D_EntityNode *n = bps.first; n != 0; n = n->next) + DF_EntityList bps = d_query_cached_entity_list_with_kind(mutable_entity_kind); + for(DF_EntityNode *n = bps.first; n != 0; n = n->next) { DF_Entity *bp = n->entity; - if(bp->flags & D_EntityFlag_MarkedForDeletion) + if(bp->flags & DF_EntityFlag_MarkedForDeletion) { continue; } - EV_Key parent_key = d_parent_ev_key_from_entity(bp); - EV_Key key = d_ev_key_from_entity(bp); - String8 title = d_display_string_from_entity(scratch.arena, bp); + EV_Key parent_key = df_parent_ev_key_from_entity(bp); + EV_Key key = df_ev_key_from_entity(bp); + String8 title = df_display_string_from_entity(scratch.arena, bp); FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, title); if(matches.count == matches.needle_part_count) { @@ -1075,16 +1075,16 @@ df_watch_view_build(DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 d case DF_WatchViewFillKind_WatchPins: { mutable_entity_kind = DF_EntityKind_WatchPin; - D_EntityList wps = d_query_cached_entity_list_with_kind(mutable_entity_kind); - for(D_EntityNode *n = wps.first; n != 0; n = n->next) + DF_EntityList wps = d_query_cached_entity_list_with_kind(mutable_entity_kind); + for(DF_EntityNode *n = wps.first; n != 0; n = n->next) { DF_Entity *wp = n->entity; - if(wp->flags & D_EntityFlag_MarkedForDeletion) + if(wp->flags & DF_EntityFlag_MarkedForDeletion) { continue; } - EV_Key parent_key = d_parent_ev_key_from_entity(wp); - EV_Key key = d_ev_key_from_entity(wp); + EV_Key parent_key = df_parent_ev_key_from_entity(wp); + EV_Key key = df_ev_key_from_entity(wp); String8 title = wp->string; FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, title); if(matches.count == matches.needle_part_count) @@ -1728,18 +1728,18 @@ df_watch_view_build(DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 d { DF_WatchViewPoint pt = df_watch_view_point_from_tbl(&blocks, tbl); DF_Entity *watch = d_entity_from_ev_key_and_kind(pt.key, mutable_entity_kind); - if(!d_entity_is_nil(watch)) + if(!df_entity_is_nil(watch)) { - d_entity_equip_name(watch, new_string); + df_entity_equip_name(watch, new_string); state_dirty = 1; snap_to_cursor = 1; } else if(editing_complete && new_string.size != 0 && ev_key_match(pt.key, empty_row_key)) { - watch = d_entity_alloc(d_entity_root(), mutable_entity_kind); - d_entity_equip_cfg_src(watch, D_CfgSrc_Project); - d_entity_equip_name(watch, new_string); - EV_Key key = d_ev_key_from_entity(watch); + watch = df_entity_alloc(df_entity_root(), mutable_entity_kind); + df_entity_equip_cfg_src(watch, D_CfgSrc_Project); + df_entity_equip_name(watch, new_string); + EV_Key key = df_ev_key_from_entity(watch); ev_key_set_view_rule(eval_view, key, str8_zero()); state_dirty = 1; snap_to_cursor = 1; @@ -1774,18 +1774,18 @@ df_watch_view_build(DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 d DF_WatchViewPoint pt = df_watch_view_point_from_tbl(&blocks, tbl); ev_key_set_view_rule(eval_view, pt.key, new_string); DF_Entity *watch = d_entity_from_ev_key_and_kind(pt.key, mutable_entity_kind); - DF_Entity *view_rule = d_entity_child_from_kind(watch, DF_EntityKind_ViewRule); - if(new_string.size != 0 && d_entity_is_nil(view_rule)) + DF_Entity *view_rule = df_entity_child_from_kind(watch, DF_EntityKind_ViewRule); + if(new_string.size != 0 && df_entity_is_nil(view_rule)) { - view_rule = d_entity_alloc(watch, DF_EntityKind_ViewRule); + view_rule = df_entity_alloc(watch, DF_EntityKind_ViewRule); } - else if(new_string.size == 0 && !d_entity_is_nil(view_rule)) + else if(new_string.size == 0 && !df_entity_is_nil(view_rule)) { - d_entity_mark_for_deletion(view_rule); + df_entity_mark_for_deletion(view_rule); } if(new_string.size != 0) { - d_entity_equip_name(view_rule, new_string); + df_entity_equip_name(view_rule, new_string); } state_dirty = 1; snap_to_cursor = 1; @@ -1858,30 +1858,30 @@ df_watch_view_build(DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 d DF_WatchViewPoint fallback_pt_prev = df_watch_view_point_from_tbl(&blocks, v2s64(0, y - 1)); DF_WatchViewPoint fallback_pt_next = df_watch_view_point_from_tbl(&blocks, v2s64(0, y + 1)); DF_Entity *watch = d_entity_from_ev_key_and_kind(pt.key, mutable_entity_kind); - if(!d_entity_is_nil(watch)) + if(!df_entity_is_nil(watch)) { EV_Key new_cursor_key = empty_row_key; EV_Key new_cursor_parent_key = empty_row_parent_key; if((evt->delta_2s32.x < 0 || evt->delta_2s32.y < 0) && !ev_key_match(ev_key_zero(), fallback_pt_prev.key)) { DF_Entity *fallback_watch = d_entity_from_ev_key_and_kind(fallback_pt_prev.key, mutable_entity_kind); - if(!d_entity_is_nil(fallback_watch)) + if(!df_entity_is_nil(fallback_watch)) { new_cursor_key = fallback_pt_prev.key; - new_cursor_parent_key = d_parent_ev_key_from_entity(fallback_watch); + new_cursor_parent_key = df_parent_ev_key_from_entity(fallback_watch); } } else if(!ev_key_match(ev_key_zero(), fallback_pt_next.key)) { DF_Entity *fallback_watch = d_entity_from_ev_key_and_kind(fallback_pt_next.key, mutable_entity_kind); - if(!d_entity_is_nil(fallback_watch)) + if(!df_entity_is_nil(fallback_watch)) { new_cursor_key = fallback_pt_next.key; - new_cursor_parent_key = d_parent_ev_key_from_entity(fallback_watch); + new_cursor_parent_key = df_parent_ev_key_from_entity(fallback_watch); } } DF_WatchViewPoint new_cursor_pt = {0, new_cursor_parent_key, new_cursor_key}; - d_entity_mark_for_deletion(watch); + df_entity_mark_for_deletion(watch); ewv->cursor = ewv->mark = ewv->next_cursor = ewv->next_mark = new_cursor_pt; } } @@ -1890,8 +1890,8 @@ df_watch_view_build(DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 d else if(selection_tbl.min.x <= DF_WatchViewColumnKind_ViewRule && DF_WatchViewColumnKind_ViewRule <= selection_tbl.max.x) { DF_Entity *watch = d_entity_from_ev_key_and_kind(pt.key, mutable_entity_kind); - DF_Entity *view_rule = d_entity_child_from_kind(watch, DF_EntityKind_ViewRule); - d_entity_mark_for_deletion(view_rule); + DF_Entity *view_rule = df_entity_child_from_kind(watch, DF_EntityKind_ViewRule); + df_entity_mark_for_deletion(view_rule); ev_key_set_view_rule(eval_view, pt.key, str8_zero()); } } @@ -1996,29 +1996,29 @@ df_watch_view_build(DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 d DF_Entity *reorder_group_next = d_entity_from_ev_key_and_kind(reorder_group_next_watch_key, mutable_entity_kind); DF_Entity *first_watch = d_entity_from_ev_key_and_kind(first_watch_key, mutable_entity_kind); DF_Entity *last_watch = first_watch; - if(!d_entity_is_nil(first_watch)) + if(!df_entity_is_nil(first_watch)) { for(S64 y = selection_tbl.min.y+1; y <= selection_tbl.max.y; y += 1) { EV_Key key = ev_key_from_block_list_row_num(&blocks, y); DF_Entity *new_last = d_entity_from_ev_key_and_kind(key, mutable_entity_kind); - if(!d_entity_is_nil(new_last)) + if(!df_entity_is_nil(new_last)) { last_watch = new_last; } } } - if(evt->delta_2s32.y < 0 && !d_entity_is_nil(first_watch) && !d_entity_is_nil(reorder_group_prev)) + if(evt->delta_2s32.y < 0 && !df_entity_is_nil(first_watch) && !df_entity_is_nil(reorder_group_prev)) { state_dirty = 1; snap_to_cursor = 1; - d_entity_change_parent(reorder_group_prev, reorder_group_prev->parent, reorder_group_prev->parent, last_watch); + df_entity_change_parent(reorder_group_prev, reorder_group_prev->parent, reorder_group_prev->parent, last_watch); } - if(evt->delta_2s32.y > 0 && !d_entity_is_nil(last_watch) && !d_entity_is_nil(reorder_group_next)) + if(evt->delta_2s32.y > 0 && !df_entity_is_nil(last_watch) && !df_entity_is_nil(reorder_group_next)) { state_dirty = 1; snap_to_cursor = 1; - d_entity_change_parent(reorder_group_next, reorder_group_next->parent, reorder_group_next->parent, reorder_group_prev); + df_entity_change_parent(reorder_group_next, reorder_group_next->parent, reorder_group_next->parent, reorder_group_prev); } } @@ -2911,8 +2911,8 @@ DF_VIEW_UI_FUNCTION_DEF(getting_started) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_Padding(ui_pct(1, 0)) UI_Focus(UI_FocusKind_Null) { - D_EntityList targets = d_push_active_target_list(scratch.arena); - D_EntityList processes = d_query_cached_entity_list_with_kind(DF_EntityKind_Process); + DF_EntityList targets = d_push_active_target_list(scratch.arena); + DF_EntityList processes = d_query_cached_entity_list_with_kind(DF_EntityKind_Process); //- rjf: icon & info UI_Padding(ui_em(2.f, 1.f)) @@ -2969,7 +2969,7 @@ DF_VIEW_UI_FUNCTION_DEF(getting_started) //- rjf: user has 1 target. build helper for launching it case 1: { - DF_Entity *target = d_first_entity_from_list(&targets); + DF_Entity *target = df_first_entity_from_list(&targets); String8 target_full_path = target->string; String8 target_name = str8_skip_last_slash(target_full_path); UI_PrefHeight(ui_em(3.75f, 1.f)) @@ -2982,12 +2982,12 @@ DF_VIEW_UI_FUNCTION_DEF(getting_started) { if(ui_clicked(df_icon_buttonf(DF_IconKind_Play, 0, "Launch %S", target_name))) { - df_cmd(DF_CmdKind_LaunchAndRun, .entity = d_handle_from_entity(target)); + df_cmd(DF_CmdKind_LaunchAndRun, .entity = df_handle_from_entity(target)); } ui_spacer(ui_em(1.5f, 1)); if(ui_clicked(df_icon_buttonf(DF_IconKind_Play, 0, "Step Into %S", target_name))) { - df_cmd(DF_CmdKind_LaunchAndInit, .entity = d_handle_from_entity(target)); + df_cmd(DF_CmdKind_LaunchAndInit, .entity = df_handle_from_entity(target)); } } }break; @@ -3952,11 +3952,11 @@ df_process_info_list_from_query(Arena *arena, String8 query) U64 attached_process_count = 0; U32 *attached_process_pids = 0; { - D_EntityList processes = d_query_cached_entity_list_with_kind(DF_EntityKind_Process); + DF_EntityList processes = d_query_cached_entity_list_with_kind(DF_EntityKind_Process); attached_process_count = processes.count; attached_process_pids = push_array(scratch.arena, U32, attached_process_count); U64 idx = 0; - for(D_EntityNode *n = processes.first; n != 0; n = n->next, idx += 1) + for(DF_EntityNode *n = processes.first; n != 0; n = n->next, idx += 1) { DF_Entity *process = n->entity; attached_process_pids[idx] = process->ctrl_id; @@ -4262,17 +4262,17 @@ struct DF_EntityListerItemArray }; internal DF_EntityListerItemList -df_entity_lister_item_list_from_needle(Arena *arena, DF_EntityKind kind, D_EntityFlags omit_flags, String8 needle) +df_entity_lister_item_list_from_needle(Arena *arena, DF_EntityKind kind, DF_EntityFlags omit_flags, String8 needle) { Temp scratch = scratch_begin(&arena, 1); DF_EntityListerItemList result = {0}; - D_EntityList ent_list = d_query_cached_entity_list_with_kind(kind); - for(D_EntityNode *n = ent_list.first; n != 0; n = n->next) + DF_EntityList ent_list = d_query_cached_entity_list_with_kind(kind); + for(DF_EntityNode *n = ent_list.first; n != 0; n = n->next) { DF_Entity *entity = n->entity; if(!(entity->flags & omit_flags)) { - String8 display_string = d_display_string_from_entity(scratch.arena, entity); + String8 display_string = df_display_string_from_entity(scratch.arena, entity); FuzzyMatchRangeList match_rngs = fuzzy_match_find(arena, needle, display_string); if(match_rngs.count != 0 || needle.size == 0) { @@ -4334,7 +4334,7 @@ DF_VIEW_UI_FUNCTION_DEF(entity_lister) DF_Window *window = df_window_from_handle(df_regs()->window); DF_CmdKindInfo *cmd_kind_info = df_cmd_kind_info_from_string(window->query_cmd_name); DF_EntityKind entity_kind = cmd_kind_info->query.entity_kind; - D_EntityFlags entity_flags_omit = D_EntityFlag_IsFolder; + DF_EntityFlags entity_flags_omit = DF_EntityFlag_IsFolder; F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); F32 scroll_bar_dim = floor_f32(ui_top_font_size()*1.5f); @@ -4346,7 +4346,7 @@ DF_VIEW_UI_FUNCTION_DEF(entity_lister) }; DF_EntityListerViewState *fev = df_view_user_state(view, DF_EntityListerViewState); D_Handle selected_entity_handle = fev->selected_entity_handle; - DF_Entity *selected_entity = d_entity_from_handle(selected_entity_handle); + DF_Entity *selected_entity = df_entity_from_handle(selected_entity_handle); //- rjf: build filtered array of entities DF_EntityListerItemList ent_list = df_entity_lister_item_list_from_needle(scratch.arena, entity_kind, entity_flags_omit, string); @@ -4354,10 +4354,10 @@ DF_VIEW_UI_FUNCTION_DEF(entity_lister) df_entity_lister_item_array_sort_by_strength__in_place(ent_arr); //- rjf: submit best match when hitting enter w/ no selection - if(d_entity_is_nil(d_entity_from_handle(fev->selected_entity_handle)) && ent_arr.count != 0 && ui_slot_press(UI_EventActionSlot_Accept)) + if(df_entity_is_nil(df_entity_from_handle(fev->selected_entity_handle)) && ent_arr.count != 0 && ui_slot_press(UI_EventActionSlot_Accept)) { DF_Entity *ent = ent_arr.v[0].entity; - df_cmd(DF_CmdKind_CompleteQuery, .entity = d_handle_from_entity(ent)); + df_cmd(DF_CmdKind_CompleteQuery, .entity = df_handle_from_entity(ent)); } //- rjf: selected entity -> cursor @@ -4425,8 +4425,8 @@ DF_VIEW_UI_FUNCTION_DEF(entity_lister) UI_PrefWidth(ui_text_dim(10, 1)) ui_label(df_g_icon_kind_text_table[icon_kind]); } - String8 display_string = d_display_string_from_entity(scratch.arena, ent); - Vec4F32 color = d_rgba_from_entity(ent); + String8 display_string = df_display_string_from_entity(scratch.arena, ent); + Vec4F32 color = df_rgba_from_entity(ent); if(color.w != 0) { ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = color)); @@ -4436,14 +4436,14 @@ DF_VIEW_UI_FUNCTION_DEF(entity_lister) } if(ui_clicked(ui_signal_from_box(box))) { - df_cmd(DF_CmdKind_CompleteQuery, .entity = d_handle_from_entity(ent)); + df_cmd(DF_CmdKind_CompleteQuery, .entity = df_handle_from_entity(ent)); } } } //- rjf: selected entity num -> handle { - fev->selected_entity_handle = (1 <= cursor.y && cursor.y <= ent_arr.count) ? d_handle_from_entity(ent_arr.v[cursor.y-1].entity) : d_handle_zero(); + fev->selected_entity_handle = (1 <= cursor.y && cursor.y <= ent_arr.count) ? df_handle_from_entity(ent_arr.v[cursor.y-1].entity) : d_handle_zero(); } scratch_end(scratch); @@ -4693,14 +4693,14 @@ DF_VIEW_CMD_FUNCTION_DEF(target) DF_Entity *storage_entity = entity; if(tv->pick_dst_kind != DF_EntityKind_Nil) { - DF_Entity *child = d_entity_child_from_kind(entity, tv->pick_dst_kind); - if(d_entity_is_nil(child)) + DF_Entity *child = df_entity_child_from_kind(entity, tv->pick_dst_kind); + if(df_entity_is_nil(child)) { - child = d_entity_alloc(entity, tv->pick_dst_kind); + child = df_entity_alloc(entity, tv->pick_dst_kind); } storage_entity = child; } - d_entity_equip_name(storage_entity, pick_string); + df_entity_equip_name(storage_entity, pick_string); }break; } } @@ -4712,7 +4712,7 @@ DF_VIEW_UI_FUNCTION_DEF(target) ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); DF_Entity *entity = d_entity_from_eval_string(string); - D_EntityList custom_entry_points = d_push_entity_child_list_with_kind(scratch.arena, entity, DF_EntityKind_EntryPoint); + DF_EntityList custom_entry_points = df_push_entity_child_list_with_kind(scratch.arena, entity, DF_EntityKind_EntryPoint); F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); //- rjf: grab state @@ -4737,10 +4737,10 @@ DF_VIEW_UI_FUNCTION_DEF(target) kv_info[] = { { 0, 0, 0, str8_lit("Label"), DF_EntityKind_Nil, entity->string }, - { 1, 0, 0, str8_lit("Executable"), DF_EntityKind_Executable, d_entity_child_from_kind(entity, DF_EntityKind_Executable)->string }, - { 0, 0, 0, str8_lit("Arguments"), DF_EntityKind_Arguments, d_entity_child_from_kind(entity, DF_EntityKind_Arguments)->string }, - { 0, 1, 0, str8_lit("Working Directory"), DF_EntityKind_WorkingDirectory, d_entity_child_from_kind(entity, DF_EntityKind_WorkingDirectory)->string }, - { 0, 0, 1, str8_lit("Entry Point Override"), DF_EntityKind_EntryPoint, d_entity_child_from_kind(entity, DF_EntityKind_EntryPoint)->string }, + { 1, 0, 0, str8_lit("Executable"), DF_EntityKind_Executable, df_entity_child_from_kind(entity, DF_EntityKind_Executable)->string }, + { 0, 0, 0, str8_lit("Arguments"), DF_EntityKind_Arguments, df_entity_child_from_kind(entity, DF_EntityKind_Arguments)->string }, + { 0, 1, 0, str8_lit("Working Directory"), DF_EntityKind_WorkingDirectory, df_entity_child_from_kind(entity, DF_EntityKind_WorkingDirectory)->string }, + { 0, 0, 1, str8_lit("Entry Point Override"), DF_EntityKind_EntryPoint, df_entity_child_from_kind(entity, DF_EntityKind_EntryPoint)->string }, }; //- rjf: take controls to start/end editing @@ -4941,16 +4941,16 @@ DF_VIEW_UI_FUNCTION_DEF(target) { default: { - DF_Entity *child = d_entity_child_from_kind(entity, commit_storage_child_kind); - if(d_entity_is_nil(child)) + DF_Entity *child = df_entity_child_from_kind(entity, commit_storage_child_kind); + if(df_entity_is_nil(child)) { - child = d_entity_alloc(entity, commit_storage_child_kind); + child = df_entity_alloc(entity, commit_storage_child_kind); } - d_entity_equip_name(child, new_string); + df_entity_equip_name(child, new_string); }break; case DF_EntityKind_Nil: { - d_entity_equip_name(entity, new_string); + df_entity_equip_name(entity, new_string); }break; } } @@ -4981,8 +4981,8 @@ DF_VIEW_UI_FUNCTION_DEF(targets) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); - D_EntityList targets_list = d_query_cached_entity_list_with_kind(DF_EntityKind_Target); - D_EntityFuzzyItemArray targets = d_entity_fuzzy_item_array_from_entity_list_needle(scratch.arena, &targets_list, string); + DF_EntityList targets_list = d_query_cached_entity_list_with_kind(DF_EntityKind_Target); + DF_EntityFuzzyItemArray targets = df_entity_fuzzy_item_array_from_entity_list_needle(scratch.arena, &targets_list, string); F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); //- rjf: grab state @@ -5002,7 +5002,7 @@ DF_VIEW_UI_FUNCTION_DEF(targets) // NOTE(rjf): 0 => nothing, 1 => add new, 2 => first target Vec2S64 cursor = {0}; { - DF_Entity *selected_target = d_entity_from_handle(tv->selected_target_handle); + DF_Entity *selected_target = df_entity_from_handle(tv->selected_target_handle); for(U64 idx = 0; idx < targets.count; idx += 1) { if(selected_target == targets.v[idx].entity) @@ -5067,7 +5067,7 @@ DF_VIEW_UI_FUNCTION_DEF(targets) UI_Signal sig = df_icon_buttonf(!target->disabled ? DF_IconKind_CheckFilled : DF_IconKind_CheckHollow, 0, "###ebl_%p", target); if(ui_clicked(sig)) { - df_cmd(!target->disabled ? DF_CmdKind_DisableTarget : DF_CmdKind_EnableTarget, .entity = d_handle_from_entity(target)); + df_cmd(!target->disabled ? DF_CmdKind_DisableTarget : DF_CmdKind_EnableTarget, .entity = df_handle_from_entity(target)); } } @@ -5106,7 +5106,7 @@ DF_VIEW_UI_FUNCTION_DEF(targets) } if(ui_clicked(sig)) { - df_cmd(ctrls[ctrl_idx].cmd, .entity = d_handle_from_entity(target)); + df_cmd(ctrls[ctrl_idx].cmd, .entity = df_handle_from_entity(target)); } } } @@ -5116,7 +5116,7 @@ DF_VIEW_UI_FUNCTION_DEF(targets) //- rjf: commit cursor to selection state { tv->selected_column = cursor.x; - tv->selected_target_handle = (1 < cursor.y && cursor.y < targets.count+2) ? d_handle_from_entity(targets.v[cursor.y-2].entity) : d_handle_zero(); + tv->selected_target_handle = (1 < cursor.y && cursor.y < targets.count+2) ? df_handle_from_entity(targets.v[cursor.y-2].entity) : d_handle_zero(); tv->selected_add = (cursor.y == 1); } @@ -5179,11 +5179,11 @@ DF_VIEW_CMD_FUNCTION_DEF(file_path_map) { String8 pick_string = cmd->regs->file_path; Side pick_side = fpms->pick_file_dst_side; - DF_Entity *storage_entity = d_entity_from_handle(fpms->pick_file_dst_map); + DF_Entity *storage_entity = df_entity_from_handle(fpms->pick_file_dst_map); df_cmd(pick_side == Side_Min ? DF_CmdKind_SetFileOverrideLinkSrc : DF_CmdKind_SetFileOverrideLinkDst, - .entity = d_handle_from_entity(storage_entity), + .entity = df_handle_from_entity(storage_entity), .file_path = pick_string); }break; } @@ -5194,8 +5194,8 @@ DF_VIEW_UI_FUNCTION_DEF(file_path_map) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); - D_EntityList maps_list = d_query_cached_entity_list_with_kind(DF_EntityKind_FilePathMap); - D_EntityArray maps = d_entity_array_from_list(scratch.arena, &maps_list); + DF_EntityList maps_list = d_query_cached_entity_list_with_kind(DF_EntityKind_FilePathMap); + DF_EntityArray maps = df_entity_array_from_list(scratch.arena, &maps_list); F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); //- rjf: grab state @@ -5284,8 +5284,8 @@ DF_VIEW_UI_FUNCTION_DEF(file_path_map) { U64 map_idx = row_idx-1; DF_Entity *map = (map_idx < maps.count ? maps.v[map_idx] : &d_nil_entity); - DF_Entity *map_src = d_entity_child_from_kind(map, DF_EntityKind_Source); - DF_Entity *map_dst = d_entity_child_from_kind(map, DF_EntityKind_Dest); + DF_Entity *map_src = df_entity_child_from_kind(map, DF_EntityKind_Source); + DF_Entity *map_dst = df_entity_child_from_kind(map, DF_EntityKind_Dest); String8 map_src_path = map_src->string; String8 map_dst_path = map_dst->string; B32 row_selected = (fpms->cursor.y == row_idx); @@ -5345,7 +5345,7 @@ DF_VIEW_UI_FUNCTION_DEF(file_path_map) if(value_selected) { commit_side = Side_Min; - commit_map = d_handle_from_entity(map); + commit_map = df_handle_from_entity(map); } } @@ -5355,7 +5355,7 @@ DF_VIEW_UI_FUNCTION_DEF(file_path_map) if(ui_clicked(ui_buttonf("Browse..."))) { df_cmd(DF_CmdKind_RunCommand, .string = df_cmd_kind_info_table[DF_CmdKind_PickFileOrFolder].string); - fpms->pick_file_dst_map = d_handle_from_entity(map); + fpms->pick_file_dst_map = df_handle_from_entity(map); fpms->pick_file_dst_side = Side_Min; } } @@ -5415,7 +5415,7 @@ DF_VIEW_UI_FUNCTION_DEF(file_path_map) if(value_selected) { commit_side = Side_Max; - commit_map = d_handle_from_entity(map); + commit_map = df_handle_from_entity(map); } } @@ -5426,7 +5426,7 @@ DF_VIEW_UI_FUNCTION_DEF(file_path_map) if(ui_clicked(ui_buttonf("Browse..."))) { df_cmd(DF_CmdKind_RunCommand, .string = df_cmd_kind_info_table[DF_CmdKind_PickFileOrFolder].string); - fpms->pick_file_dst_map = d_handle_from_entity(map); + fpms->pick_file_dst_map = df_handle_from_entity(map); fpms->pick_file_dst_side = Side_Max; } } @@ -5533,40 +5533,40 @@ DF_VIEW_UI_FUNCTION_DEF(scheduler) DF_SchedulerViewState *sv = df_view_user_state(view, DF_SchedulerViewState); //- rjf: get entities - D_EntityList machines = d_query_cached_entity_list_with_kind(DF_EntityKind_Machine); - D_EntityList processes = d_query_cached_entity_list_with_kind(DF_EntityKind_Process); - D_EntityList threads = d_query_cached_entity_list_with_kind(DF_EntityKind_Thread); + DF_EntityList machines = d_query_cached_entity_list_with_kind(DF_EntityKind_Machine); + DF_EntityList processes = d_query_cached_entity_list_with_kind(DF_EntityKind_Process); + DF_EntityList threads = d_query_cached_entity_list_with_kind(DF_EntityKind_Thread); //- rjf: produce list of items; no query -> all entities, in tree; query -> only show threads - D_EntityFuzzyItemArray items = {0}; + DF_EntityFuzzyItemArray items = {0}; ProfScope("query -> entities") { if(query.size == 0) { //- rjf: build flat array of entities, arranged into row order - D_EntityArray entities = {0}; + DF_EntityArray entities = {0}; { entities.count = machines.count+processes.count+threads.count; entities.v = push_array_no_zero(scratch.arena, DF_Entity *, entities.count); U64 idx = 0; - for(D_EntityNode *machine_n = machines.first; machine_n != 0; machine_n = machine_n->next) + for(DF_EntityNode *machine_n = machines.first; machine_n != 0; machine_n = machine_n->next) { DF_Entity *machine = machine_n->entity; entities.v[idx] = machine; idx += 1; - for(D_EntityNode *process_n = processes.first; process_n != 0; process_n = process_n->next) + for(DF_EntityNode *process_n = processes.first; process_n != 0; process_n = process_n->next) { DF_Entity *process = process_n->entity; - if(d_entity_ancestor_from_kind(process, DF_EntityKind_Machine) != machine) + if(df_entity_ancestor_from_kind(process, DF_EntityKind_Machine) != machine) { continue; } entities.v[idx] = process; idx += 1; - for(D_EntityNode *thread_n = threads.first; thread_n != 0; thread_n = thread_n->next) + for(DF_EntityNode *thread_n = threads.first; thread_n != 0; thread_n = thread_n->next) { DF_Entity *thread = thread_n->entity; - if(d_entity_ancestor_from_kind(thread, DF_EntityKind_Process) != process) + if(df_entity_ancestor_from_kind(thread, DF_EntityKind_Process) != process) { continue; } @@ -5578,11 +5578,11 @@ DF_VIEW_UI_FUNCTION_DEF(scheduler) } //- rjf: entities -> fuzzy-filtered entities - items = d_entity_fuzzy_item_array_from_entity_array_needle(scratch.arena, &entities, query); + items = df_entity_fuzzy_item_array_from_entity_array_needle(scratch.arena, &entities, query); } else { - items = d_entity_fuzzy_item_array_from_entity_list_needle(scratch.arena, &threads, query); + items = df_entity_fuzzy_item_array_from_entity_list_needle(scratch.arena, &threads, query); } } @@ -5590,7 +5590,7 @@ DF_VIEW_UI_FUNCTION_DEF(scheduler) Vec2S64 cursor = {sv->selected_column}; for(U64 idx = 0; idx < items.count; idx += 1) { - if(items.v[idx].entity == d_entity_from_handle(sv->selected_entity)) + if(items.v[idx].entity == df_entity_from_handle(sv->selected_entity)) { cursor.y = (S64)(idx+1); break; @@ -5663,7 +5663,7 @@ DF_VIEW_UI_FUNCTION_DEF(scheduler) if(ui_clicked(sig)) { D_CmdKind cmd_kind = frozen ? D_CmdKind_ThawEntity : D_CmdKind_FreezeEntity; - df_cmd(cmd_kind, .entity = d_handle_from_entity(entity)); + df_cmd(cmd_kind, .entity = df_handle_from_entity(entity)); } } UI_TableCellSized(ui_pct(1, 0)) @@ -5686,14 +5686,14 @@ DF_VIEW_UI_FUNCTION_DEF(scheduler) UI_TextAlignment(UI_TextAlign_Center) if(ui_clicked(ui_buttonf("Detach"))) { - df_cmd(D_CmdKind_Detach, .entity = d_handle_from_entity(entity)); + df_cmd(D_CmdKind_Detach, .entity = df_handle_from_entity(entity)); } } UI_TableCellSized(ui_em(2.25f, 1.f)) UI_FocusHot((row_is_selected && cursor.x == 3) ? UI_FocusKind_On : UI_FocusKind_Off) { if(ui_clicked(df_icon_buttonf(DF_IconKind_Redo, 0, "###retry"))) { - df_cmd(D_CmdKind_Restart, .entity = d_handle_from_entity(entity)); + df_cmd(D_CmdKind_Restart, .entity = df_handle_from_entity(entity)); } } UI_TableCellSized(ui_em(2.25f, 1.f)) UI_FocusHot((row_is_selected && cursor.x == 4) ? UI_FocusKind_On : UI_FocusKind_Off) @@ -5701,7 +5701,7 @@ DF_VIEW_UI_FUNCTION_DEF(scheduler) DF_Palette(DF_PaletteCode_NegativePopButton) if(ui_clicked(df_icon_buttonf(DF_IconKind_X, 0, "###kill"))) { - df_cmd(D_CmdKind_Kill, .entity = d_handle_from_entity(entity)); + df_cmd(D_CmdKind_Kill, .entity = df_handle_from_entity(entity)); } } }break; @@ -5730,7 +5730,7 @@ DF_VIEW_UI_FUNCTION_DEF(scheduler) //- rjf: selected num -> selected entity sv->selected_column = cursor.x; - sv->selected_entity = (1 <= cursor.y && cursor.y <= items.count) ? d_handle_from_entity(items.v[cursor.y-1].entity) : d_handle_zero(); + sv->selected_entity = (1 <= cursor.y && cursor.y <= items.count) ? df_handle_from_entity(items.v[cursor.y-1].entity) : d_handle_zero(); scratch_end(scratch); ProfEnd(); @@ -5816,7 +5816,7 @@ DF_VIEW_CMD_FUNCTION_DEF(modules) { Temp scratch = scratch_begin(0, 0); String8 pick_string = cmd->regs->file_path; - DF_Entity *module = d_entity_from_handle(mv->pick_file_dst_entity); + DF_Entity *module = df_entity_from_handle(mv->pick_file_dst_entity); if(module->kind == DF_EntityKind_Module) { String8 exe_path = module->string; @@ -5843,27 +5843,27 @@ DF_VIEW_UI_FUNCTION_DEF(modules) F32 *col_pcts[] = {&mv->idx_col_pct, &mv->desc_col_pct, &mv->range_col_pct, &mv->dbg_col_pct}; //- rjf: get entities - D_EntityList processes = d_query_cached_entity_list_with_kind(DF_EntityKind_Process); - D_EntityList modules = d_query_cached_entity_list_with_kind(DF_EntityKind_Module); + DF_EntityList processes = d_query_cached_entity_list_with_kind(DF_EntityKind_Process); + DF_EntityList modules = d_query_cached_entity_list_with_kind(DF_EntityKind_Module); //- rjf: make filtered item array - D_EntityFuzzyItemArray items = {0}; + DF_EntityFuzzyItemArray items = {0}; if(query.size == 0) { - D_EntityArray entities = {0}; + DF_EntityArray entities = {0}; { entities.count = processes.count+modules.count; entities.v = push_array_no_zero(scratch.arena, DF_Entity *, entities.count); U64 idx = 0; - for(D_EntityNode *process_n = processes.first; process_n != 0; process_n = process_n->next) + for(DF_EntityNode *process_n = processes.first; process_n != 0; process_n = process_n->next) { DF_Entity *process = process_n->entity; entities.v[idx] = process; idx += 1; - for(D_EntityNode *module_n = modules.first; module_n != 0; module_n = module_n->next) + for(DF_EntityNode *module_n = modules.first; module_n != 0; module_n = module_n->next) { DF_Entity *module = module_n->entity; - if(d_entity_ancestor_from_kind(module, DF_EntityKind_Process) != process) + if(df_entity_ancestor_from_kind(module, DF_EntityKind_Process) != process) { continue; } @@ -5872,18 +5872,18 @@ DF_VIEW_UI_FUNCTION_DEF(modules) } } } - items = d_entity_fuzzy_item_array_from_entity_array_needle(scratch.arena, &entities, query); + items = df_entity_fuzzy_item_array_from_entity_array_needle(scratch.arena, &entities, query); } else { - items = d_entity_fuzzy_item_array_from_entity_list_needle(scratch.arena, &modules, query); + items = df_entity_fuzzy_item_array_from_entity_list_needle(scratch.arena, &modules, query); } //- rjf: selected column/entity -> selected cursor Vec2S64 cursor = {mv->selected_column}; for(U64 idx = 0; idx < items.count; idx += 1) { - if(items.v[idx].entity == d_entity_from_handle(mv->selected_entity)) + if(items.v[idx].entity == df_entity_from_handle(mv->selected_entity)) { cursor.y = (S64)(idx+1); break; @@ -6057,7 +6057,7 @@ DF_VIEW_UI_FUNCTION_DEF(modules) if(ui_clicked(ui_buttonf("Browse...")) || (brw_is_selected && edit_begin)) { df_cmd(DF_CmdKind_RunCommand, .string = df_cmd_kind_info_table[DF_CmdKind_PickFile].string); - mv->pick_file_dst_entity = d_handle_from_entity(entity); + mv->pick_file_dst_entity = df_handle_from_entity(entity); } } } @@ -6072,7 +6072,7 @@ DF_VIEW_UI_FUNCTION_DEF(modules) if(edit_commit) { mv->txt_editing = 0; - if(!d_entity_is_nil(commit_module)) + if(!df_entity_is_nil(commit_module)) { String8 exe_path = commit_module->string; String8 dbg_path = str8(mv->txt_buffer, mv->txt_size); @@ -6092,7 +6092,7 @@ DF_VIEW_UI_FUNCTION_DEF(modules) //- rjf: selected num -> selected entity mv->selected_column = cursor.x; - mv->selected_entity = (1 <= cursor.y && cursor.y <= items.count) ? d_handle_from_entity(items.v[cursor.y-1].entity) : d_handle_zero(); + mv->selected_entity = (1 <= cursor.y && cursor.y <= items.count) ? df_handle_from_entity(items.v[cursor.y-1].entity) : d_handle_zero(); di_scope_close(scope); scratch_end(scratch); @@ -6748,8 +6748,8 @@ DF_VIEW_CMD_FUNCTION_DEF(disasm) { DF_Entity *process = &d_nil_entity; { - DF_Entity *entity = d_entity_from_handle(cmd->regs->entity); - if(!d_entity_is_nil(entity) && + DF_Entity *entity = df_entity_from_handle(cmd->regs->entity); + if(!df_entity_is_nil(entity) && (entity->kind == DF_EntityKind_Process || entity->kind == DF_EntityKind_Thread || entity->kind == DF_EntityKind_Module)) @@ -6758,7 +6758,7 @@ DF_VIEW_CMD_FUNCTION_DEF(disasm) if(entity->kind == DF_EntityKind_Thread || entity->kind == DF_EntityKind_Module) { - process = d_entity_ancestor_from_kind(process, DF_EntityKind_Process); + process = df_entity_ancestor_from_kind(process, DF_EntityKind_Process); } } } diff --git a/src/dbg_frontend/dbg_frontend_widgets.c b/src/dbg_frontend/dbg_frontend_widgets.c index 8b4bf217..4aa1e014 100644 --- a/src/dbg_frontend/dbg_frontend_widgets.c +++ b/src/dbg_frontend/dbg_frontend_widgets.c @@ -424,13 +424,13 @@ df_entity_tooltips(DF_Entity *entity) case DF_EntityKind_File: UI_Tooltip UI_PrefWidth(ui_text_dim(10, 1)) { - String8 full_path = d_full_path_from_entity(scratch.arena, entity); + String8 full_path = df_full_path_from_entity(scratch.arena, entity); ui_label(full_path); }break; case DF_EntityKind_Thread: UI_Flags(0) UI_Tooltip UI_PrefWidth(ui_text_dim(10, 1)) { - String8 display_string = d_display_string_from_entity(scratch.arena, entity); + String8 display_string = df_display_string_from_entity(scratch.arena, entity); CTRL_Entity *entity_ctrl = ctrl_entity_from_handle(d_state->ctrl_entity_store, entity->ctrl_handle); U64 rip_vaddr = d_query_cached_rip_from_thread(entity_ctrl); Arch arch = entity_ctrl->arch; @@ -438,15 +438,15 @@ df_entity_tooltips(DF_Entity *entity) U32 pid_or_tid = entity->ctrl_id; if(display_string.size != 0) UI_PrefWidth(ui_children_sum(1)) UI_Row { - if(entity->flags & D_EntityFlag_HasColor) + if(entity->flags & DF_EntityFlag_HasColor) { - ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = d_rgba_from_entity(entity))); + ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = df_rgba_from_entity(entity))); } UI_PrefWidth(ui_text_dim(10, 1)) ui_label(display_string); } { CTRL_Event stop_event = d_ctrl_last_stop_event(); - DF_Entity *stopper_thread = d_entity_from_ctrl_handle(stop_event.entity); + DF_Entity *stopper_thread = df_entity_from_ctrl_handle(stop_event.entity); if(stopper_thread == entity) { ui_spacer(ui_em(1.5f, 1.f)); @@ -542,15 +542,15 @@ df_entity_tooltips(DF_Entity *entity) case DF_EntityKind_Breakpoint: UI_Flags(0) UI_Tooltip UI_PrefWidth(ui_text_dim(10, 1)) { - if(entity->flags & D_EntityFlag_HasColor) + if(entity->flags & DF_EntityFlag_HasColor) { - ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = d_rgba_from_entity(entity))); + ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = df_rgba_from_entity(entity))); } - String8 display_string = d_display_string_from_entity(scratch.arena, entity); + String8 display_string = df_display_string_from_entity(scratch.arena, entity); UI_PrefWidth(ui_text_dim(10, 1)) ui_label(display_string); UI_PrefWidth(ui_children_sum(1)) UI_Row { - String8 stop_condition = d_entity_child_from_kind(entity, DF_EntityKind_Condition)->string; + String8 stop_condition = df_entity_child_from_kind(entity, DF_EntityKind_Condition)->string; if(stop_condition.size == 0) { stop_condition = str8_lit("true"); @@ -570,11 +570,11 @@ df_entity_tooltips(DF_Entity *entity) DF_Font(DF_FontSlot_Code) UI_Tooltip UI_PrefWidth(ui_text_dim(10, 1)) { - if(entity->flags & D_EntityFlag_HasColor) + if(entity->flags & DF_EntityFlag_HasColor) { - ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = d_rgba_from_entity(entity))); + ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = df_rgba_from_entity(entity))); } - String8 display_string = d_display_string_from_entity(scratch.arena, entity); + String8 display_string = df_display_string_from_entity(scratch.arena, entity); UI_PrefWidth(ui_text_dim(10, 1)) df_code_label(1.f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), display_string); }break; } @@ -630,9 +630,9 @@ df_entity_desc_button(DF_Entity *entity, FuzzyMatchRangeList *name_matches, Stri DF_IconKind icon = df_entity_kind_icon_kind_table[entity->kind]; Vec4F32 entity_color = palette->colors[UI_ColorCode_Text]; Vec4F32 entity_color_weak = palette->colors[UI_ColorCode_TextWeak]; - if(entity->flags & D_EntityFlag_HasColor) + if(entity->flags & DF_EntityFlag_HasColor) { - entity_color = d_rgba_from_entity(entity); + entity_color = df_rgba_from_entity(entity); entity_color_weak = entity_color; entity_color_weak.w *= 0.5f; } @@ -660,7 +660,7 @@ df_entity_desc_button(DF_Entity *entity, FuzzyMatchRangeList *name_matches, Stri } } } - String8 label = d_display_string_from_entity(scratch.arena, entity); + String8 label = df_display_string_from_entity(scratch.arena, entity); UI_Palette(ui_build_palette(ui_top_palette(), .text = entity_color)) DF_Font(kind_flags&DF_EntityKindFlag_NameIsCode ? DF_FontSlot_Code : DF_FontSlot_Main) UI_Flags((entity->kind == DF_EntityKind_Thread || @@ -677,7 +677,7 @@ df_entity_desc_button(DF_Entity *entity, FuzzyMatchRangeList *name_matches, Stri } if(entity->kind == DF_EntityKind_Target) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_FontSize(ui_top_font_size()*0.95f) { - DF_Entity *args = d_entity_child_from_kind(entity, DF_EntityKind_Arguments); + DF_Entity *args = df_entity_child_from_kind(entity, DF_EntityKind_Arguments); ui_label(args->string); } if(kind_flags & DF_EntityKindFlag_CanEnable && entity->disabled) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_FontSize(ui_top_font_size()*0.95f) UI_HeightFill @@ -741,13 +741,13 @@ df_entity_desc_button(DF_Entity *entity, FuzzyMatchRangeList *name_matches, Stri // rjf: click => fastpath for this entity if(ui_clicked(sig)) { - df_cmd(DF_CmdKind_EntityRefFastPath, .entity = d_handle_from_entity(entity)); + df_cmd(DF_CmdKind_EntityRefFastPath, .entity = df_handle_from_entity(entity)); } // rjf: right-click => context menu for this entity else if(ui_right_clicked(sig)) { - D_Handle handle = d_handle_from_entity(entity); + D_Handle handle = df_handle_from_entity(entity); DF_Window *window = df_window_from_handle(df_regs()->window); ui_ctx_menu_open(df_state->entity_ctx_menu_key, sig.box->key, v2f32(0, sig.box->rect.y1 - sig.box->rect.y0)); window->entity_ctx_menu_entity = handle; @@ -758,7 +758,7 @@ df_entity_desc_button(DF_Entity *entity, FuzzyMatchRangeList *name_matches, Stri { DF_DragDropPayload payload = {0}; payload.key = box->key; - payload.entity = d_handle_from_entity(entity); + payload.entity = df_handle_from_entity(entity); df_drag_begin(&payload); } } @@ -1152,7 +1152,7 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe if(ui_right_clicked(thread_sig)) { // TODO(rjf): @msgs top-level regs-based ctx menu here!!!! - // D_Handle handle = d_handle_from_entity(thread); + // D_Handle handle = df_handle_from_entity(thread); // ui_ctx_menu_open(df_state->entity_ctx_menu_key, thread_box->key, v2f32(0, thread_box->rect.y1-thread_box->rect.y0)); // DF_Window *window = df_window_from_handle(df_regs()->window); // window->entity_ctx_menu_entity = handle; @@ -1164,7 +1164,7 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe // TODO(rjf): @msgs top-level regs-based drag/drop here!!! // DF_DragDropPayload payload = {0}; // payload.key = thread_box->key; - // payload.entity = d_handle_from_entity(thread); + // payload.entity = df_handle_from_entity(thread); // df_drag_begin(&payload); } } @@ -1198,8 +1198,8 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe line_num += 1, line_idx += 1) { CTRL_EntityList line_ips = params->line_ips[line_idx]; - D_EntityList line_bps = params->line_bps[line_idx]; - D_EntityList line_pins = params->line_pins[line_idx]; + DF_EntityList line_bps = params->line_bps[line_idx]; + DF_EntityList line_pins = params->line_pins[line_idx]; ui_set_next_hover_cursor(OS_Cursor_HandPoint); UI_Box *line_margin_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable*!!(params->flags & DF_CodeSliceFlag_Clickable)|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawActiveEffects, "line_margin_%I64x", line_num); UI_Parent(line_margin_box) @@ -1310,7 +1310,7 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe if(ui_right_clicked(thread_sig)) { // TODO(rjf): @msgs top-level regs-based ctx menu here!!!! - // D_Handle handle = d_handle_from_entity(thread); + // D_Handle handle = df_handle_from_entity(thread); // ui_ctx_menu_open(df_state->entity_ctx_menu_key, thread_box->key, v2f32(0, thread_box->rect.y1-thread_box->rect.y0)); // DF_Window *window = df_window_from_handle(df_regs()->window); // window->entity_ctx_menu_entity = handle; @@ -1329,19 +1329,19 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe // TODO(rjf): @msgs top-level regs-based drag/drop here!!! // DF_DragDropPayload payload = {0}; // payload.key = thread_box->key; - // payload.entity = d_handle_from_entity(thread); + // payload.entity = df_handle_from_entity(thread); // df_drag_begin(&payload); } } //- rjf: build margin breakpoint ui - for(D_EntityNode *n = line_bps.first; n != 0; n = n->next) + for(DF_EntityNode *n = line_bps.first; n != 0; n = n->next) { DF_Entity *bp = n->entity; Vec4F32 bp_color = df_rgba_from_theme_color(DF_ThemeColor_Breakpoint); - if(bp->flags & D_EntityFlag_HasColor) + if(bp->flags & DF_EntityFlag_HasColor) { - bp_color = d_rgba_from_entity(bp); + bp_color = df_rgba_from_entity(bp); } if(bp->disabled) { @@ -1398,21 +1398,21 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe // rjf: click => remove breakpoint if(ui_clicked(bp_sig)) { - df_cmd(DF_CmdKind_RemoveBreakpoint, .entity = d_handle_from_entity(bp)); + df_cmd(DF_CmdKind_RemoveBreakpoint, .entity = df_handle_from_entity(bp)); } // rjf: drag start if(ui_dragging(bp_sig) && !contains_2f32(bp_box->rect, ui_mouse())) { DF_DragDropPayload payload = {0}; - payload.entity = d_handle_from_entity(bp); + payload.entity = df_handle_from_entity(bp); df_drag_begin(&payload); } // rjf: bp right-click menu if(ui_right_clicked(bp_sig)) { - D_Handle handle = d_handle_from_entity(bp); + D_Handle handle = df_handle_from_entity(bp); ui_ctx_menu_open(df_state->entity_ctx_menu_key, bp_box->key, v2f32(0, bp_box->rect.y1-bp_box->rect.y0)); DF_Window *window = df_window_from_handle(df_regs()->window); window->entity_ctx_menu_entity = handle; @@ -1420,13 +1420,13 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe } //- rjf: build margin watch pin ui - for(D_EntityNode *n = line_pins.first; n != 0; n = n->next) + for(DF_EntityNode *n = line_pins.first; n != 0; n = n->next) { DF_Entity *pin = n->entity; Vec4F32 color = df_rgba_from_theme_color(DF_ThemeColor_Text); - if(pin->flags & D_EntityFlag_HasColor) + if(pin->flags & DF_EntityFlag_HasColor) { - color = d_rgba_from_entity(pin); + color = df_rgba_from_entity(pin); } // rjf: build box for watch @@ -1456,21 +1456,21 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe // rjf: click => remove pin if(ui_clicked(pin_sig)) { - df_cmd(DF_CmdKind_RemoveEntity, .entity = d_handle_from_entity(pin)); + df_cmd(DF_CmdKind_RemoveEntity, .entity = df_handle_from_entity(pin)); } // rjf: drag start if(ui_dragging(pin_sig) && !contains_2f32(pin_box->rect, ui_mouse())) { DF_DragDropPayload payload = {0}; - payload.entity = d_handle_from_entity(pin); + payload.entity = df_handle_from_entity(pin); df_drag_begin(&payload); } // rjf: watch right-click menu if(ui_right_clicked(pin_sig)) { - D_Handle handle = d_handle_from_entity(pin); + D_Handle handle = df_handle_from_entity(pin); ui_ctx_menu_open(df_state->entity_ctx_menu_key, pin_box->key, v2f32(0, pin_box->rect.y1-pin_box->rect.y0)); DF_Window *window = df_window_from_handle(df_regs()->window); window->entity_ctx_menu_entity = handle; @@ -1651,13 +1651,13 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe line_num < params->line_num_range.max; line_num += 1, line_idx += 1) { - D_EntityList pins = params->line_pins[line_idx]; + DF_EntityList pins = params->line_pins[line_idx]; if(pins.count != 0) UI_Parent(line_extras_boxes[line_idx]) DF_Font(DF_FontSlot_Code) UI_FontSize(params->font_size) UI_PrefHeight(ui_px(params->line_height_px, 1.f)) { - for(D_EntityNode *n = pins.first; n != 0; n = n->next) + for(DF_EntityNode *n = pins.first; n != 0; n = n->next) { DF_Entity *pin = n->entity; String8 pin_expr = pin->string; @@ -1678,9 +1678,9 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe UI_Parent(pin_box) UI_PrefWidth(ui_text_dim(10, 1)) { Vec4F32 pin_color = df_rgba_from_theme_color(DF_ThemeColor_CodeDefault); - if(pin->flags & D_EntityFlag_HasColor) + if(pin->flags & DF_EntityFlag_HasColor) { - pin_color = d_rgba_from_entity(pin); + pin_color = df_rgba_from_entity(pin); } UI_PrefWidth(ui_em(1.5f, 1.f)) DF_Font(DF_FontSlot_Icons) @@ -1692,14 +1692,14 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe if(ui_dragging(sig) && !contains_2f32(sig.box->rect, ui_mouse())) { DF_DragDropPayload payload = {0}; - payload.entity = d_handle_from_entity(pin); + payload.entity = df_handle_from_entity(pin); df_drag_begin(&payload); } if(ui_right_clicked(sig)) { ui_ctx_menu_open(df_state->entity_ctx_menu_key, sig.box->key, v2f32(0, sig.box->rect.y1-sig.box->rect.y0)); DF_Window *window = df_window_from_handle(df_regs()->window); - window->entity_ctx_menu_entity = d_handle_from_entity(pin); + window->entity_ctx_menu_entity = df_handle_from_entity(pin); } } df_code_label(0.8f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), pin_expr); @@ -1860,7 +1860,7 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe if(df_drag_is_active() && contains_2f32(clipped_top_container_rect, ui_mouse())) { DF_DragDropPayload *payload = &df_drag_drop_payload; - DF_Entity *entity = d_entity_from_handle(payload->entity); + DF_Entity *entity = df_entity_from_handle(payload->entity); if(entity->kind == DF_EntityKind_Thread || entity->kind == DF_EntityKind_WatchPin || entity->kind == DF_EntityKind_Breakpoint) @@ -1872,7 +1872,7 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe //- rjf: drop target is dropped -> process { DF_DragDropPayload payload = {0}; - if(!d_entity_is_nil(line_drag_entity) && df_drag_drop(&payload) && contains_1s64(params->line_num_range, mouse_pt.line)) + if(!df_entity_is_nil(line_drag_entity) && df_drag_drop(&payload) && contains_1s64(params->line_num_range, mouse_pt.line)) { DF_Entity *dropped_entity = line_drag_entity; S64 line_num = mouse_pt.line; @@ -1885,7 +1885,7 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe case DF_EntityKind_WatchPin: { df_cmd(DF_CmdKind_RelocateEntity, - .entity = d_handle_from_entity(dropped_entity), + .entity = df_handle_from_entity(dropped_entity), .file_path = df_regs()->file_path, .cursor = txt_pt(line_num, 1), .vaddr = line_vaddr); @@ -2001,12 +2001,12 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe ////////////////////////////// //- rjf: dragging entity which applies to lines over this slice -> visualize // - if(!d_entity_is_nil(line_drag_entity) && contains_2f32(clipped_top_container_rect, ui_mouse())) + if(!df_entity_is_nil(line_drag_entity) && contains_2f32(clipped_top_container_rect, ui_mouse())) { Vec4F32 color = df_rgba_from_theme_color(DF_ThemeColor_DropSiteOverlay); - if(line_drag_entity->flags & D_EntityFlag_HasColor) + if(line_drag_entity->flags & DF_EntityFlag_HasColor) { - color = d_rgba_from_entity(line_drag_entity); + color = df_rgba_from_entity(line_drag_entity); color.w /= 2; } DR_Bucket *bucket = dr_bucket_make(); diff --git a/src/dbg_frontend/dbg_frontend_widgets.h b/src/dbg_frontend/dbg_frontend_widgets.h index b143d480..d8029d07 100644 --- a/src/dbg_frontend/dbg_frontend_widgets.h +++ b/src/dbg_frontend/dbg_frontend_widgets.h @@ -42,9 +42,9 @@ struct DF_CodeSliceParams String8 *line_text; Rng1U64 *line_ranges; TXT_TokenArray *line_tokens; - D_EntityList *line_bps; + DF_EntityList *line_bps; CTRL_EntityList *line_ips; - D_EntityList *line_pins; + DF_EntityList *line_pins; U64 *line_vaddrs; D_LineList *line_infos; DI_KeyList relevant_dbgi_keys; diff --git a/src/dbg_frontend/generated/dbg_frontend.meta.c b/src/dbg_frontend/generated/dbg_frontend.meta.c index cc97ee29..93ac4e04 100644 --- a/src/dbg_frontend/generated/dbg_frontend.meta.c +++ b/src/dbg_frontend/generated/dbg_frontend.meta.c @@ -28,6 +28,176 @@ DF_CmdKind_Null, DF_CmdKind_Null, }; +String8 d_entity_kind_display_string_table[30] = +{ +str8_lit_comp("Nil"), +str8_lit_comp("Root"), +str8_lit_comp("Machine"), +str8_lit_comp("File"), +str8_lit_comp("Auto View Rule"), +str8_lit_comp("File Path Map"), +str8_lit_comp("Watch Pin"), +str8_lit_comp("Watch"), +str8_lit_comp("View Rule"), +str8_lit_comp("Breakpoint"), +str8_lit_comp("Condition"), +str8_lit_comp("Location"), +str8_lit_comp("Target"), +str8_lit_comp("Executable"), +str8_lit_comp("Arguments"), +str8_lit_comp("Working Directory"), +str8_lit_comp("Entry Point"), +str8_lit_comp("Window"), +str8_lit_comp("Panel"), +str8_lit_comp("View"), +str8_lit_comp("Recent Project"), +str8_lit_comp("Source"), +str8_lit_comp("Destination"), +str8_lit_comp("Process"), +str8_lit_comp("Thread"), +str8_lit_comp("Module"), +str8_lit_comp("Pending Thread Name"), +str8_lit_comp("Debug Info Path"), +str8_lit_comp("Conversion Task"), +str8_lit_comp("Conversion Failure"), +}; + +String8 d_entity_kind_name_lower_table[30] = +{ +str8_lit_comp("nil"), +str8_lit_comp("root"), +str8_lit_comp("machine"), +str8_lit_comp("file"), +str8_lit_comp("auto_view_rule"), +str8_lit_comp("file_path_map"), +str8_lit_comp("watch_pin"), +str8_lit_comp("watch"), +str8_lit_comp("view_rule"), +str8_lit_comp("breakpoint"), +str8_lit_comp("condition"), +str8_lit_comp("location"), +str8_lit_comp("target"), +str8_lit_comp("executable"), +str8_lit_comp("arguments"), +str8_lit_comp("working_directory"), +str8_lit_comp("entry_point"), +str8_lit_comp("window"), +str8_lit_comp("panel"), +str8_lit_comp("view"), +str8_lit_comp("recent_project"), +str8_lit_comp("source"), +str8_lit_comp("dest"), +str8_lit_comp("process"), +str8_lit_comp("thread"), +str8_lit_comp("module"), +str8_lit_comp("pending_thread_name"), +str8_lit_comp("debug_info_path"), +str8_lit_comp("conversion_task"), +str8_lit_comp("conversion_fail"), +}; + +String8 d_entity_kind_name_lower_plural_table[30] = +{ +str8_lit_comp("nils"), +str8_lit_comp("roots"), +str8_lit_comp("machines"), +str8_lit_comp("files"), +str8_lit_comp("auto_view_rules"), +str8_lit_comp("file_path_maps"), +str8_lit_comp("watch_pins"), +str8_lit_comp("watches"), +str8_lit_comp("view_rules"), +str8_lit_comp("breakpoints"), +str8_lit_comp("conditions"), +str8_lit_comp("locations"), +str8_lit_comp("targets"), +str8_lit_comp("executables"), +str8_lit_comp("argumentses"), +str8_lit_comp("working_directories"), +str8_lit_comp("entry_points"), +str8_lit_comp("windows"), +str8_lit_comp("panels"), +str8_lit_comp("views"), +str8_lit_comp("recent_projects"), +str8_lit_comp("sources"), +str8_lit_comp("dests"), +str8_lit_comp("processes"), +str8_lit_comp("threads"), +str8_lit_comp("modules"), +str8_lit_comp("pending_thread_names"), +str8_lit_comp("debug_info_paths"), +str8_lit_comp("conversion_tasks"), +str8_lit_comp("conversion_fails"), +}; + +String8 d_entity_kind_name_label_table[30] = +{ +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Expression"), +str8_lit_comp("Expression"), +str8_lit_comp("Expression"), +str8_lit_comp("Label"), +str8_lit_comp("Expression"), +str8_lit_comp("Location"), +str8_lit_comp("Label"), +str8_lit_comp("Executable"), +str8_lit_comp("Arguments"), +str8_lit_comp("Execution Path"), +str8_lit_comp("Symbol Name"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Path"), +str8_lit_comp("Path"), +str8_lit_comp("Path"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +}; + +DF_EntityKindFlags d_entity_kind_flags_table[30] = +{ +(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), +(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), +(0*DF_EntityKindFlag_CanDelete) | (1*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (1*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), +(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), +(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (1*DF_EntityKindFlag_IsSerializedToConfig), +(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (1*DF_EntityKindFlag_IsSerializedToConfig), +(1*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (1*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (1*DF_EntityKindFlag_CanDuplicate) | (1*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (1*DF_EntityKindFlag_IsSerializedToConfig), +(1*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (1*DF_EntityKindFlag_CanRename) | (1*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (1*DF_EntityKindFlag_CanDuplicate) | (1*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (1*DF_EntityKindFlag_IsSerializedToConfig), +(1*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (1*DF_EntityKindFlag_CanRename) | (1*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (1*DF_EntityKindFlag_CanDuplicate) | (1*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), +(1*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (1*DF_EntityKindFlag_CanRename) | (1*DF_EntityKindFlag_CanEnable) | (1*DF_EntityKindFlag_CanCondition) | (1*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (1*DF_EntityKindFlag_IsSerializedToConfig), +(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (1*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), +(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (1*DF_EntityKindFlag_NameIsCode) | (1*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), +(1*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (1*DF_EntityKindFlag_CanEdit) | (1*DF_EntityKindFlag_CanRename) | (1*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (1*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (1*DF_EntityKindFlag_IsSerializedToConfig), +(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (1*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), +(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), +(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (1*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), +(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), +(1*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (1*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (1*DF_EntityKindFlag_IsSerializedToConfig), +(1*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (1*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (1*DF_EntityKindFlag_IsSerializedToConfig), +(1*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (1*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (1*DF_EntityKindFlag_UserDefinedLifetime) | (1*DF_EntityKindFlag_IsSerializedToConfig), +(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (1*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (1*DF_EntityKindFlag_IsSerializedToConfig), +(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), +(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), +(0*DF_EntityKindFlag_CanDelete) | (1*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (1*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), +(0*DF_EntityKindFlag_CanDelete) | (1*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (1*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), +(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), +(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), +(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (0*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), +(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (1*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), +(0*DF_EntityKindFlag_CanDelete) | (0*DF_EntityKindFlag_CanFreeze) | (0*DF_EntityKindFlag_CanEdit) | (1*DF_EntityKindFlag_CanRename) | (0*DF_EntityKindFlag_CanEnable) | (0*DF_EntityKindFlag_CanCondition) | (0*DF_EntityKindFlag_CanDuplicate) | (0*DF_EntityKindFlag_NameIsCode) | (0*DF_EntityKindFlag_NameIsPath) | (0*DF_EntityKindFlag_UserDefinedLifetime) | (0*DF_EntityKindFlag_IsSerializedToConfig), +}; + Rng1U64 df_reg_slot_range_table[32] = { {0}, diff --git a/src/dbg_frontend/generated/dbg_frontend.meta.h b/src/dbg_frontend/generated/dbg_frontend.meta.h index 49343e5d..624740a2 100644 --- a/src/dbg_frontend/generated/dbg_frontend.meta.h +++ b/src/dbg_frontend/generated/dbg_frontend.meta.h @@ -6,6 +6,41 @@ #ifndef DBG_FRONTEND_META_H #define DBG_FRONTEND_META_H +typedef enum DF_EntityKind +{ +DF_EntityKind_Nil, +DF_EntityKind_Root, +DF_EntityKind_Machine, +DF_EntityKind_File, +DF_EntityKind_AutoViewRule, +DF_EntityKind_FilePathMap, +DF_EntityKind_WatchPin, +DF_EntityKind_Watch, +DF_EntityKind_ViewRule, +DF_EntityKind_Breakpoint, +DF_EntityKind_Condition, +DF_EntityKind_Location, +DF_EntityKind_Target, +DF_EntityKind_Executable, +DF_EntityKind_Arguments, +DF_EntityKind_WorkingDirectory, +DF_EntityKind_EntryPoint, +DF_EntityKind_Window, +DF_EntityKind_Panel, +DF_EntityKind_View, +DF_EntityKind_RecentProject, +DF_EntityKind_Source, +DF_EntityKind_Dest, +DF_EntityKind_Process, +DF_EntityKind_Thread, +DF_EntityKind_Module, +DF_EntityKind_PendingThreadName, +DF_EntityKind_DebugInfoPath, +DF_EntityKind_ConversionTask, +DF_EntityKind_ConversionFail, +DF_EntityKind_COUNT, +} DF_EntityKind; + typedef enum DF_RegSlot { DF_RegSlot_Null, @@ -707,6 +742,11 @@ C_LINKAGE_BEGIN extern DF_CmdKind d_cfg_src_load_cmd_kind_table[4]; extern DF_CmdKind d_cfg_src_write_cmd_kind_table[4]; extern DF_CmdKind d_cfg_src_apply_cmd_kind_table[4]; +extern String8 d_entity_kind_display_string_table[30]; +extern String8 d_entity_kind_name_lower_table[30]; +extern String8 d_entity_kind_name_lower_plural_table[30]; +extern String8 d_entity_kind_name_label_table[30]; +extern DF_EntityKindFlags d_entity_kind_flags_table[30]; extern Rng1U64 df_reg_slot_range_table[32]; extern DF_StringBindingPair df_g_default_binding_table[110]; extern String8 df_g_binding_version_remap_old_name_table[7]; diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 57b6ce0b..9727d852 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -775,8 +775,8 @@ entry_point(CmdLine *cmd_line) if(args.node_count > 0 && args.first->string.size != 0) { Temp scratch = scratch_begin(0, 0); - DF_Entity *target = d_entity_alloc(d_entity_root(), DF_EntityKind_Target); - d_entity_equip_cfg_src(target, D_CfgSrc_CommandLine); + DF_Entity *target = df_entity_alloc(df_entity_root(), DF_EntityKind_Target); + df_entity_equip_cfg_src(target, D_CfgSrc_CommandLine); String8List passthrough_args_list = {0}; for(String8Node *n = args.first->next; n != 0; n = n->next) { @@ -790,14 +790,14 @@ entry_point(CmdLine *cmd_line) if(args.first->string.size != 0) { String8 exe_name = args.first->string; - DF_Entity *exe = d_entity_alloc(target, DF_EntityKind_Executable); + DF_Entity *exe = df_entity_alloc(target, DF_EntityKind_Executable); PathStyle style = path_style_from_str8(exe_name); if(style == PathStyle_Relative) { exe_name = push_str8f(scratch.arena, "%S/%S", current_path, exe_name); exe_name = path_normalized_from_string(scratch.arena, exe_name); } - d_entity_equip_name(exe, exe_name); + df_entity_equip_name(exe, exe_name); } // rjf: equip working directory @@ -805,8 +805,8 @@ entry_point(CmdLine *cmd_line) if(path_part_of_arg.size != 0) { String8 path = push_str8f(scratch.arena, "%S/", path_part_of_arg); - DF_Entity *wdir = d_entity_alloc(target, DF_EntityKind_WorkingDirectory); - d_entity_equip_name(wdir, path); + DF_Entity *wdir = df_entity_alloc(target, DF_EntityKind_WorkingDirectory); + df_entity_equip_name(wdir, path); } // rjf: equip args @@ -814,8 +814,8 @@ entry_point(CmdLine *cmd_line) String8 args_str = str8_list_join(scratch.arena, &passthrough_args_list, &join); if(args_str.size != 0) { - DF_Entity *args_entity = d_entity_alloc(target, DF_EntityKind_Arguments); - d_entity_equip_name(args_entity, args_str); + DF_Entity *args_entity = df_entity_alloc(target, DF_EntityKind_Arguments); + df_entity_equip_name(args_entity, args_str); } scratch_end(scratch); }