diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index a7328d80..72198bec 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -376,6 +376,7 @@ E_LOOKUP_INFO_FUNCTION_DEF(slice) // rjf: choose base pointer & count members E_Member *base_ptr_member = 0; + E_Member *opl_ptr_member = 0; E_Member *count_member = 0; for(U64 idx = 0; idx < members.count; idx += 1) { @@ -390,10 +391,18 @@ E_LOOKUP_INFO_FUNCTION_DEF(slice) { base_ptr_member = &members.v[idx]; } + if(opl_ptr_member == 0 && e_type_kind_is_pointer_or_ref(member_type_kind)) + { + opl_ptr_member = &members.v[idx]; + } if(count_member != 0 && base_ptr_member != 0) { break; } + else if(base_ptr_member != 0 && opl_ptr_member != 0) + { + break; + } } // rjf: determine architecture @@ -422,6 +431,15 @@ E_LOOKUP_INFO_FUNCTION_DEF(slice) base_ptr_vaddr = base_ptr_member_value.u64; } + // rjf: evaluate opl ptr member, determine opl address + U64 opl_ptr_vaddr = 0; + if(count_member == 0 && opl_ptr_member != 0) + { + E_Expr *opl_ptr_member_expr = e_expr_irext_member_access(arena, &e_expr_nil, lhs, opl_ptr_member->name); + E_Value opl_ptr_member_value = e_value_from_expr(opl_ptr_member_expr); + opl_ptr_vaddr = opl_ptr_member_value.u64; + } + // rjf: determine element type E_TypeKey element_type_key = zero_struct; if(base_ptr_member != 0) @@ -429,6 +447,16 @@ E_LOOKUP_INFO_FUNCTION_DEF(slice) element_type_key = e_type_direct_from_key(base_ptr_member->type_key); } + // rjf: if no count, but base/opl, swap base/opl if needed, and measure count + if(count_member == 0 && opl_ptr_member != 0 && base_ptr_member != 0) + { + U64 min_vaddr = Min(base_ptr_vaddr, opl_ptr_vaddr); + U64 max_vaddr = Max(base_ptr_vaddr, opl_ptr_vaddr); + base_ptr_vaddr = min_vaddr; + opl_ptr_vaddr = max_vaddr; + count = (opl_ptr_vaddr - base_ptr_vaddr) / e_type_byte_size_from_key(element_type_key); + } + // rjf: fill if(count_member && base_ptr_member) { diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 50c97f35..5d899a55 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -5554,8 +5554,6 @@ rd_view_ui(Rng2F32 rect) // if(vs->is_searching) UI_Focus(UI_FocusKind_On) { - String8 cmd_name = vs->search_cmd_name; - RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_name); if(ui_is_focus_active() && ui_slot_press(UI_EventActionSlot_Cancel)) { vs->is_searching = 0; @@ -5563,17 +5561,7 @@ rd_view_ui(Rng2F32 rect) } if(ui_is_focus_active() && ui_slot_press(UI_EventActionSlot_Accept)) { - RD_RegsScope() - { - rd_regs_copy_contents(vs->search_arena, rd_regs(), vs->search_regs); - rd_regs_fill_slot_from_string(cmd_kind_info->query.slot, str8(vs->search_buffer, vs->search_string_size)); - rd_push_cmd(cmd_name, rd_regs()); - } - if(!(cmd_kind_info->query.flags & RD_QueryFlag_KeepOldInput)) - { - vs->is_searching = 0; - vs->search_string_size = 0; - } + rd_cmd(RD_CmdKind_CompleteQuery); } } @@ -7139,19 +7127,19 @@ rd_window_frame(void) if(query_is_open) { //- rjf: unpack query parameters - RD_Cfg *query = rd_immediate_cfg_from_keyf("window_query_%p", window); String8 cmd_name = ws->query_cmd_name; RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_name); + B32 size_query_by_expr_eval = (cmd_kind_info->query.expr.size == 0); + + //- rjf: build & prepare view for query ui + RD_Cfg *query = rd_immediate_cfg_from_keyf("window_query_%p", window); RD_Cfg *view = rd_cfg_child_from_string_or_alloc(query, str8_lit("watch")); RD_Cfg *expr = rd_cfg_child_from_string_or_alloc(view, str8_lit("expression")); - RD_Cfg *cmd = rd_cfg_child_from_string_or_alloc(view, str8_lit("cmd")); - rd_cfg_new_replace(cmd, cmd_name); rd_cfg_child_from_string_or_alloc(view, str8_lit("lister")); - B32 size_query_by_expr_eval = (cmd_kind_info->query.expr.size == 0); RD_ViewState *vs = rd_view_state_from_cfg(view); vs->is_searching = 1; arena_clear(vs->search_arena); - vs->search_cmd_name = push_str8_copy(vs->search_arena, ws->query_cmd_name); + vs->search_cmd_name = push_str8_copy(vs->search_arena, cmd_name); vs->search_regs = rd_regs_copy(vs->search_arena, ws->query_regs); String8 query_expression = cmd_kind_info->query.expr; if(query_expression.size == 0) @@ -15687,6 +15675,28 @@ Z(getting_started) }break; case RD_CmdKind_CompleteQuery: { + RD_Cfg *view = rd_cfg_from_id(rd_regs()->view); + RD_ViewState *vs = rd_view_state_from_cfg(view); + String8 cmd_name = vs->search_cmd_name; + RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_name); + RD_RegsScope() + { + rd_regs_copy_contents(vs->search_arena, rd_regs(), vs->search_regs); + rd_regs_fill_slot_from_string(cmd_kind_info->query.slot, str8(vs->search_buffer, vs->search_string_size)); + rd_push_cmd(cmd_name, rd_regs()); + } + if(cmd_kind_info->query.flags & RD_QueryFlag_Floating) + { + RD_Cfg *window = rd_cfg_from_id(rd_regs()->window); + RD_WindowState *ws = rd_window_state_from_cfg(window); + ws->query_is_active = 0; + } + else if(!(cmd_kind_info->query.flags & RD_QueryFlag_KeepOldInput)) + { + vs->is_searching = 0; + vs->search_string_size = 0; + } + #if 0 // TODO(rjf): @cfg (query completion) RD_Window *ws = rd_window_from_handle(rd_regs()->window); String8 query_cmd_name = ws->query_cmd_name; @@ -16046,7 +16056,7 @@ Z(getting_started) RD_Cfg *wdir = rd_cfg_new(target, str8_lit("working_directory")); rd_cfg_newf(wdir, "%S/", working_directory); } - rd_cmd(RD_CmdKind_SelectCfg, .cfg = target->id); + rd_cmd(RD_CmdKind_SelectTarget, .cfg = target->id); }break; //- rjf: jit-debugger registration