From 36e77e9691fd795bfdb595358182a47a548b51e3 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 1 May 2025 11:04:14 -0700 Subject: [PATCH] clean up flow of active-targetless launch path; instead of just erroring, prompt user with selection, select if none selected, etc. --- src/eval/eval_types.c | 12 ++++++++++-- src/raddbg/raddbg_core.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index c0adc9e2..8f2d5345 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -1222,7 +1222,15 @@ internal int e_type_qsort_compare_members_offset(E_Member *a, E_Member *b) { int result = 0; - if(a->off < b->off) + if(a->kind < b->kind) + { + result = -1; + } + else if(a->kind > b->kind) + { + result = +1; + } + else if(a->off < b->off) { result = -1; } @@ -1272,7 +1280,7 @@ e_type_data_members_from_key(Arena *arena, E_TypeKey key) n->v.inheritance_key_chain = task->inheritance_chain; SLLQueuePush(members_list.first, members_list.last, n); members_list.count += 1; - members_need_offset_sort = members_need_offset_sort || (n->v.off < last_member_off); + members_need_offset_sort = members_need_offset_sort || (type->members[member_idx].kind == E_MemberKind_DataField && n->v.off < last_member_off); last_member_off = n->v.off; } else if(type->members[member_idx].kind == E_MemberKind_Base) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index a8f785ed..15eea6a5 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -12200,6 +12200,7 @@ rd_frame(void) case RD_CmdKind_StepOver: case RD_CmdKind_Restart: { + // rjf: reset hit counts CTRL_EntityArray processes = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); if(processes.count == 0 || kind == RD_CmdKind_Restart) { @@ -12210,6 +12211,41 @@ rd_frame(void) rd_cfg_new_replace(hit_count, str8_lit("0")); } } + + // rjf: determine if we have active targets + RD_CfgList targets = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("target")); + B32 has_active_targets = 0; + for(RD_CfgNode *n = targets.first; n != 0; n = n->next) + { + RD_Cfg *target = n->v; + if(!rd_disabled_from_cfg(target)) + { + has_active_targets = 1; + break; + } + } + + // rjf: run -> no active targets, no processes? -> do helper for launch-and-run + if((kind == RD_CmdKind_Run || + kind == RD_CmdKind_StepInto || + kind == RD_CmdKind_StepOver) && processes.count == 0) + { + if(!has_active_targets) + { + rd_cmd(RD_CmdKind_RunCommand, .cmd_name = rd_cmd_kind_info_table[kind == RD_CmdKind_Run ? RD_CmdKind_LaunchAndRun : RD_CmdKind_LaunchAndStepInto].string); + break; + } + } + + // rjf: if this is a low-level operation, e.g. launch-and-run or launch-and-step-into, + // and we do not have any active targets, then let's just select the ones that we are + // launching. + if(!has_active_targets && + (kind == RD_CmdKind_LaunchAndRun || + kind == RD_CmdKind_LaunchAndStepInto)) + { + rd_cmd(RD_CmdKind_SelectTarget, .cfg = rd_regs()->cfg); + } } // fallthrough default: {