diff --git a/src/base/base_meta.h b/src/base/base_meta.h index 8b5362ac..1feb2ae4 100644 --- a/src/base/base_meta.h +++ b/src/base/base_meta.h @@ -102,6 +102,7 @@ enum { TypeFlag_IsExternal = (1<<0), TypeFlag_IsCode = (1<<1), + TypeFlag_IsPath = (1<<2), }; typedef U32 MemberFlags; @@ -203,42 +204,31 @@ struct_members(Rng1U64) struct_type(Rng1U64); //- rjf: String8 -Type String8__str_ptr_type = {TypeKind_Ptr, 0, sizeof(void *), type(U8), {0}, str8_lit_comp("size")}; -Member String8__members[] = +ptr_type(String8__str_ptr_type, type(U8), str8_lit_comp("size")); +struct_members(String8) { - {str8_lit_comp("str"), {0}, &String8__str_ptr_type, OffsetOf(String8, str)}, - {str8_lit_comp("size"), {0}, type(U64), OffsetOf(String8, size)}, -}; -Type String8__type = -{ - TypeKind_Struct, - 0, - sizeof(String8), - &type_nil, - str8_lit_comp("String8"), - {0}, - ArrayCount(String8__members), - String8__members, + member_lit_comp(String8, &String8__str_ptr_type, str), + member_lit_comp(String8, type(U64), size), }; +struct_type(String8); -//- rjf: String8 (code contents) -Type String8__code_str_ptr_type = {TypeKind_Ptr, TypeFlag_IsCode, sizeof(void *), type(U8), {0}, str8_lit_comp("size")}; -Member String8__code_members[] = +//- rjf: String8 (Code) +ptr_type(String8_Code__str_ptr_type, type(U8), str8_lit_comp("size"), .flags = TypeFlag_IsCode); +struct_members(String8_Code) { - {str8_lit_comp("str"), {0}, &String8__code_str_ptr_type, OffsetOf(String8, str)}, - {str8_lit_comp("size"), {0}, type(U64), OffsetOf(String8, size)}, + member_lit_comp(String8, &String8_Code__str_ptr_type, str), + member_lit_comp(String8, type(U64), size), }; -Type String8__code_type = +named_struct_type(String8_Code, String8); + +//- rjf: String8 (Path) +ptr_type(String8_Path__str_ptr_type, type(U8), str8_lit_comp("size"), .flags = TypeFlag_IsPath); +struct_members(String8_Path) { - TypeKind_Struct, - 0, - sizeof(String8), - &type_nil, - str8_lit_comp("String8"), - {0}, - ArrayCount(String8__code_members), - String8__code_members, + member_lit_comp(String8, &String8_Path__str_ptr_type, str), + member_lit_comp(String8, type(U64), size), }; +named_struct_type(String8_Path, String8); //- rjf: String8Node extern Type String8Node__type; diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 40eed5ce..9e55fa15 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -17,20 +17,27 @@ typedef U64 CTRL_MachineID; //- rjf: styled string types -ptr_type(CTRL_CodeString8__str_ptr_type, type(U8), .flags = TypeFlag_IsCode, .count_delimiter_name = str8_lit_comp("size")); ptr_type(CTRL_PlainString8__str_ptr_type, type(U8), .flags = 0, .count_delimiter_name = str8_lit_comp("size")); -Member CTRL_CodeString8__members[] = -{ - member_lit_comp(String8, &CTRL_CodeString8__str_ptr_type, str, .pretty_name = str8_lit_comp("Contents")), - member_lit_comp(String8, type(U64), size, .pretty_name = str8_lit_comp("Size")), -}; +ptr_type(CTRL_CodeString8__str_ptr_type, type(U8), .flags = TypeFlag_IsCode, .count_delimiter_name = str8_lit_comp("size")); +ptr_type(CTRL_PathString8__str_ptr_type, type(U8), .flags = TypeFlag_IsPath, .count_delimiter_name = str8_lit_comp("size")); Member CTRL_PlainString8__members[] = { member_lit_comp(String8, &CTRL_PlainString8__str_ptr_type, str, .pretty_name = str8_lit_comp("Contents")), member_lit_comp(String8, type(U64), size, .pretty_name = str8_lit_comp("Size")), }; -named_struct_type(CTRL_CodeString8, String8, .name = str8_lit_comp("string")); +Member CTRL_CodeString8__members[] = +{ + member_lit_comp(String8, &CTRL_CodeString8__str_ptr_type, str, .pretty_name = str8_lit_comp("Contents")), + member_lit_comp(String8, type(U64), size, .pretty_name = str8_lit_comp("Size")), +}; +Member CTRL_PathString8__members[] = +{ + member_lit_comp(String8, &CTRL_PathString8__str_ptr_type, str, .pretty_name = str8_lit_comp("Contents")), + member_lit_comp(String8, type(U64), size, .pretty_name = str8_lit_comp("Size")), +}; named_struct_type(CTRL_PlainString8, String8, .name = str8_lit_comp("string")); +named_struct_type(CTRL_CodeString8, String8, .name = str8_lit_comp("string")); +named_struct_type(CTRL_PathString8, String8, .name = str8_lit_comp("string")); //- rjf: meta evaluation callstack types @@ -74,10 +81,10 @@ X(U64, id, "ID")\ X(Rng1U64, vaddr_range, "Address Range")\ X(U32, color, "Color")\ Y(String8, type(CTRL_CodeString8), label, "Label")\ -Y(String8, type(CTRL_PlainString8), exe, "Executable Path")\ -Y(String8, type(CTRL_PlainString8), dbg, "Debug Info Path")\ +Y(String8, type(CTRL_PathString8), exe, "Executable Path")\ +Y(String8, type(CTRL_PathString8), dbg, "Debug Info Path")\ Y(String8, type(CTRL_PlainString8), args, "Arguments")\ -Y(String8, type(CTRL_PlainString8), working_directory, "Working Directory")\ +Y(String8, type(CTRL_PathString8), working_directory, "Working Directory")\ Y(String8, type(CTRL_CodeString8), entry_point, "Custom Entry Point")\ Y(String8, type(CTRL_PlainString8), location, "Location")\ Y(String8, type(CTRL_CodeString8), condition, "Condition")\ @@ -112,9 +119,9 @@ struct_members(CTRL_BreakpointMetaEval) struct_members(CTRL_TargetMetaEval) { member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), label, .pretty_name = str8_lit_comp("Label")), - member_lit_comp(CTRL_MetaEval, type(CTRL_PlainString8),exe, .pretty_name = str8_lit_comp("Executable")), + member_lit_comp(CTRL_MetaEval, type(CTRL_PathString8), exe, .pretty_name = str8_lit_comp("Executable")), member_lit_comp(CTRL_MetaEval, type(CTRL_PlainString8),args, .pretty_name = str8_lit_comp("Arguments")), - member_lit_comp(CTRL_MetaEval, type(CTRL_PlainString8),working_directory, .pretty_name = str8_lit_comp("Working Directory")), + member_lit_comp(CTRL_MetaEval, type(CTRL_PathString8), working_directory, .pretty_name = str8_lit_comp("Working Directory")), member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), entry_point, .pretty_name = str8_lit_comp("Custom Entry Point")), }; diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index 51c6be1f..7b949b2f 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -463,6 +463,10 @@ e_type_key_cons_base(Type *type) { flags |= E_TypeFlag_IsCode; } + if(type->flags & TypeFlag_IsPath) + { + flags |= E_TypeFlag_IsPath; + } result = e_type_key_cons_ptr(arch_from_context(), direct_type, flags); }break; case TypeKind_Array: diff --git a/src/eval/eval_types.h b/src/eval/eval_types.h index 05a1d181..44507871 100644 --- a/src/eval/eval_types.h +++ b/src/eval/eval_types.h @@ -70,6 +70,7 @@ enum E_TypeFlag_Volatile = (1<<1), E_TypeFlag_External = (1<<2), E_TypeFlag_IsCode = (1<<3), + E_TypeFlag_IsPath = (1<<4), }; typedef struct E_Member E_Member; diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 478ad386..e53acf2a 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -1853,6 +1853,10 @@ rd_name_from_ctrl_entity(Arena *arena, CTRL_Entity *entity) { string = str8_lit("unnamed"); } + if(entity->kind == CTRL_EntityKind_Module) + { + string = str8_skip_last_slash(string); + } return string; } diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 3626d4d2..5f2f15ca 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -1217,6 +1217,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo {RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_LaunchAndInit }, {RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_SelectEntity }, {RD_EntityKind_Nil, CTRL_EntityKind_Thread, RD_CmdKind_FreezeThread }, + {RD_EntityKind_Nil, CTRL_EntityKind_Thread, RD_CmdKind_SelectThread }, }; RD_WatchViewRowCtrl *row_ctrls = row_ctrls_; U64 row_ctrls_count = ArrayCount(row_ctrls_); @@ -2381,7 +2382,8 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo //- rjf: peek clicks in canvas region, mark clicked for(UI_Event *evt = 0; ui_next_event(&evt);) { - if(evt->kind == UI_EventKind_Press && evt->key == OS_Key_LeftMouseButton && contains_2f32(canvas_rect, evt->pos)) + if(evt->kind == UI_EventKind_Press && evt->key == OS_Key_LeftMouseButton && contains_2f32(canvas_rect, evt->pos) && + contains_2f32(rect, evt->pos)) { pressed = 1; break; @@ -2468,7 +2470,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo { palette = rd_palette_from_code(RD_PaletteCode_NeutralPopButton); } - if(ctrl_entity->kind == RD_EntityKind_Thread && ctrl_handle_match(ctrl_entity->handle, rd_regs()->thread)) + if(ctrl_entity->kind == CTRL_EntityKind_Thread && ctrl_handle_match(ctrl_entity->handle, rd_regs()->thread)) { palette = rd_palette_from_code(RD_PaletteCode_NeutralPopButton); } @@ -2528,6 +2530,10 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo sig.event_flags & OS_Modifier_Ctrl && !entity->disabled ? RD_CmdKind_DisableEntity : RD_CmdKind_SelectEntity, .entity = rd_handle_from_entity(entity)); } + if(ctrl_entity->kind == CTRL_EntityKind_Thread) + { + rd_cmd(RD_CmdKind_SelectThread, .thread = ctrl_entity->handle); + } } } } @@ -2551,6 +2557,10 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo { icon_kind = entity->disabled ? RD_IconKind_CheckHollow : RD_IconKind_CheckFilled; } + if(ctrl->kind == RD_CmdKind_SelectThread) + { + icon_kind = (ctrl_handle_match(ctrl_entity->handle, rd_base_regs()->thread) ? RD_IconKind_CheckFilled : RD_IconKind_CheckHollow); + } if(ctrl->kind == RD_CmdKind_FreezeThread) { icon_kind = is_frozen ? RD_IconKind_Locked : RD_IconKind_Unlocked; @@ -2567,6 +2577,10 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo sig.event_flags & OS_Modifier_Ctrl && !entity->disabled ? RD_CmdKind_DisableEntity : RD_CmdKind_SelectEntity, .entity = rd_handle_from_entity(entity)); } + else if(ctrl->kind == RD_CmdKind_SelectThread) + { + rd_cmd(RD_CmdKind_SelectThread, .thread = ctrl_entity->handle); + } else if(ctrl->kind == RD_CmdKind_FreezeThread) { rd_cmd(is_frozen ? RD_CmdKind_ThawThread : RD_CmdKind_FreezeThread, @@ -2811,6 +2825,10 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo { cell_is_code = 1; } + if(col->kind == RD_WatchViewColumnKind_Value && row_type->flags & E_TypeFlag_IsPath) + { + cell_is_code = 0; + } //- rjf: build cell UI_Signal sig = {0};