mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-26 05:25:00 -07:00
continue work on ctrl entity visualization in watch views & further progress on new scheduler
This commit is contained in:
@@ -143,7 +143,8 @@ struct_members(CTRL_ProcessMetaEval)
|
||||
struct_members(CTRL_ModuleMetaEval)
|
||||
{
|
||||
member_lit_comp(CTRL_MetaEval, type(U32), color, .pretty_name = str8_lit_comp("Color")),
|
||||
member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), label, .pretty_name = str8_lit_comp("Executable")),
|
||||
member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), label, .pretty_name = str8_lit_comp("Name")),
|
||||
member_lit_comp(CTRL_MetaEval, type(CTRL_PlainString8),exe, .pretty_name = str8_lit_comp("Executable Path")),
|
||||
member_lit_comp(CTRL_MetaEval, type(CTRL_PlainString8),dbg, .pretty_name = str8_lit_comp("Debug Info Path")),
|
||||
member_lit_comp(CTRL_MetaEval, type(Rng1U64), vaddr_range, .pretty_name = str8_lit_comp("Address Range")),
|
||||
};
|
||||
|
||||
@@ -1857,7 +1857,7 @@ rd_name_from_ctrl_entity(Arena *arena, CTRL_Entity *entity)
|
||||
}
|
||||
|
||||
internal DR_FancyStringList
|
||||
rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, Vec4F32 secondary_color, F32 size)
|
||||
rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, Vec4F32 secondary_color, F32 size, B32 include_extras)
|
||||
{
|
||||
DR_FancyStringList result = {0};
|
||||
RD_IconKind icon_kind = RD_IconKind_Null;
|
||||
@@ -1874,9 +1874,24 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, Vec4F32 secon
|
||||
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Icons), size, secondary_color, rd_icon_kind_text_table[icon_kind]);
|
||||
}
|
||||
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" "));
|
||||
if(entity->kind == CTRL_EntityKind_Thread)
|
||||
{
|
||||
CTRL_EntityList processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process);
|
||||
if(processes.count > 1)
|
||||
{
|
||||
CTRL_Entity *process = ctrl_entity_ancestor_from_kind(entity, CTRL_EntityKind_Process);
|
||||
String8 process_name = rd_name_from_ctrl_entity(arena, process);
|
||||
Vec4F32 process_color = rd_rgba_from_ctrl_entity(process);
|
||||
if(process_name.size != 0)
|
||||
{
|
||||
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, process_color, process_name);
|
||||
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" / "));
|
||||
}
|
||||
}
|
||||
}
|
||||
String8 name = rd_name_from_ctrl_entity(arena, entity);
|
||||
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, color, name);
|
||||
if(entity->kind == CTRL_EntityKind_Thread)
|
||||
if(entity->kind == CTRL_EntityKind_Thread && include_extras)
|
||||
{
|
||||
F32 ext_size = size*0.95f;
|
||||
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" "));
|
||||
@@ -3274,7 +3289,7 @@ rd_window_frame(RD_Window *ws)
|
||||
String8 arch_str = string_from_arch(arch);
|
||||
DR_FancyStringList fstrs = rd_title_fstrs_from_ctrl_entity(scratch.arena, thread,
|
||||
rd_rgba_from_theme_color(RD_ThemeColor_TextWeak),
|
||||
ui_top_font_size());
|
||||
ui_top_font_size(), 0);
|
||||
|
||||
// TODO(rjf): @msgs show stop info (just icon or shortened description)
|
||||
|
||||
@@ -3826,7 +3841,7 @@ rd_window_frame(RD_Window *ws)
|
||||
UI_TextAlignment(UI_TextAlign_Center)
|
||||
UI_TextPadding(ui_top_font_size()*1.5f)
|
||||
{
|
||||
DR_FancyStringList fstrs = rd_title_fstrs_from_ctrl_entity(scratch.arena, ctrl_entity, ui_top_palette()->text_weak, ui_top_font_size());
|
||||
DR_FancyStringList fstrs = rd_title_fstrs_from_ctrl_entity(scratch.arena, ctrl_entity, ui_top_palette()->text_weak, ui_top_font_size(), 0);
|
||||
UI_Box *title_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero());
|
||||
ui_box_equip_display_fancy_strings(title_box, &fstrs);
|
||||
if(ctrl_entity->kind == CTRL_EntityKind_Thread)
|
||||
@@ -13493,6 +13508,7 @@ rd_frame(void)
|
||||
}
|
||||
|
||||
// rjf: retry on stopped, pending debug info
|
||||
// TODO(rjf): CANNOT RETRY IN THIS WAY, NEED TO DEFER TO NEXT FRAME
|
||||
if(!d_ctrl_targets_running() && (dbgi_pending || missing_rip))
|
||||
{
|
||||
rd_cmd(RD_CmdKind_FindThread, .thread = thread->handle);
|
||||
@@ -14476,6 +14492,9 @@ rd_frame(void)
|
||||
if(rd_regs()->unwind_count < rich_unwind.frames.concrete_frame_count)
|
||||
{
|
||||
D_UnwindFrame *frame = &rich_unwind.frames.v[rd_regs()->unwind_count];
|
||||
U64 rip_vaddr = regs_rip_from_arch_block(thread->arch, frame->regs);
|
||||
CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr);
|
||||
rd_state->base_regs.v.module = module->handle;
|
||||
rd_state->base_regs.v.unwind_count = rd_regs()->unwind_count;
|
||||
rd_state->base_regs.v.inline_depth = 0;
|
||||
if(rd_regs()->inline_depth <= frame->inline_frame_count)
|
||||
|
||||
@@ -1176,7 +1176,7 @@ internal DR_FancyStringList rd_title_fstrs_from_entity(Arena *arena, RD_Entity *
|
||||
|
||||
internal Vec4F32 rd_rgba_from_ctrl_entity(CTRL_Entity *entity);
|
||||
internal String8 rd_name_from_ctrl_entity(Arena *arena, CTRL_Entity *entity);
|
||||
internal DR_FancyStringList rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, Vec4F32 secondary_color, F32 size);
|
||||
internal DR_FancyStringList rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, Vec4F32 secondary_color, F32 size, B32 include_extras);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Evaluation Spaces
|
||||
|
||||
+89
-79
@@ -1089,6 +1089,10 @@ rd_string_from_eval_viz_row_column(Arena *arena, EV_View *ev, EV_Row *row, RD_Wa
|
||||
result = str8_lit("???");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
result = str8_lit("???");
|
||||
}
|
||||
di_scope_close(di_scope);
|
||||
scratch_end(scratch);
|
||||
}break;
|
||||
@@ -1209,9 +1213,10 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
|
||||
}
|
||||
RD_WatchViewRowCtrl row_ctrls_[] =
|
||||
{
|
||||
{RD_EntityKind_Target, RD_CmdKind_LaunchAndRun },
|
||||
{RD_EntityKind_Target, RD_CmdKind_LaunchAndInit },
|
||||
{RD_EntityKind_Target, RD_CmdKind_SelectEntity },
|
||||
{RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_LaunchAndRun },
|
||||
{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_WatchViewRowCtrl *row_ctrls = row_ctrls_;
|
||||
U64 row_ctrls_count = ArrayCount(row_ctrls_);
|
||||
@@ -1375,7 +1380,16 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
|
||||
RD_WatchViewRowKind row_kind = rd_watch_view_row_kind_from_flags_row_info(flags, mark_rows.first, &row_info);
|
||||
if(row_kind == RD_WatchViewRowKind_PrettyEntityControls)
|
||||
{
|
||||
cursor_x_range = r1s64(1, 1+row_ctrls_count);
|
||||
U64 row_ctrl_count = 0;
|
||||
for EachIndex(idx, row_ctrls_count)
|
||||
{
|
||||
if(row_ctrls[idx].entity_kind == row_info.collection_entity->kind &&
|
||||
row_ctrls[idx].ctrl_entity_kind == row_info.collection_ctrl_entity->kind)
|
||||
{
|
||||
row_ctrl_count += 1;
|
||||
}
|
||||
}
|
||||
cursor_x_range = r1s64(1, 1+row_ctrl_count);
|
||||
}
|
||||
}
|
||||
cursor_tbl_range = r2s64(v2s64(cursor_x_range.min, 0), v2s64(cursor_x_range.max, block_tree.total_item_count-1));
|
||||
@@ -1540,7 +1554,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
|
||||
}
|
||||
}break;
|
||||
case RD_WatchViewRowKind_PrettyEntityControls:
|
||||
if(!rd_entity_is_nil(row_info.collection_entity) && selection_tbl.min.x == 1 && selection_tbl.max.x == 1)
|
||||
if((!rd_entity_is_nil(row_info.collection_entity) || row_info.collection_ctrl_entity != &ctrl_entity_nil) && selection_tbl.min.x == 1 && selection_tbl.max.x == 1)
|
||||
{
|
||||
kind = OpKind_DoExpand;
|
||||
}break;
|
||||
@@ -2157,6 +2171,23 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
|
||||
B32 row_selected = (selection_tbl.min.y <= global_row_idx && global_row_idx <= selection_tbl.max.y);
|
||||
B32 row_expanded = ev_expansion_from_key(eval_view, row->key);
|
||||
E_Eval row_eval = e_eval_from_expr(scratch.arena, row->expr);
|
||||
CTRL_Entity *row_ctrl_entity = rd_ctrl_entity_from_eval_space(row_eval.space);
|
||||
CTRL_Entity *row_module = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->module);
|
||||
switch(row_ctrl_entity->kind)
|
||||
{
|
||||
default:
|
||||
case CTRL_EntityKind_Process:
|
||||
if(row_eval.mode == E_Mode_Offset)
|
||||
{
|
||||
row_module = ctrl_module_from_process_vaddr(row_ctrl_entity, row_eval.value.u64);
|
||||
}break;
|
||||
case CTRL_EntityKind_Thread:
|
||||
if(row_eval.mode == E_Mode_Value)
|
||||
{
|
||||
CTRL_Entity *process = ctrl_process_from_entity(row_ctrl_entity);
|
||||
row_module = ctrl_module_from_process_vaddr(process, row_eval.value.u64);
|
||||
}break;
|
||||
}
|
||||
E_Type *row_type = e_type_from_key(scratch.arena, row_eval.type_key);
|
||||
B32 row_is_expandable = ev_row_is_expandable(row);
|
||||
B32 row_is_editable = ev_row_is_editable(row);
|
||||
@@ -2243,7 +2274,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
|
||||
//////////////////////
|
||||
//- rjf: build row contents
|
||||
//
|
||||
UI_Parent(row_box) switch(row_kind)
|
||||
RD_RegsScope(.module = row_module->handle) UI_Parent(row_box) switch(row_kind)
|
||||
{
|
||||
////////////////////
|
||||
//- rjf: header row
|
||||
@@ -2434,6 +2465,10 @@ 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))
|
||||
{
|
||||
palette = rd_palette_from_code(RD_PaletteCode_NeutralPopButton);
|
||||
}
|
||||
|
||||
//- rjf: build add-new buttons
|
||||
if(rd_entity_is_nil(entity) && collection_entity_kind == RD_EntityKind_Target)
|
||||
@@ -2447,8 +2482,20 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
|
||||
}
|
||||
|
||||
//- rjf: build entity box
|
||||
if(!rd_entity_is_nil(entity))
|
||||
if(!rd_entity_is_nil(entity) || ctrl_entity != &ctrl_entity_nil)
|
||||
{
|
||||
//- rjf: unpack entity info
|
||||
DR_FancyStringList fstrs = {0};
|
||||
if(!rd_entity_is_nil(entity))
|
||||
{
|
||||
fstrs = rd_title_fstrs_from_entity(scratch.arena, entity, ui_top_palette()->text_weak, ui_top_font_size());
|
||||
}
|
||||
else if(ctrl_entity != &ctrl_entity_nil)
|
||||
{
|
||||
fstrs = rd_title_fstrs_from_ctrl_entity(scratch.arena, ctrl_entity, ui_top_palette()->text_weak, ui_top_font_size(), 1);
|
||||
}
|
||||
|
||||
//- rjf: build
|
||||
ui_set_next_hover_cursor(OS_Cursor_HandPoint);
|
||||
UI_Box *entity_box = &ui_nil_box;
|
||||
UI_FocusHot(entity_box_selected ? UI_FocusKind_On : UI_FocusKind_Off) UI_Palette(palette)
|
||||
@@ -2458,7 +2505,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
|
||||
UI_BoxFlag_DrawBackground|
|
||||
UI_BoxFlag_DrawHotEffects|
|
||||
UI_BoxFlag_DrawActiveEffects,
|
||||
"###entity_%p", entity);
|
||||
"###entity_%p_%p", entity, ctrl_entity);
|
||||
}
|
||||
{
|
||||
UI_Parent(entity_box)
|
||||
@@ -2467,7 +2514,6 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
|
||||
{
|
||||
next_row_expanded = !row_expanded;
|
||||
}
|
||||
DR_FancyStringList fstrs = rd_title_fstrs_from_entity(scratch.arena, entity, ui_top_palette()->text_weak, ui_top_font_size());
|
||||
UI_Box *title_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero());
|
||||
ui_box_equip_display_fancy_strings(title_box, &fstrs);
|
||||
UI_Signal sig = ui_signal_from_box(entity_box);
|
||||
@@ -2490,27 +2536,43 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
|
||||
for EachIndex(idx, row_ctrls_count)
|
||||
{
|
||||
RD_WatchViewRowCtrl *ctrl = &row_ctrls[idx];
|
||||
if(ctrl->entity_kind == entity->kind)
|
||||
if(ctrl->entity_kind == entity->kind &&
|
||||
ctrl->ctrl_entity_kind == ctrl_entity->kind)
|
||||
{
|
||||
UI_FocusHot(row_selected && selection_tbl.min.x <= ctrl_idx+1 && ctrl_idx+1 <= selection_tbl.max.x ? UI_FocusKind_On : UI_FocusKind_Off)
|
||||
{
|
||||
B32 is_frozen = ctrl_entity_tree_is_frozen(ctrl_entity);
|
||||
RD_IconKind icon_kind = rd_cmd_kind_info_table[ctrl->kind].icon_kind;
|
||||
UI_Palette *palette = ui_top_palette();
|
||||
if(ctrl->kind == RD_CmdKind_SelectEntity)
|
||||
{
|
||||
icon_kind = entity->disabled ? RD_IconKind_CheckHollow : RD_IconKind_CheckFilled;
|
||||
}
|
||||
UI_Signal sig = rd_icon_buttonf(icon_kind, 0, "###row_ctrl_%I64x", idx);
|
||||
if(ui_clicked(sig))
|
||||
if(ctrl->kind == RD_CmdKind_FreezeThread)
|
||||
{
|
||||
if(ctrl->kind == RD_CmdKind_SelectEntity)
|
||||
icon_kind = is_frozen ? RD_IconKind_Locked : RD_IconKind_Unlocked;
|
||||
palette = rd_palette_from_code(is_frozen ? RD_PaletteCode_NegativePopButton : RD_PaletteCode_PositivePopButton);
|
||||
}
|
||||
UI_Palette(palette)
|
||||
{
|
||||
UI_Signal sig = rd_icon_buttonf(icon_kind, 0, "###row_ctrl_%I64x", idx);
|
||||
if(ui_clicked(sig))
|
||||
{
|
||||
rd_cmd(sig.event_flags & OS_Modifier_Ctrl && entity->disabled ? RD_CmdKind_EnableEntity :
|
||||
sig.event_flags & OS_Modifier_Ctrl && !entity->disabled ? RD_CmdKind_DisableEntity :
|
||||
RD_CmdKind_SelectEntity, .entity = rd_handle_from_entity(entity));
|
||||
}
|
||||
else
|
||||
{
|
||||
rd_cmd(ctrl->kind, .entity = rd_handle_from_entity(entity));
|
||||
if(ctrl->kind == RD_CmdKind_SelectEntity)
|
||||
{
|
||||
rd_cmd(sig.event_flags & OS_Modifier_Ctrl && entity->disabled ? RD_CmdKind_EnableEntity :
|
||||
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_FreezeThread)
|
||||
{
|
||||
rd_cmd(is_frozen ? RD_CmdKind_ThawThread : RD_CmdKind_FreezeThread,
|
||||
.ctrl_entity = ctrl_entity->handle);
|
||||
}
|
||||
else
|
||||
{
|
||||
rd_cmd(ctrl->kind, .entity = rd_handle_from_entity(entity));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2519,45 +2581,6 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: build ctrl entity box
|
||||
if(ctrl_entity != &ctrl_entity_nil)
|
||||
{
|
||||
ui_set_next_hover_cursor(OS_Cursor_HandPoint);
|
||||
UI_Box *entity_box = &ui_nil_box;
|
||||
UI_FocusHot(entity_box_selected ? UI_FocusKind_On : UI_FocusKind_Off) UI_Palette(palette)
|
||||
{
|
||||
entity_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|
|
||||
UI_BoxFlag_DrawBorder|
|
||||
UI_BoxFlag_DrawBackground|
|
||||
UI_BoxFlag_DrawHotEffects|
|
||||
UI_BoxFlag_DrawActiveEffects,
|
||||
"###entity_%p", ctrl_entity);
|
||||
}
|
||||
{
|
||||
UI_Parent(entity_box)
|
||||
{
|
||||
// rjf: build expander, title
|
||||
UI_PrefWidth(ui_em(2.f, 1.f)) if(ui_pressed(ui_expander(row_expanded, str8_lit("###expanded"))))
|
||||
{
|
||||
next_row_expanded = !row_expanded;
|
||||
}
|
||||
DR_FancyStringList fstrs = rd_title_fstrs_from_ctrl_entity(scratch.arena, ctrl_entity, ui_top_palette()->text_weak, ui_top_font_size());
|
||||
UI_Box *title_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero());
|
||||
ui_box_equip_display_fancy_strings(title_box, &fstrs);
|
||||
UI_Signal sig = ui_signal_from_box(entity_box);
|
||||
if(ui_clicked(sig))
|
||||
{
|
||||
if(entity->kind == RD_EntityKind_Target)
|
||||
{
|
||||
rd_cmd(sig.event_flags & OS_Modifier_Ctrl && entity->disabled ? RD_CmdKind_EnableEntity :
|
||||
sig.event_flags & OS_Modifier_Ctrl && !entity->disabled ? RD_CmdKind_DisableEntity :
|
||||
RD_CmdKind_SelectEntity, .entity = rd_handle_from_entity(entity));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}break;
|
||||
|
||||
////////////////////
|
||||
@@ -6170,22 +6193,6 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(disasm)
|
||||
default: break;
|
||||
case RD_CmdKind_GoToAddress:
|
||||
{
|
||||
RD_Entity *process = &d_nil_entity;
|
||||
{
|
||||
RD_Entity *entity = rd_entity_from_handle(cmd->regs->entity);
|
||||
if(!rd_entity_is_nil(entity) &&
|
||||
(entity->kind == RD_EntityKind_Process ||
|
||||
entity->kind == RD_EntityKind_Thread ||
|
||||
entity->kind == RD_EntityKind_Module))
|
||||
{
|
||||
process = entity;
|
||||
if(entity->kind == RD_EntityKind_Thread ||
|
||||
entity->kind == RD_EntityKind_Module)
|
||||
{
|
||||
process = rd_entity_ancestor_from_kind(process, RD_EntityKind_Process);
|
||||
}
|
||||
}
|
||||
}
|
||||
dv->goto_vaddr = cmd->regs->vaddr;
|
||||
}break;
|
||||
case RD_CmdKind_ToggleCodeBytesVisibility: {dv->style_flags ^= DASM_StyleFlag_CodeBytes;}break;
|
||||
@@ -6204,13 +6211,16 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(disasm)
|
||||
//////////////////////////////
|
||||
//- rjf: do goto vaddr
|
||||
//
|
||||
if(!is_loading && has_disasm && dv->goto_vaddr != 0)
|
||||
if(!is_loading && has_disasm && dv->goto_vaddr != 0 && contains_1u64(range, dv->goto_vaddr))
|
||||
{
|
||||
U64 vaddr = dv->goto_vaddr;
|
||||
dv->goto_vaddr = 0;
|
||||
U64 line_idx = dasm_line_array_idx_from_code_off__linear_scan(&dasm_info.lines, vaddr-range.min);
|
||||
S64 line_num = (S64)(line_idx+1);
|
||||
cv->goto_line_num = line_num;
|
||||
if(line_idx < dasm_info.lines.count)
|
||||
{
|
||||
S64 line_num = (S64)(line_idx+1);
|
||||
dv->goto_vaddr = 0;
|
||||
cv->goto_line_num = line_num;
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////
|
||||
|
||||
@@ -97,6 +97,7 @@ typedef struct RD_WatchViewRowCtrl RD_WatchViewRowCtrl;
|
||||
struct RD_WatchViewRowCtrl
|
||||
{
|
||||
RD_EntityKind entity_kind;
|
||||
CTRL_EntityKind ctrl_entity_kind;
|
||||
RD_CmdKind kind;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user