1+ use std:: collections:: HashMap ;
2+
13use ratatui:: prelude:: Stylize ;
24use ratatui:: text:: { Line , Span , Text } ;
35use ratatui:: widgets:: { Block , Borders , Paragraph } ;
@@ -14,6 +16,20 @@ pub fn draw_stack(state: &mut State, f: &mut Frame, stack: Rect) {
1416 let width: usize = if state. ptr_size == PtrSize :: Size32 { 11 } else { 19 } ;
1517
1618 let stacks = state. stack . clone ( ) ;
19+
20+ // Build map of address -> register names
21+ let mut addr_to_regs: HashMap < u64 , Vec < String > > = HashMap :: new ( ) ;
22+ for reg in & state. registers {
23+ if let Some ( ref register) = reg. register
24+ && let Some ( ref val_str) = register. value
25+ && let Some ( hex) = val_str. strip_prefix ( "0x" )
26+ && let Ok ( val) = u64:: from_str_radix ( hex, 16 )
27+ && stacks. contains_key ( & val)
28+ {
29+ addr_to_regs. entry ( val) . or_default ( ) . push ( reg. name . clone ( ) ) ;
30+ }
31+ }
32+
1733 for ( addr, values) in & stacks {
1834 let filepath = state. filepath . clone ( ) . unwrap_or_default ( ) ;
1935 let filepath = filepath. to_string_lossy ( ) ;
@@ -24,6 +40,10 @@ pub fn draw_stack(state: &mut State, f: &mut Frame, stack: Rect) {
2440 let span = Span :: from ( format ! ( " {hex_string}{:padding$}" , "" , padding = padding_width) )
2541 . style ( Style :: new ( ) . fg ( PURPLE ) ) ;
2642 let mut spans = vec ! [ span] ;
43+ if let Some ( reg_names) = addr_to_regs. get ( addr) {
44+ let annotation = format ! ( " ({})" , reg_names. join( ", " ) ) ;
45+ spans. push ( Span :: from ( annotation) . style ( Style :: new ( ) . fg ( ORANGE ) ) ) ;
46+ }
2747 add_deref_to_span ( values, & mut spans, state, & filepath, & mut longest_cells, width) ;
2848 let line = Line :: from ( spans) ;
2949 lines. push ( line) ;
0 commit comments