From 2dbe8d42ebb81fc5e77624a5858bc99518a59931 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 1 May 2025 17:04:29 -0700 Subject: [PATCH] eliminate more old view settings code, simplify new, also clean up the targetless launch flow even more - if we only have one target, but it's inactive, and the user is trying to launch, then it doesn't hurt to just act as if that target was selected, then select it for them... --- src/eval/eval_core.c | 46 ---------------- src/eval/eval_core.h | 1 - src/raddbg/raddbg_core.c | 109 ++++++++++++-------------------------- src/raddbg/raddbg_core.h | 11 ++-- src/raddbg/raddbg_views.c | 60 ++++++++++++--------- 5 files changed, 73 insertions(+), 154 deletions(-) diff --git a/src/eval/eval_core.c b/src/eval/eval_core.c index 18e8c407..3212437d 100644 --- a/src/eval/eval_core.c +++ b/src/eval/eval_core.c @@ -1219,52 +1219,6 @@ e_base_offset_from_eval(E_Eval eval) return eval.value.u64; } -internal Rng1U64 -e_range_from_eval(E_Eval eval) -{ - U64 size = 0; - E_Type *type = e_type_from_key__cached(eval.irtree.type_key); - if(type->kind == E_TypeKind_Lens) - { - for EachIndex(idx, type->count) - { - E_Expr *arg = type->args[idx]; - if(arg->kind == E_ExprKind_Define && str8_match(arg->first->string, str8_lit("size"), 0)) - { - size = e_value_from_expr(arg->first->next).u64; - break; - } - } - } - E_TypeKey type_key = e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative); - E_TypeKind type_kind = e_type_kind_from_key(type_key); - E_TypeKey direct_type_key = e_type_key_unwrap(type_key, E_TypeUnwrapFlag_All); - 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(direct_type_key); - } - if(size == 0 && eval.irtree.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(type_key); - } - if(size == 0) - { - size = KB(16); - } - Rng1U64 result = {0}; - result.min = e_base_offset_from_eval(eval); - result.max = result.min + size; - return result; -} - - //////////////////////////////// //~ rjf: Debug Functions diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index 3497abfd..97738ec5 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -1179,7 +1179,6 @@ internal E_Key e_key_wrapf(E_Key key, char *fmt, ...); //~ rjf: Eval Info Extraction internal U64 e_base_offset_from_eval(E_Eval eval); -internal Rng1U64 e_range_from_eval(E_Eval eval); //////////////////////////////// //~ rjf: Debug Functions diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 17cf8baa..116560e9 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -5367,45 +5367,48 @@ rd_view_query_input(void) return string; } -internal RD_Cfg * -rd_view_cfg_from_string(String8 string) +internal String8 +rd_view_setting_from_name(String8 name) { RD_Cfg *view = rd_cfg_from_id(rd_regs()->view); - RD_Cfg *cfg = rd_cfg_child_from_string(view, string); - return cfg; + String8 result = rd_cfg_child_from_string(view, name)->first->string; + if(result.size == 0) + { + result = rd_default_setting_from_names(view->string, name); + } + return result; } internal E_Value -rd_view_cfg_value_from_string(String8 string) +rd_view_setting_value_from_name(String8 name) { - RD_Cfg *root = rd_view_cfg_from_string(string); - String8 expr = root->first->string; + String8 expr = rd_view_setting_from_name(name); E_Eval eval = e_eval_from_string(expr); E_Value result = e_value_eval_from_eval(eval).value; return result; } internal B32 -rd_view_cfg_b32_from_string(String8 string) +rd_view_setting_b32_from_name(String8 name) { - RD_Cfg *root = rd_view_cfg_from_string(string); - B32 result = !!e_value_from_stringf("(bool)(%S)", root->first->string).u64; + String8 string = rd_view_setting_from_name(name); + B32 result = !!e_value_from_stringf("(bool)(%S)", string).u64; return result; } internal U64 -rd_view_cfg_u64_from_string(String8 string) +rd_view_setting_u64_from_name(String8 name) { - RD_Cfg *root = rd_view_cfg_from_string(string); - U64 result = e_value_from_stringf("(uint64)(%S)", root->first->string).u64; + String8 string = rd_view_setting_from_name(name); + U64 result = e_value_from_stringf("(uint64)(%S)", string).u64; return result; } internal F32 -rd_view_cfg_f32_from_string(String8 string) +rd_view_setting_f32_from_name(String8 name) { - RD_Cfg *root = rd_view_cfg_from_string(string); - F32 result = e_value_from_stringf("(float32)(%S)", root->first->string).f32; + String8 string = rd_view_setting_from_name(name); + F32 result = e_value_from_stringf("(float32)(%S)", string).f32; return result; } @@ -5466,57 +5469,6 @@ rd_arch_from_eval(E_Eval eval) return arch; } -internal R_Tex2DFormat -rd_tex2dformat_from_eval(E_Eval eval) -{ - R_Tex2DFormat fmt = R_Tex2DFormat_RGBA8; - B32 got_fmt = 0; - - // rjf: try explicitly passed formats - E_Type *type = e_type_from_key__cached(eval.irtree.type_key); - if(type->kind == E_TypeKind_Lens) - { - for EachIndex(idx, type->count) - { - E_Expr *arg = type->args[idx]; - if(arg->kind == E_ExprKind_Define && str8_match(arg->first->string, str8_lit("fmt"), 0)) - { - got_fmt = 1; - for EachEnumVal(R_Tex2DFormat, f) - { - if(str8_match(arg->first->next->string, r_tex2d_format_display_string_table[f], StringMatchFlag_CaseInsensitive)) - { - fmt = f; - break; - } - } - } - } - } - - // rjf: try implicit non-define arguments - if(type->kind == E_TypeKind_Lens) - { - for EachIndex(idx, type->count) - { - E_Expr *arg = type->args[idx]; - if(arg->kind == E_ExprKind_LeafIdentifier) - { - for EachEnumVal(R_Tex2DFormat, f) - { - if(str8_match(arg->string, r_tex2d_format_display_string_table[f], StringMatchFlag_CaseInsensitive)) - { - fmt = f; - break; - } - } - } - } - } - - return fmt; -} - //- rjf: pushing/attaching view resources internal void * @@ -8698,7 +8650,7 @@ rd_window_frame(void) { // rjf: gather info for this tab B32 tab_is_selected = (tab == panel->selected_tab); - B32 tab_is_auto = rd_view_cfg_b32_from_string(str8_lit("auto")); + B32 tab_is_auto = rd_view_setting_b32_from_name(str8_lit("auto")); // rjf: begin vertical region for this tab ui_set_next_child_layout_axis(Axis2_Y); @@ -12088,6 +12040,16 @@ rd_frame(void) } } + // rjf: run -> no active targets, no processes, but we only have one target? -> just launch it, then select it + if((kind == RD_CmdKind_Run || + kind == RD_CmdKind_StepInto || + kind == RD_CmdKind_StepOver) && processes.count == 0 && targets.count == 1 && !has_active_targets) + { + rd_cmd(kind == RD_CmdKind_Run ? RD_CmdKind_LaunchAndRun : RD_CmdKind_LaunchAndStepInto, .cfg = targets.first->v->id); + rd_cmd(RD_CmdKind_SelectTarget, .cfg = targets.first->v->id); + break; + } + // rjf: run -> no targets at all, no processes? -> do helper for add-target if((kind == RD_CmdKind_Run || kind == RD_CmdKind_StepInto || @@ -12100,13 +12062,10 @@ rd_frame(void) // 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) + kind == RD_CmdKind_StepOver) && processes.count == 0 && !has_active_targets) { - 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; - } + 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, @@ -14010,7 +13969,7 @@ rd_frame(void) RD_RegsScope(.tab = tab->id, .view = tab->id) { if(str8_match(tab->string, str8_lit("text"), 0) && - rd_view_cfg_b32_from_string(str8_lit("auto"))) + rd_view_setting_b32_from_name(str8_lit("auto"))) { panel_w_auto = panel; view_w_auto = tab; diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index e9c3ccc8..307b1690 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -915,16 +915,15 @@ internal UI_ScrollPt2 rd_view_scroll_pos(void); internal EV_View *rd_view_eval_view(void); internal String8 rd_view_query_cmd(void); internal String8 rd_view_query_input(void); -internal RD_Cfg *rd_view_cfg_from_string(String8 string); -internal E_Value rd_view_cfg_value_from_string(String8 string); -internal B32 rd_view_cfg_b32_from_string(String8 string); -internal U64 rd_view_cfg_u64_from_string(String8 string); -internal F32 rd_view_cfg_f32_from_string(String8 string); +internal String8 rd_view_setting_from_name(String8 string); +internal E_Value rd_view_setting_value_from_name(String8 string); +internal B32 rd_view_setting_b32_from_name(String8 string); +internal U64 rd_view_setting_u64_from_name(String8 string); +internal F32 rd_view_setting_f32_from_name(String8 string); //- rjf: evaluation & tag (a view's 'call') parameter extraction internal TXT_LangKind rd_lang_kind_from_eval(E_Eval eval); internal Arch rd_arch_from_eval(E_Eval eval); -internal R_Tex2DFormat rd_tex2dformat_from_eval(E_Eval eval); //- rjf: pushing/attaching view resources internal void *rd_view_state_by_size(U64 size); diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index cc6ee83a..fb34db1c 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -1898,23 +1898,23 @@ RD_VIEW_UI_FUNCTION_DEF(text) rd_regs()->file_path = rd_file_path_from_eval(rd_frame_arena(), eval); rd_regs()->vaddr = 0; rd_regs()->prefer_disasm = 0; - rd_regs()->cursor.line = rd_view_cfg_value_from_string(str8_lit("cursor_line")).s64; - rd_regs()->cursor.column = rd_view_cfg_value_from_string(str8_lit("cursor_column")).s64; - rd_regs()->mark.line = rd_view_cfg_value_from_string(str8_lit("mark_line")).s64; - rd_regs()->mark.column = rd_view_cfg_value_from_string(str8_lit("mark_column")).s64; + rd_regs()->cursor.line = rd_view_setting_value_from_name(str8_lit("cursor_line")).s64; + rd_regs()->cursor.column = rd_view_setting_value_from_name(str8_lit("cursor_column")).s64; + rd_regs()->mark.line = rd_view_setting_value_from_name(str8_lit("mark_line")).s64; + rd_regs()->mark.column = rd_view_setting_value_from_name(str8_lit("mark_column")).s64; if(rd_regs()->cursor.line == 0) { rd_regs()->cursor.line = 1; } if(rd_regs()->cursor.column == 0) { rd_regs()->cursor.column = 1; } if(rd_regs()->mark.line == 0) { rd_regs()->mark.line = 1; } if(rd_regs()->mark.column == 0) { rd_regs()->mark.column = 1; } U64 base_offset = e_base_offset_from_eval(eval); - U64 size = rd_view_cfg_value_from_string(str8_lit("size")).u64; + U64 size = rd_view_setting_value_from_name(str8_lit("size")).u64; if(size == 0) { size = e_type_byte_size_from_key(e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative)); } Rng1U64 range = r1u64(base_offset, base_offset+size); rd_regs()->text_key = rd_key_from_eval_space_range(eval.space, range, 1); - String8 lang = rd_view_cfg_from_string(str8_lit("lang"))->first->string; + String8 lang = rd_view_setting_from_name(str8_lit("lang")); if(lang.size == 0) { rd_regs()->lang_kind = rd_lang_kind_from_eval(eval); @@ -2181,7 +2181,7 @@ RD_VIEW_UI_FUNCTION_DEF(disasm) space = auto_space; } U64 base_offset = e_base_offset_from_eval(eval); - U64 size = rd_view_cfg_value_from_string(str8_lit("size")).u64; + U64 size = rd_view_setting_value_from_name(str8_lit("size")).u64; if(size == 0) { size = KB(16); @@ -2360,14 +2360,13 @@ RD_VIEW_UI_FUNCTION_DEF(memory) //- rjf: unpack parameterization info // F32 main_font_size = ui_bottom_font_size(); - Rng1U64 view_range = e_range_from_eval(eval); U64 base_offset = e_base_offset_from_eval(eval); - U64 size = rd_view_cfg_value_from_string(str8_lit("size")).u64; + U64 size = rd_view_setting_value_from_name(str8_lit("size")).u64; if(size == 0) { size = e_type_byte_size_from_key(e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative)); } - view_range = r1u64(base_offset, base_offset+size); + Rng1U64 view_range = r1u64(base_offset, base_offset+size); if(eval.space.kind == 0) { eval.space = rd_eval_space_from_ctrl_entity(ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->process), RD_EvalSpaceKind_CtrlEntity); @@ -2377,13 +2376,13 @@ RD_VIEW_UI_FUNCTION_DEF(memory) { view_range = r1u64(0, 0x7FFFFFFFFFFFull); } - U64 cursor_base_vaddr = rd_view_cfg_u64_from_string(str8_lit("cursor")); - U64 mark_base_vaddr = rd_view_cfg_u64_from_string(str8_lit("mark")); - U64 cursor_size = rd_view_cfg_u64_from_string(str8_lit("cursor_size")); + U64 cursor_base_vaddr = rd_view_setting_u64_from_name(str8_lit("cursor")); + U64 mark_base_vaddr = rd_view_setting_u64_from_name(str8_lit("mark")); + U64 cursor_size = rd_view_setting_u64_from_name(str8_lit("cursor_size")); cursor_size = ClampBot(1, cursor_size); U64 initial_cursor_base_vaddr = cursor_base_vaddr; U64 initial_mark_base_vaddr = mark_base_vaddr; - U64 num_columns = rd_view_cfg_u64_from_string(str8_lit("num_columns")); + U64 num_columns = rd_view_setting_u64_from_name(str8_lit("num_columns")); if(num_columns == 0) { num_columns = 16; @@ -3378,8 +3377,17 @@ RD_VIEW_UI_FUNCTION_DEF(bitmap) ////////////////////////////// //- rjf: evaluate expression // - Vec2S32 dim = v2s32((S32)rd_view_cfg_u64_from_string(str8_lit("w")), (S32)rd_view_cfg_u64_from_string(str8_lit("h"))); - R_Tex2DFormat fmt = rd_tex2dformat_from_eval(eval); + Vec2S32 dim = v2s32((S32)rd_view_setting_u64_from_name(str8_lit("w")), (S32)rd_view_setting_u64_from_name(str8_lit("h"))); + String8 fmt_string = rd_view_setting_from_name(str8_lit("fmt")); + R_Tex2DFormat fmt = R_Tex2DFormat_RGBA8; + for EachNonZeroEnumVal(R_Tex2DFormat, f) + { + if(str8_match(fmt_string, r_tex2d_format_display_string_table[f], StringMatchFlag_CaseInsensitive)) + { + fmt = f; + break; + } + } U64 base_offset = e_base_offset_from_eval(eval); U64 expected_size = dim.x*dim.y*r_tex2d_format_bytes_per_pixel_table[fmt]; Rng1U64 offset_range = r1u64(base_offset, base_offset + expected_size); @@ -3387,11 +3395,11 @@ RD_VIEW_UI_FUNCTION_DEF(bitmap) ////////////////////////////// //- rjf: unpack params // - F32 zoom = rd_view_cfg_value_from_string(str8_lit("zoom")).f32; + F32 zoom = rd_view_setting_value_from_name(str8_lit("zoom")).f32; Vec2F32 view_center_pos = { - rd_view_cfg_value_from_string(str8_lit("x")).f32, - rd_view_cfg_value_from_string(str8_lit("y")).f32, + rd_view_setting_value_from_name(str8_lit("x")).f32, + rd_view_setting_value_from_name(str8_lit("y")).f32, }; if(zoom == 0) { @@ -3517,7 +3525,7 @@ RD_VIEW_UI_FUNCTION_DEF(bitmap) case R_Tex2DFormat_R8: {color = v4f32(((U8 *)(data.str+off_bytes))[0]/255.f, 0, 0, 1);}break; case R_Tex2DFormat_RG8: {color = v4f32(((U8 *)(data.str+off_bytes))[0]/255.f, ((U8 *)(data.str+off_bytes))[1]/255.f, 0, 1);}break; case R_Tex2DFormat_RGBA8: {color = v4f32(((U8 *)(data.str+off_bytes))[0]/255.f, ((U8 *)(data.str+off_bytes))[1]/255.f, ((U8 *)(data.str+off_bytes))[2]/255.f, ((U8 *)(data.str+off_bytes))[3]/255.f);}break; - case R_Tex2DFormat_BGRA8: {color = v4f32(((U8 *)(data.str+off_bytes))[3]/255.f, ((U8 *)(data.str+off_bytes))[2]/255.f, ((U8 *)(data.str+off_bytes))[1]/255.f, ((U8 *)(data.str+off_bytes))[0]/255.f);}break; + case R_Tex2DFormat_BGRA8: {color = v4f32(((U8 *)(data.str+off_bytes))[2]/255.f, ((U8 *)(data.str+off_bytes))[1]/255.f, ((U8 *)(data.str+off_bytes))[0]/255.f, ((U8 *)(data.str+off_bytes))[3]/255.f);}break; case R_Tex2DFormat_R16: {color = v4f32(((U16 *)(data.str+off_bytes))[0]/(F32)max_U16, 0, 0, 1);}break; case R_Tex2DFormat_RGBA16: {color = v4f32(((U16 *)(data.str+off_bytes))[0]/(F32)max_U16, ((U16 *)(data.str+off_bytes))[1]/(F32)max_U16, ((U16 *)(data.str+off_bytes))[2]/(F32)max_U16, ((U16 *)(data.str+off_bytes))[3]/(F32)max_U16);}break; case R_Tex2DFormat_R32: {color = v4f32(((F32 *)(data.str+off_bytes))[0], 0, 0, 1);}break; @@ -3883,12 +3891,12 @@ RD_VIEW_UI_FUNCTION_DEF(geo3d) ////////////////////////////// //- rjf: unpack parameters // - U64 count = rd_view_cfg_u64_from_string(str8_lit("count")); - U64 vtx_base_off = rd_view_cfg_u64_from_string(str8_lit("vtx")); - U64 vtx_size = rd_view_cfg_u64_from_string(str8_lit("vtx_size")); - F32 yaw_target = rd_view_cfg_f32_from_string(str8_lit("yaw")); - F32 pitch_target = rd_view_cfg_f32_from_string(str8_lit("pitch")); - F32 zoom_target = rd_view_cfg_f32_from_string(str8_lit("zoom")); + U64 count = rd_view_setting_u64_from_name(str8_lit("count")); + U64 vtx_base_off = rd_view_setting_u64_from_name(str8_lit("vtx")); + U64 vtx_size = rd_view_setting_u64_from_name(str8_lit("vtx_size")); + F32 yaw_target = rd_view_setting_f32_from_name(str8_lit("yaw")); + F32 pitch_target = rd_view_setting_f32_from_name(str8_lit("pitch")); + F32 zoom_target = rd_view_setting_f32_from_name(str8_lit("zoom")); ////////////////////////////// //- rjf: evaluate & unpack expression