diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index eaab6fcc..00f38832 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -207,6 +207,7 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla code_slice_params.line_pins = push_array(scratch.arena, RD_CfgList, visible_line_count); code_slice_params.line_vaddrs = push_array(scratch.arena, U64, visible_line_count); code_slice_params.line_infos = push_array(scratch.arena, D_LineList, visible_line_count); + code_slice_params.text_info = text_info; code_slice_params.font = code_font; code_slice_params.font_size = code_font_size; code_slice_params.tab_size = code_tab_size; diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 29ad0885..f4e7b521 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -2113,6 +2113,15 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe result.base = text_container_sig; } + ////////////////////////////// + //- rjf: cursor -> scope info + // + TXT_ScopeNode *cursor_scope_node = &txt_scope_node_nil; + if(params->text_info != 0) + { + cursor_scope_node = txt_scope_node_from_info_pt(params->text_info, rd_regs()->cursor); + } + ////////////////////////////// //- rjf: produce fancy strings for each line // @@ -2170,6 +2179,19 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe token_color = mix_4f32(token_color, lookup_color, lookup_color_mix_t); } + // rjf: scope endpoints enclosing cursor -> highlight + for(TXT_ScopeNode *scope_n = cursor_scope_node; + scope_n != &txt_scope_node_nil; + scope_n = txt_scope_node_from_info_num(params->text_info, scope_n->parent_num)) + { + if(params->text_info->tokens.v[scope_n->token_idx_range.min].range.min == token->range.min || + params->text_info->tokens.v[scope_n->token_idx_range.max].range.min == token->range.min) + { + token_color = pop_color; + break; + } + } + // rjf: push fancy string dr_fstrs_push_new(scratch.arena, &fstrs, &fstr_params, token_string, .color = token_color); } diff --git a/src/raddbg/raddbg_widgets.h b/src/raddbg/raddbg_widgets.h index 54d638c8..afdf4bee 100644 --- a/src/raddbg/raddbg_widgets.h +++ b/src/raddbg/raddbg_widgets.h @@ -105,6 +105,7 @@ struct RD_CodeSliceParams U64 *line_vaddrs; D_LineList *line_infos; DI_KeyList relevant_dbgi_keys; + TXT_TextInfo *text_info; // rjf: visual parameters FNT_Tag font; diff --git a/src/text_cache/text_cache.c b/src/text_cache/text_cache.c index b30cd406..b76ccafa 100644 --- a/src/text_cache/text_cache.c +++ b/src/text_cache/text_cache.c @@ -2098,7 +2098,7 @@ txt_scope_node_from_info_num(TXT_TextInfo *info, U64 num) } internal TXT_ScopeNode * -txt_scope_node_from_info_data_off(TXT_TextInfo *info, U64 off) +txt_scope_node_from_info_off(TXT_TextInfo *info, U64 off) { TXT_ScopeNode *result = &txt_scope_node_nil; { @@ -2106,7 +2106,7 @@ txt_scope_node_from_info_data_off(TXT_TextInfo *info, U64 off) U64 opl = info->scope_pts.count; for(;;) { - U64 mid = (opl - first) / 2; + U64 mid = first + (opl - first) / 2; if(mid >= info->scope_pts.count) { break; } U64 mid_off = info->tokens.v[info->scope_pts.v[mid].token_idx].range.min; if(off == mid_off || (first == mid && opl == mid+1)) @@ -2128,10 +2128,10 @@ txt_scope_node_from_info_data_off(TXT_TextInfo *info, U64 off) } internal TXT_ScopeNode * -txt_scope_node_from_info_data_pt(TXT_TextInfo *info, TxtPt pt) +txt_scope_node_from_info_pt(TXT_TextInfo *info, TxtPt pt) { U64 off = txt_off_from_info_pt(info, pt); - TXT_ScopeNode *result = txt_scope_node_from_info_data_off(info, off); + TXT_ScopeNode *result = txt_scope_node_from_info_off(info, off); return result; } diff --git a/src/text_cache/text_cache.h b/src/text_cache/text_cache.h index b20f2fc0..f7f062f8 100644 --- a/src/text_cache/text_cache.h +++ b/src/text_cache/text_cache.h @@ -322,8 +322,8 @@ internal String8 txt_string_from_info_data_txt_rng(TXT_TextInfo *info, String8 d internal String8 txt_string_from_info_data_line_num(TXT_TextInfo *info, String8 data, S64 line_num); internal TXT_LineTokensSlice txt_line_tokens_slice_from_info_data_line_range(Arena *arena, TXT_TextInfo *info, String8 data, Rng1S64 line_range); internal TXT_ScopeNode *txt_scope_node_from_info_num(TXT_TextInfo *info, U64 num); -internal TXT_ScopeNode *txt_scope_node_from_info_data_off(TXT_TextInfo *info, U64 off); -internal TXT_ScopeNode *txt_scope_node_from_info_data_pt(TXT_TextInfo *info, TxtPt pt); +internal TXT_ScopeNode *txt_scope_node_from_info_off(TXT_TextInfo *info, U64 off); +internal TXT_ScopeNode *txt_scope_node_from_info_pt(TXT_TextInfo *info, TxtPt pt); //////////////////////////////// //~ rjf: Parse Threads