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