mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-04 12:58:41 +00:00
more dead code elimination & simplification & floating from engine -> frontend
This commit is contained in:
@@ -214,6 +214,35 @@ ctrl_msg_list_push(Arena *arena, CTRL_MsgList *list)
|
|||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal CTRL_MsgList
|
||||||
|
ctrl_msg_list_deep_copy(Arena *arena, CTRL_MsgList *src)
|
||||||
|
{
|
||||||
|
CTRL_MsgList dst = {0};
|
||||||
|
for(CTRL_MsgNode *n = src->first; n != 0; n = n->next)
|
||||||
|
{
|
||||||
|
CTRL_Msg *src_msg = &n->v;
|
||||||
|
CTRL_Msg *dst_msg = ctrl_msg_list_push(arena, &dst);
|
||||||
|
ctrl_msg_deep_copy(arena, dst_msg, src_msg);
|
||||||
|
}
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void
|
||||||
|
ctrl_msg_list_concat_in_place(CTRL_MsgList *dst, CTRL_MsgList *src)
|
||||||
|
{
|
||||||
|
if(dst->last && src->first)
|
||||||
|
{
|
||||||
|
dst->last->next = src->first;
|
||||||
|
dst->last = src->last;
|
||||||
|
dst->count += src->count;
|
||||||
|
}
|
||||||
|
else if(src->first)
|
||||||
|
{
|
||||||
|
MemoryCopyStruct(dst, src);
|
||||||
|
}
|
||||||
|
MemoryZeroStruct(src);
|
||||||
|
}
|
||||||
|
|
||||||
//- rjf: serialization
|
//- rjf: serialization
|
||||||
|
|
||||||
internal String8
|
internal String8
|
||||||
|
|||||||
@@ -696,6 +696,8 @@ internal void ctrl_msg_deep_copy(Arena *arena, CTRL_Msg *dst, CTRL_Msg *src);
|
|||||||
|
|
||||||
//- rjf: list building
|
//- rjf: list building
|
||||||
internal CTRL_Msg *ctrl_msg_list_push(Arena *arena, CTRL_MsgList *list);
|
internal CTRL_Msg *ctrl_msg_list_push(Arena *arena, CTRL_MsgList *list);
|
||||||
|
internal CTRL_MsgList ctrl_msg_list_deep_copy(Arena *arena, CTRL_MsgList *src);
|
||||||
|
internal void ctrl_msg_list_concat_in_place(CTRL_MsgList *dst, CTRL_MsgList *src);
|
||||||
|
|
||||||
//- rjf: serialization
|
//- rjf: serialization
|
||||||
internal String8 ctrl_serialized_string_from_msg_list(Arena *arena, CTRL_MsgList *msgs);
|
internal String8 ctrl_serialized_string_from_msg_list(Arena *arena, CTRL_MsgList *msgs);
|
||||||
|
|||||||
@@ -77,28 +77,6 @@ d_handle_list_push(Arena *arena, D_HandleList *list, D_Handle handle)
|
|||||||
d_handle_list_push_node(list, n);
|
d_handle_list_push_node(list, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
|
||||||
d_handle_list_remove(D_HandleList *list, D_HandleNode *node)
|
|
||||||
{
|
|
||||||
DLLRemove(list->first, list->last, node);
|
|
||||||
list->count -= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal D_HandleNode *
|
|
||||||
d_handle_list_find(D_HandleList *list, D_Handle handle)
|
|
||||||
{
|
|
||||||
D_HandleNode *result = 0;
|
|
||||||
for(D_HandleNode *n = list->first; n != 0; n = n->next)
|
|
||||||
{
|
|
||||||
if(d_handle_match(n->handle, handle))
|
|
||||||
{
|
|
||||||
result = n;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal D_HandleList
|
internal D_HandleList
|
||||||
d_handle_list_copy(Arena *arena, D_HandleList list)
|
d_handle_list_copy(Arena *arena, D_HandleList list)
|
||||||
{
|
{
|
||||||
@@ -2925,20 +2903,6 @@ d_unwind_from_ctrl_unwind(Arena *arena, DI_Scope *di_scope, D_Entity *process, C
|
|||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: Target Controls
|
//~ rjf: Target Controls
|
||||||
|
|
||||||
//- rjf: control message dispatching
|
|
||||||
|
|
||||||
internal void
|
|
||||||
d_push_ctrl_msg(CTRL_Msg *msg)
|
|
||||||
{
|
|
||||||
CTRL_Msg *dst = ctrl_msg_list_push(d_state->ctrl_msg_arena, &d_state->ctrl_msgs);
|
|
||||||
ctrl_msg_deep_copy(d_state->ctrl_msg_arena, dst, msg);
|
|
||||||
if(d_state->ctrl_soft_halt_issued == 0 && d_ctrl_targets_running())
|
|
||||||
{
|
|
||||||
d_state->ctrl_soft_halt_issued = 1;
|
|
||||||
ctrl_halt();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//- rjf: stopped info from the control thread
|
//- rjf: stopped info from the control thread
|
||||||
|
|
||||||
internal CTRL_Event
|
internal CTRL_Event
|
||||||
@@ -3764,14 +3728,6 @@ d_cfg_strings_from_core(Arena *arena, String8 root_path, D_CfgSrc source)
|
|||||||
return strs;
|
return strs;
|
||||||
}
|
}
|
||||||
|
|
||||||
//- rjf: current path
|
|
||||||
|
|
||||||
internal String8
|
|
||||||
d_current_path(void)
|
|
||||||
{
|
|
||||||
return d_state->current_path;
|
|
||||||
}
|
|
||||||
|
|
||||||
//- rjf: entity kind cache
|
//- rjf: entity kind cache
|
||||||
|
|
||||||
internal D_EntityList
|
internal D_EntityList
|
||||||
@@ -4141,7 +4097,6 @@ d_init(void)
|
|||||||
d_state->entities_root = &d_nil_entity;
|
d_state->entities_root = &d_nil_entity;
|
||||||
d_state->entities_base = push_array(d_state->entities_arena, D_Entity, 0);
|
d_state->entities_base = push_array(d_state->entities_arena, D_Entity, 0);
|
||||||
d_state->entities_count = 0;
|
d_state->entities_count = 0;
|
||||||
d_state->ctrl_msg_arena = arena_alloc();
|
|
||||||
d_state->ctrl_entity_store = ctrl_entity_store_alloc();
|
d_state->ctrl_entity_store = ctrl_entity_store_alloc();
|
||||||
d_state->ctrl_stop_arena = arena_alloc();
|
d_state->ctrl_stop_arena = arena_alloc();
|
||||||
d_state->entities_root = d_entity_alloc(&d_nil_entity, D_EntityKind_Root);
|
d_state->entities_root = d_entity_alloc(&d_nil_entity, D_EntityKind_Root);
|
||||||
@@ -4150,6 +4105,7 @@ d_init(void)
|
|||||||
d_state->view_rule_spec_table_size = 1024;
|
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->view_rule_spec_table = push_array(arena, D_ViewRuleSpec *, d_state->view_rule_spec_table_size);
|
||||||
d_state->top_regs = &d_state->base_regs;
|
d_state->top_regs = &d_state->base_regs;
|
||||||
|
d_state->ctrl_msg_arena = arena_alloc();
|
||||||
|
|
||||||
// rjf: set up initial exception filtering rules
|
// rjf: set up initial exception filtering rules
|
||||||
for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)0; k < CTRL_ExceptionCodeKind_COUNT; k = (CTRL_ExceptionCodeKind)(k+1))
|
for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)0; k < CTRL_ExceptionCodeKind_COUNT; k = (CTRL_ExceptionCodeKind)(k+1))
|
||||||
@@ -4201,22 +4157,13 @@ d_init(void)
|
|||||||
|
|
||||||
// rjf: set up run state
|
// rjf: set up run state
|
||||||
d_state->ctrl_last_run_arena = arena_alloc();
|
d_state->ctrl_last_run_arena = arena_alloc();
|
||||||
|
|
||||||
// rjf: set up initial browse path
|
|
||||||
{
|
|
||||||
Temp scratch = scratch_begin(0, 0);
|
|
||||||
String8 current_path = os_get_current_path(scratch.arena);
|
|
||||||
String8 current_path_with_slash = push_str8f(scratch.arena, "%S/", current_path);
|
|
||||||
d_state->current_path_arena = arena_alloc();
|
|
||||||
d_state->current_path = push_str8_copy(d_state->current_path_arena, current_path_with_slash);
|
|
||||||
scratch_end(scratch);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal CTRL_EventList
|
internal CTRL_EventList
|
||||||
d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, DI_Scope *di_scope, F32 dt)
|
d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, DI_Scope *di_scope, F32 dt)
|
||||||
{
|
{
|
||||||
ProfBeginFunction();
|
ProfBeginFunction();
|
||||||
|
Temp scratch = scratch_begin(&arena, 1);
|
||||||
CTRL_EventList result = {0};
|
CTRL_EventList result = {0};
|
||||||
d_state->frame_index += 1;
|
d_state->frame_index += 1;
|
||||||
arena_clear(d_frame_arena());
|
arena_clear(d_frame_arena());
|
||||||
@@ -4231,8 +4178,6 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, DI_
|
|||||||
//
|
//
|
||||||
ProfScope("sync with ctrl thread")
|
ProfScope("sync with ctrl thread")
|
||||||
{
|
{
|
||||||
Temp scratch = scratch_begin(&arena, 1);
|
|
||||||
|
|
||||||
//- rjf: grab next reggen/memgen
|
//- rjf: grab next reggen/memgen
|
||||||
U64 new_mem_gen = ctrl_mem_gen();
|
U64 new_mem_gen = ctrl_mem_gen();
|
||||||
U64 new_reg_gen = ctrl_reg_gen();
|
U64 new_reg_gen = ctrl_reg_gen();
|
||||||
@@ -4632,8 +4577,6 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, DI_
|
|||||||
cache->table = 0;
|
cache->table = 0;
|
||||||
d_state->member_cache_reggen_idx = new_reg_gen;
|
d_state->member_cache_reggen_idx = new_reg_gen;
|
||||||
}
|
}
|
||||||
|
|
||||||
scratch_end(scratch);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
@@ -4641,8 +4584,6 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, DI_
|
|||||||
//
|
//
|
||||||
U128 ctrl_param_state_hash = {0};
|
U128 ctrl_param_state_hash = {0};
|
||||||
{
|
{
|
||||||
Temp scratch = scratch_begin(0, 0);
|
|
||||||
|
|
||||||
// rjf: build data strings of all param data
|
// rjf: build data strings of all param data
|
||||||
String8List strings = {0};
|
String8List strings = {0};
|
||||||
{
|
{
|
||||||
@@ -4666,8 +4607,6 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, DI_
|
|||||||
// rjf: join & hash to produce result
|
// rjf: join & hash to produce result
|
||||||
String8 string = str8_list_join(scratch.arena, &strings, 0);
|
String8 string = str8_list_join(scratch.arena, &strings, 0);
|
||||||
blake2b((U8 *)&ctrl_param_state_hash.u64[0], sizeof(ctrl_param_state_hash), string.str, string.size, 0, 0);
|
blake2b((U8 *)&ctrl_param_state_hash.u64[0], sizeof(ctrl_param_state_hash), string.str, string.size, 0, 0);
|
||||||
|
|
||||||
scratch_end(scratch);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
@@ -4732,7 +4671,6 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, DI_
|
|||||||
//
|
//
|
||||||
ProfScope("sync with di parsers")
|
ProfScope("sync with di parsers")
|
||||||
{
|
{
|
||||||
Temp scratch = scratch_begin(&arena, 1);
|
|
||||||
DI_EventList events = di_p2u_pop_events(scratch.arena, 0);
|
DI_EventList events = di_p2u_pop_events(scratch.arena, 0);
|
||||||
for(DI_EventNode *n = events.first; n != 0; n = n->next)
|
for(DI_EventNode *n = events.first; n != 0; n = n->next)
|
||||||
{
|
{
|
||||||
@@ -4755,7 +4693,6 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, DI_
|
|||||||
}break;
|
}break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
scratch_end(scratch);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
@@ -4776,13 +4713,11 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, DI_
|
|||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
//- rjf: process top-level commands
|
//- rjf: process top-level commands
|
||||||
//
|
//
|
||||||
|
CTRL_MsgList ctrl_msgs = {0};
|
||||||
ProfScope("process top-level commands")
|
ProfScope("process top-level commands")
|
||||||
{
|
{
|
||||||
Temp scratch = scratch_begin(&arena, 1);
|
|
||||||
for(D_Cmd *cmd = 0; d_next_cmd(&cmd);)
|
for(D_Cmd *cmd = 0; d_next_cmd(&cmd);)
|
||||||
{
|
{
|
||||||
temp_end(scratch);
|
|
||||||
|
|
||||||
// rjf: unpack command
|
// rjf: unpack command
|
||||||
D_CmdParams params = cmd->params;
|
D_CmdParams params = cmd->params;
|
||||||
D_CmdKind core_cmd_kind = d_cmd_kind_from_string(cmd->spec->info.string);
|
D_CmdKind core_cmd_kind = d_cmd_kind_from_string(cmd->spec->info.string);
|
||||||
@@ -4863,13 +4798,13 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, DI_
|
|||||||
|
|
||||||
// rjf: push message to launch
|
// rjf: push message to launch
|
||||||
{
|
{
|
||||||
CTRL_Msg msg = {CTRL_MsgKind_Launch};
|
CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs);
|
||||||
msg.path = path;
|
msg->kind = CTRL_MsgKind_Launch;
|
||||||
msg.cmd_line_string_list = cmdln_strings;
|
msg->path = path;
|
||||||
msg.env_inherit = 1;
|
msg->cmd_line_string_list = cmdln_strings;
|
||||||
MemoryCopyArray(msg.exception_code_filters, d_state->ctrl_exception_code_filters);
|
msg->env_inherit = 1;
|
||||||
str8_list_push(scratch.arena, &msg.entry_points, entry);
|
MemoryCopyArray(msg->exception_code_filters, d_state->ctrl_exception_code_filters);
|
||||||
d_push_ctrl_msg(&msg);
|
str8_list_push(scratch.arena, &msg->entry_points, entry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4902,13 +4837,11 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, DI_
|
|||||||
for(D_EntityNode *n = processes.first; n != 0; n = n->next)
|
for(D_EntityNode *n = processes.first; n != 0; n = n->next)
|
||||||
{
|
{
|
||||||
D_Entity *process = n->entity;
|
D_Entity *process = n->entity;
|
||||||
CTRL_Msg msg = {CTRL_MsgKind_Kill};
|
CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs);
|
||||||
{
|
msg->kind = CTRL_MsgKind_Kill;
|
||||||
msg.exit_code = 1;
|
msg->exit_code = 1;
|
||||||
msg.entity = process->ctrl_handle;
|
msg->entity = process->ctrl_handle;
|
||||||
MemoryCopyArray(msg.exception_code_filters, d_state->ctrl_exception_code_filters);
|
MemoryCopyArray(msg->exception_code_filters, d_state->ctrl_exception_code_filters);
|
||||||
}
|
|
||||||
d_push_ctrl_msg(&msg);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4926,13 +4859,11 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, DI_
|
|||||||
for(D_EntityNode *n = processes.first; n != 0; n = n->next)
|
for(D_EntityNode *n = processes.first; n != 0; n = n->next)
|
||||||
{
|
{
|
||||||
D_Entity *process = n->entity;
|
D_Entity *process = n->entity;
|
||||||
CTRL_Msg msg = {CTRL_MsgKind_Kill};
|
CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs);
|
||||||
{
|
msg->kind = CTRL_MsgKind_Kill;
|
||||||
msg.exit_code = 1;
|
msg->exit_code = 1;
|
||||||
msg.entity = process->ctrl_handle;
|
msg->entity = process->ctrl_handle;
|
||||||
MemoryCopyArray(msg.exception_code_filters, d_state->ctrl_exception_code_filters);
|
MemoryCopyArray(msg->exception_code_filters, d_state->ctrl_exception_code_filters);
|
||||||
}
|
|
||||||
d_push_ctrl_msg(&msg);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(processes.count == 0)
|
if(processes.count == 0)
|
||||||
@@ -4947,10 +4878,10 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, DI_
|
|||||||
D_Entity *entity = d_entity_from_handle(n->handle);
|
D_Entity *entity = d_entity_from_handle(n->handle);
|
||||||
if(entity->kind == D_EntityKind_Process)
|
if(entity->kind == D_EntityKind_Process)
|
||||||
{
|
{
|
||||||
CTRL_Msg msg = {CTRL_MsgKind_Detach};
|
CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs);
|
||||||
msg.entity = entity->ctrl_handle;
|
msg->kind = CTRL_MsgKind_Detach;
|
||||||
MemoryCopyArray(msg.exception_code_filters, d_state->ctrl_exception_code_filters);
|
msg->entity = entity->ctrl_handle;
|
||||||
d_push_ctrl_msg(&msg);
|
MemoryCopyArray(msg->exception_code_filters, d_state->ctrl_exception_code_filters);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}break;
|
}break;
|
||||||
@@ -5090,8 +5021,6 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, DI_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
scratch_end(scratch);
|
|
||||||
}
|
}
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
@@ -5349,9 +5278,9 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, DI_
|
|||||||
{
|
{
|
||||||
CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, e->ctrl_handle);
|
CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, e->ctrl_handle);
|
||||||
thread->is_frozen = should_freeze;
|
thread->is_frozen = should_freeze;
|
||||||
CTRL_Msg msg = {should_freeze ? CTRL_MsgKind_FreezeThread : CTRL_MsgKind_ThawThread};
|
CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs);
|
||||||
msg.entity = thread->handle;
|
msg->kind = (should_freeze ? CTRL_MsgKind_FreezeThread : CTRL_MsgKind_ThawThread);
|
||||||
d_push_ctrl_msg(&msg);
|
msg->entity = thread->handle;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}break;
|
}break;
|
||||||
@@ -5362,10 +5291,10 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, DI_
|
|||||||
U64 pid = params.id;
|
U64 pid = params.id;
|
||||||
if(pid != 0)
|
if(pid != 0)
|
||||||
{
|
{
|
||||||
CTRL_Msg msg = {CTRL_MsgKind_Attach};
|
CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs);
|
||||||
msg.entity_id = (U32)pid;
|
msg->kind = CTRL_MsgKind_Attach;
|
||||||
MemoryCopyArray(msg.exception_code_filters, d_state->ctrl_exception_code_filters);
|
msg->entity_id = (U32)pid;
|
||||||
d_push_ctrl_msg(&msg);
|
MemoryCopyArray(msg->exception_code_filters, d_state->ctrl_exception_code_filters);
|
||||||
}
|
}
|
||||||
}break;
|
}break;
|
||||||
}
|
}
|
||||||
@@ -5378,15 +5307,16 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, DI_
|
|||||||
d_state->ctrl_last_run_param_state_hash = ctrl_param_state_hash;
|
d_state->ctrl_last_run_param_state_hash = ctrl_param_state_hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
// rjf: build run message
|
// rjf: push & fill run message
|
||||||
CTRL_Msg msg = {(run_kind == D_RunKind_Run || run_kind == D_RunKind_Step) ? CTRL_MsgKind_Run : CTRL_MsgKind_SingleStep};
|
CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs);
|
||||||
{
|
{
|
||||||
CTRL_Entity *process = ctrl_entity_ancestor_from_kind(run_thread, CTRL_EntityKind_Process);
|
CTRL_Entity *process = ctrl_entity_ancestor_from_kind(run_thread, CTRL_EntityKind_Process);
|
||||||
msg.run_flags = run_flags;
|
msg->kind = (run_kind == D_RunKind_Run || run_kind == D_RunKind_Step) ? CTRL_MsgKind_Run : CTRL_MsgKind_SingleStep;
|
||||||
msg.entity = run_thread->handle;
|
msg->run_flags = run_flags;
|
||||||
msg.parent = process->handle;
|
msg->entity = run_thread->handle;
|
||||||
MemoryCopyArray(msg.exception_code_filters, d_state->ctrl_exception_code_filters);
|
msg->parent = process->handle;
|
||||||
MemoryCopyStruct(&msg.traps, &run_traps);
|
MemoryCopyArray(msg->exception_code_filters, d_state->ctrl_exception_code_filters);
|
||||||
|
MemoryCopyStruct(&msg->traps, &run_traps);
|
||||||
for(U64 idx = 0; idx < breakpoints->count; idx += 1)
|
for(U64 idx = 0; idx < breakpoints->count; idx += 1)
|
||||||
{
|
{
|
||||||
// rjf: unpack user breakpoint entity
|
// rjf: unpack user breakpoint entity
|
||||||
@@ -5402,7 +5332,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, DI_
|
|||||||
ctrl_user_bp.string = n->string;
|
ctrl_user_bp.string = n->string;
|
||||||
ctrl_user_bp.pt = bp->pt;
|
ctrl_user_bp.pt = bp->pt;
|
||||||
ctrl_user_bp.condition = bp->condition;
|
ctrl_user_bp.condition = bp->condition;
|
||||||
ctrl_user_breakpoint_list_push(scratch.arena, &msg.user_bps, &ctrl_user_bp);
|
ctrl_user_breakpoint_list_push(scratch.arena, &msg->user_bps, &ctrl_user_bp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5412,7 +5342,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, DI_
|
|||||||
CTRL_UserBreakpoint ctrl_user_bp = {CTRL_UserBreakpointKind_VirtualAddress};
|
CTRL_UserBreakpoint ctrl_user_bp = {CTRL_UserBreakpointKind_VirtualAddress};
|
||||||
ctrl_user_bp.u64 = bp->vaddr;
|
ctrl_user_bp.u64 = bp->vaddr;
|
||||||
ctrl_user_bp.condition = bp->condition;
|
ctrl_user_bp.condition = bp->condition;
|
||||||
ctrl_user_breakpoint_list_push(scratch.arena, &msg.user_bps, &ctrl_user_bp);
|
ctrl_user_breakpoint_list_push(scratch.arena, &msg->user_bps, &ctrl_user_bp);
|
||||||
}
|
}
|
||||||
|
|
||||||
// rjf: symbol name location -> add breakpoint for symbol name
|
// rjf: symbol name location -> add breakpoint for symbol name
|
||||||
@@ -5421,14 +5351,11 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, DI_
|
|||||||
CTRL_UserBreakpoint ctrl_user_bp = {CTRL_UserBreakpointKind_SymbolNameAndOffset};
|
CTRL_UserBreakpoint ctrl_user_bp = {CTRL_UserBreakpointKind_SymbolNameAndOffset};
|
||||||
ctrl_user_bp.string = bp->symbol_name;
|
ctrl_user_bp.string = bp->symbol_name;
|
||||||
ctrl_user_bp.condition = bp->condition;
|
ctrl_user_bp.condition = bp->condition;
|
||||||
ctrl_user_breakpoint_list_push(scratch.arena, &msg.user_bps, &ctrl_user_bp);
|
ctrl_user_breakpoint_list_push(scratch.arena, &msg->user_bps, &ctrl_user_bp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// rjf: push msg
|
|
||||||
d_push_ctrl_msg(&msg);
|
|
||||||
|
|
||||||
// rjf: copy run traps to scratch (needed, if run_traps can be `d_state->ctrl_last_run_traps`)
|
// rjf: copy run traps to scratch (needed, if run_traps can be `d_state->ctrl_last_run_traps`)
|
||||||
CTRL_TrapList run_traps_copy = ctrl_trap_list_copy(scratch.arena, &run_traps);
|
CTRL_TrapList run_traps_copy = ctrl_trap_list_copy(scratch.arena, &run_traps);
|
||||||
|
|
||||||
@@ -5446,7 +5373,6 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, DI_
|
|||||||
d_state->base_regs.v.inline_depth = 0;
|
d_state->base_regs.v.inline_depth = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
scratch_end(scratch);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
@@ -5458,17 +5384,24 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, DI_
|
|||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
//- rjf: send messages to control
|
//- rjf: push new control messages to queue - try to send queue to control,
|
||||||
|
// clear queue if successful (if not, we'll just keep them around until
|
||||||
|
// the next tick)
|
||||||
//
|
//
|
||||||
if(d_state->ctrl_msgs.count != 0)
|
|
||||||
{
|
{
|
||||||
if(ctrl_u2c_push_msgs(&d_state->ctrl_msgs, os_now_microseconds()+100))
|
CTRL_MsgList msgs_copy = ctrl_msg_list_deep_copy(d_state->ctrl_msg_arena, &ctrl_msgs);
|
||||||
|
ctrl_msg_list_concat_in_place(&d_state->ctrl_msgs, &msgs_copy);
|
||||||
|
if(d_state->ctrl_msgs.count != 0)
|
||||||
{
|
{
|
||||||
MemoryZeroStruct(&d_state->ctrl_msgs);
|
if(ctrl_u2c_push_msgs(&d_state->ctrl_msgs, os_now_microseconds()+100))
|
||||||
arena_clear(d_state->ctrl_msg_arena);
|
{
|
||||||
|
MemoryZeroStruct(&d_state->ctrl_msgs);
|
||||||
|
arena_clear(d_state->ctrl_msg_arena);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ProfEnd();
|
ProfEnd();
|
||||||
|
scratch_end(scratch);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -808,31 +808,6 @@ struct D_EntityListCache
|
|||||||
D_EntityList list;
|
D_EntityList list;
|
||||||
};
|
};
|
||||||
|
|
||||||
//- rjf: auto view rules hash table cache
|
|
||||||
|
|
||||||
typedef struct D_AutoViewRuleNode D_AutoViewRuleNode;
|
|
||||||
struct D_AutoViewRuleNode
|
|
||||||
{
|
|
||||||
D_AutoViewRuleNode *next;
|
|
||||||
String8 type;
|
|
||||||
String8 view_rule;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct D_AutoViewRuleSlot D_AutoViewRuleSlot;
|
|
||||||
struct D_AutoViewRuleSlot
|
|
||||||
{
|
|
||||||
D_AutoViewRuleNode *first;
|
|
||||||
D_AutoViewRuleNode *last;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct D_AutoViewRuleMapCache D_AutoViewRuleMapCache;
|
|
||||||
struct D_AutoViewRuleMapCache
|
|
||||||
{
|
|
||||||
Arena *arena;
|
|
||||||
U64 slots_count;
|
|
||||||
D_AutoViewRuleSlot *slots;
|
|
||||||
};
|
|
||||||
|
|
||||||
//- rjf: per-thread unwind cache
|
//- rjf: per-thread unwind cache
|
||||||
|
|
||||||
typedef struct D_UnwindCacheNode D_UnwindCacheNode;
|
typedef struct D_UnwindCacheNode D_UnwindCacheNode;
|
||||||
@@ -969,7 +944,6 @@ struct D_State
|
|||||||
// rjf: entity query caches
|
// rjf: entity query caches
|
||||||
U64 kind_alloc_gens[D_EntityKind_COUNT];
|
U64 kind_alloc_gens[D_EntityKind_COUNT];
|
||||||
D_EntityListCache kind_caches[D_EntityKind_COUNT];
|
D_EntityListCache kind_caches[D_EntityKind_COUNT];
|
||||||
D_AutoViewRuleMapCache auto_view_rule_cache;
|
|
||||||
|
|
||||||
// rjf: per-run caches
|
// rjf: per-run caches
|
||||||
D_UnwindCache unwind_cache;
|
D_UnwindCache unwind_cache;
|
||||||
@@ -1006,9 +980,9 @@ struct D_State
|
|||||||
U128 ctrl_last_run_param_state_hash;
|
U128 ctrl_last_run_param_state_hash;
|
||||||
B32 ctrl_is_running;
|
B32 ctrl_is_running;
|
||||||
B32 ctrl_soft_halt_issued;
|
B32 ctrl_soft_halt_issued;
|
||||||
|
U64 ctrl_exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64];
|
||||||
Arena *ctrl_msg_arena;
|
Arena *ctrl_msg_arena;
|
||||||
CTRL_MsgList ctrl_msgs;
|
CTRL_MsgList ctrl_msgs;
|
||||||
U64 ctrl_exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64];
|
|
||||||
|
|
||||||
// rjf: control thread ctrl -> user reading state
|
// rjf: control thread ctrl -> user reading state
|
||||||
CTRL_EntityStore *ctrl_entity_store;
|
CTRL_EntityStore *ctrl_entity_store;
|
||||||
@@ -1021,10 +995,6 @@ struct D_State
|
|||||||
U64 cfg_cached_timestamp[D_CfgSrc_COUNT];
|
U64 cfg_cached_timestamp[D_CfgSrc_COUNT];
|
||||||
Arena *cfg_arena;
|
Arena *cfg_arena;
|
||||||
D_CfgTable cfg_table;
|
D_CfgTable cfg_table;
|
||||||
|
|
||||||
// rjf: current path
|
|
||||||
Arena *current_path_arena;
|
|
||||||
String8 current_path;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
@@ -1062,8 +1032,6 @@ internal D_Handle d_handle_zero(void);
|
|||||||
internal B32 d_handle_match(D_Handle a, D_Handle b);
|
internal B32 d_handle_match(D_Handle a, D_Handle b);
|
||||||
internal void d_handle_list_push_node(D_HandleList *list, D_HandleNode *node);
|
internal void d_handle_list_push_node(D_HandleList *list, D_HandleNode *node);
|
||||||
internal void d_handle_list_push(Arena *arena, D_HandleList *list, D_Handle handle);
|
internal void d_handle_list_push(Arena *arena, D_HandleList *list, D_Handle handle);
|
||||||
internal void d_handle_list_remove(D_HandleList *list, D_HandleNode *node);
|
|
||||||
internal D_HandleNode *d_handle_list_find(D_HandleList *list, D_Handle handle);
|
|
||||||
internal D_HandleList d_handle_list_copy(Arena *arena, D_HandleList list);
|
internal D_HandleList d_handle_list_copy(Arena *arena, D_HandleList list);
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
@@ -1285,9 +1253,6 @@ internal D_Unwind d_unwind_from_ctrl_unwind(Arena *arena, DI_Scope *di_scope, D_
|
|||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: Target Controls
|
//~ rjf: Target Controls
|
||||||
|
|
||||||
//- rjf: control message dispatching
|
|
||||||
internal void d_push_ctrl_msg(CTRL_Msg *msg);
|
|
||||||
|
|
||||||
//- rjf: stopped info from the control thread
|
//- rjf: stopped info from the control thread
|
||||||
internal CTRL_Event d_ctrl_last_stop_event(void);
|
internal CTRL_Event d_ctrl_last_stop_event(void);
|
||||||
|
|
||||||
@@ -1363,9 +1328,6 @@ 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 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);
|
internal String8List d_cfg_strings_from_core(Arena *arena, String8 root_path, D_CfgSrc source);
|
||||||
|
|
||||||
//- rjf: current path
|
|
||||||
internal String8 d_current_path(void);
|
|
||||||
|
|
||||||
//- rjf: entity kind cache
|
//- rjf: entity kind cache
|
||||||
internal D_EntityList d_query_cached_entity_list_with_kind(D_EntityKind kind);
|
internal D_EntityList d_query_cached_entity_list_with_kind(D_EntityKind kind);
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,33 @@
|
|||||||
|
|
||||||
#include "generated/dbg_frontend.meta.c"
|
#include "generated/dbg_frontend.meta.c"
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
//~ rjf: Registers Type Pure Functions
|
||||||
|
|
||||||
|
internal void
|
||||||
|
df_regs_copy_contents(Arena *arena, DF_Regs *dst, DF_Regs *src)
|
||||||
|
{
|
||||||
|
MemoryCopyStruct(dst, src);
|
||||||
|
dst->entity_list = d_handle_list_copy(arena, src->entity_list);
|
||||||
|
dst->file_path = push_str8_copy(arena, src->file_path);
|
||||||
|
dst->lines = d_line_list_copy(arena, &src->lines);
|
||||||
|
dst->dbgi_key = di_key_copy(arena, &src->dbgi_key);
|
||||||
|
dst->string = push_str8_copy(arena, src->string);
|
||||||
|
dst->params_tree = md_tree_copy(arena, src->params_tree);
|
||||||
|
if(dst->entity_list.count == 0 && !d_handle_match(d_handle_zero(), dst->entity))
|
||||||
|
{
|
||||||
|
d_handle_list_push(arena, &dst->entity_list, dst->entity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal DF_Regs *
|
||||||
|
df_regs_copy(Arena *arena, DF_Regs *src)
|
||||||
|
{
|
||||||
|
DF_Regs *dst = push_array(arena, DF_Regs, 1);
|
||||||
|
df_regs_copy_contents(arena, dst, src);
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: View Type Functions
|
//~ rjf: View Type Functions
|
||||||
|
|
||||||
@@ -3615,7 +3642,7 @@ df_window_frame(DF_Window *ws)
|
|||||||
}break;
|
}break;
|
||||||
case D_CmdParamSlot_FilePath:
|
case D_CmdParamSlot_FilePath:
|
||||||
{
|
{
|
||||||
default_query = path_normalized_from_string(scratch.arena, d_current_path());
|
default_query = path_normalized_from_string(scratch.arena, df_state->current_path);
|
||||||
default_query = push_str8f(scratch.arena, "%S/", default_query);
|
default_query = push_str8f(scratch.arena, "%S/", default_query);
|
||||||
}break;
|
}break;
|
||||||
}
|
}
|
||||||
@@ -7676,6 +7703,16 @@ df_init(CmdLine *cmdln)
|
|||||||
scratch_end(scratch);
|
scratch_end(scratch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// rjf: set up initial browse path
|
||||||
|
{
|
||||||
|
Temp scratch = scratch_begin(0, 0);
|
||||||
|
String8 current_path = os_get_current_path(scratch.arena);
|
||||||
|
String8 current_path_with_slash = push_str8f(scratch.arena, "%S/", current_path);
|
||||||
|
df_state->current_path_arena = arena_alloc();
|
||||||
|
df_state->current_path = push_str8_copy(df_state->current_path_arena, current_path_with_slash);
|
||||||
|
scratch_end(scratch);
|
||||||
|
}
|
||||||
|
|
||||||
ProfEnd();
|
ProfEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -9656,32 +9693,25 @@ df_frame(void)
|
|||||||
}break;
|
}break;
|
||||||
|
|
||||||
//- rjf: undo/redo
|
//- rjf: undo/redo
|
||||||
case DF_CmdKind_Undo:
|
case DF_CmdKind_Undo:{}break;
|
||||||
{
|
case DF_CmdKind_Redo:{}break;
|
||||||
}break;
|
|
||||||
case DF_CmdKind_Redo:
|
|
||||||
{
|
|
||||||
}break;
|
|
||||||
|
|
||||||
//- rjf: focus history
|
//- rjf: focus history
|
||||||
case DF_CmdKind_GoBack:
|
case DF_CmdKind_GoBack:{}break;
|
||||||
{
|
case DF_CmdKind_GoForward:{}break;
|
||||||
}break;
|
|
||||||
case DF_CmdKind_GoForward:
|
|
||||||
{
|
|
||||||
}break;
|
|
||||||
|
|
||||||
//- rjf: files
|
//- rjf: files
|
||||||
case DF_CmdKind_SetCurrentPath:
|
case DF_CmdKind_SetCurrentPath:
|
||||||
{
|
{
|
||||||
arena_clear(d_state->current_path_arena);
|
arena_clear(df_state->current_path_arena);
|
||||||
d_state->current_path = push_str8_copy(d_state->current_path_arena, params->file_path);
|
df_state->current_path = push_str8_copy(df_state->current_path_arena, params->file_path);
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
//- rjf: override file links
|
//- rjf: override file links
|
||||||
case DF_CmdKind_SetFileOverrideLinkSrc:
|
case DF_CmdKind_SetFileOverrideLinkSrc:
|
||||||
case DF_CmdKind_SetFileOverrideLinkDst:
|
case DF_CmdKind_SetFileOverrideLinkDst:
|
||||||
{
|
{
|
||||||
|
#if 0 // TODO(rjf): @msgs
|
||||||
// rjf: unpack args
|
// rjf: unpack args
|
||||||
D_Entity *map = d_entity_from_handle(params->entity);
|
D_Entity *map = d_entity_from_handle(params->entity);
|
||||||
String8 path = path_normalized_from_string(scratch.arena, params->file_path);
|
String8 path = path_normalized_from_string(scratch.arena, params->file_path);
|
||||||
@@ -9725,6 +9755,7 @@ df_frame(void)
|
|||||||
{
|
{
|
||||||
d_entity_mark_for_deletion(map);
|
d_entity_mark_for_deletion(map);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}break;
|
}break;
|
||||||
case DF_CmdKind_SetFileReplacementPath:
|
case DF_CmdKind_SetFileReplacementPath:
|
||||||
{
|
{
|
||||||
@@ -9745,8 +9776,7 @@ df_frame(void)
|
|||||||
//- rjf: unpack
|
//- rjf: unpack
|
||||||
String8 src_path = params->string;
|
String8 src_path = params->string;
|
||||||
String8 dst_path = params->file_path;
|
String8 dst_path = params->file_path;
|
||||||
#if 0
|
#if 0 // TODO(rjf): @msgs
|
||||||
// TODO(rjf):
|
|
||||||
|
|
||||||
//- rjf: grab src file & chosen replacement
|
//- rjf: grab src file & chosen replacement
|
||||||
D_Entity *file = d_entity_from_handle(params.entity);
|
D_Entity *file = d_entity_from_handle(params.entity);
|
||||||
@@ -9787,57 +9817,6 @@ df_frame(void)
|
|||||||
case DF_CmdKind_SetAutoViewRuleType:
|
case DF_CmdKind_SetAutoViewRuleType:
|
||||||
case DF_CmdKind_SetAutoViewRuleViewRule:
|
case DF_CmdKind_SetAutoViewRuleViewRule:
|
||||||
{
|
{
|
||||||
D_Entity *map = d_entity_from_handle(params->entity);
|
|
||||||
if(d_entity_is_nil(map))
|
|
||||||
{
|
|
||||||
map = d_entity_alloc(d_entity_root(), D_EntityKind_AutoViewRule);
|
|
||||||
d_entity_equip_cfg_src(map, D_CfgSrc_Project);
|
|
||||||
}
|
|
||||||
D_Entity *src = d_entity_child_from_kind(map, D_EntityKind_Source);
|
|
||||||
if(d_entity_is_nil(src))
|
|
||||||
{
|
|
||||||
src = d_entity_alloc(map, D_EntityKind_Source);
|
|
||||||
}
|
|
||||||
D_Entity *dst = d_entity_child_from_kind(map, D_EntityKind_Dest);
|
|
||||||
if(d_entity_is_nil(dst))
|
|
||||||
{
|
|
||||||
dst = d_entity_alloc(map, D_EntityKind_Dest);
|
|
||||||
}
|
|
||||||
if(map->kind == D_EntityKind_AutoViewRule)
|
|
||||||
{
|
|
||||||
D_Entity *edit_child = (kind == DF_CmdKind_SetAutoViewRuleType ? src : dst);
|
|
||||||
d_entity_equip_name(edit_child, params->string);
|
|
||||||
}
|
|
||||||
if(src->string.size == 0 && dst->string.size == 0)
|
|
||||||
{
|
|
||||||
d_entity_mark_for_deletion(map);
|
|
||||||
}
|
|
||||||
{
|
|
||||||
D_AutoViewRuleMapCache *cache = &d_state->auto_view_rule_cache;
|
|
||||||
if(cache->arena == 0)
|
|
||||||
{
|
|
||||||
cache->arena = arena_alloc();
|
|
||||||
}
|
|
||||||
arena_clear(cache->arena);
|
|
||||||
cache->slots_count = 1024;
|
|
||||||
cache->slots = push_array(cache->arena, D_AutoViewRuleSlot, cache->slots_count);
|
|
||||||
D_EntityList maps = d_query_cached_entity_list_with_kind(D_EntityKind_AutoViewRule);
|
|
||||||
for(D_EntityNode *n = maps.first; n != 0; n = n->next)
|
|
||||||
{
|
|
||||||
D_Entity *map = n->entity;
|
|
||||||
D_Entity *src = d_entity_child_from_kind(map, D_EntityKind_Source);
|
|
||||||
D_Entity *dst = d_entity_child_from_kind(map, D_EntityKind_Dest);
|
|
||||||
String8 type = src->string;
|
|
||||||
String8 view_rule = dst->string;
|
|
||||||
U64 hash = d_hash_from_string(type);
|
|
||||||
U64 slot_idx = hash%cache->slots_count;
|
|
||||||
D_AutoViewRuleSlot *slot = &cache->slots[slot_idx];
|
|
||||||
D_AutoViewRuleNode *node = push_array(cache->arena, D_AutoViewRuleNode, 1);
|
|
||||||
node->type = push_str8_copy(cache->arena, type);
|
|
||||||
node->view_rule = push_str8_copy(cache->arena, view_rule);
|
|
||||||
SLLQueuePush(slot->first, slot->last, node);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
//- rjf: panel removal
|
//- rjf: panel removal
|
||||||
|
|||||||
@@ -760,6 +760,10 @@ struct DF_State
|
|||||||
|
|
||||||
// rjf: icon texture
|
// rjf: icon texture
|
||||||
R_Handle icon_texture;
|
R_Handle icon_texture;
|
||||||
|
|
||||||
|
// rjf: current path
|
||||||
|
Arena *current_path_arena;
|
||||||
|
String8 current_path;
|
||||||
};
|
};
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
@@ -809,6 +813,12 @@ global DF_DragDropPayload df_drag_drop_payload = {0};
|
|||||||
global D_Handle df_last_drag_drop_panel = {0};
|
global D_Handle df_last_drag_drop_panel = {0};
|
||||||
global D_Handle df_last_drag_drop_prev_tab = {0};
|
global D_Handle df_last_drag_drop_prev_tab = {0};
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
//~ rjf: Registers Type Pure Functions
|
||||||
|
|
||||||
|
internal void df_regs_copy_contents(Arena *arena, DF_Regs *dst, DF_Regs *src);
|
||||||
|
internal DF_Regs *df_regs_copy(Arena *arena, DF_Regs *src);
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: View Type Functions
|
//~ rjf: View Type Functions
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user