@@ -1647,46 +1647,44 @@ Optionally list the frame arguments and locals too.'''
1647
1647
# skip if the current thread is not stopped
1648
1648
if not gdb .selected_thread ().is_stopped ():
1649
1649
return []
1650
- # find the selected frame (i.e., the first to display)
1651
- selected_index = 0
1652
- frame = gdb .newest_frame ()
1653
- while frame :
1654
- if frame == gdb .selected_frame ():
1655
- break
1656
- frame = frame .older ()
1657
- selected_index += 1
1658
- # format up to "limit" frames
1659
- frames = []
1660
- number = selected_index
1650
+ # gather the frames
1661
1651
more = False
1662
- while frame :
1663
- # the first is the selected one
1664
- selected = (len (frames ) == 0 )
1665
- # fetch frame info
1666
- style = R .style_selected_1 if selected else R .style_selected_2
1667
- frame_id = ansi (str (number ), style )
1668
- info = Stack .get_pc_line (frame , style )
1669
- frame_lines = []
1670
- frame_lines .append ('[{}] {}' .format (frame_id , info ))
1671
- # add frame arguments and locals
1672
- variables = Variables .format_frame (
1673
- frame , self .show_arguments , self .show_locals , self .compact , self .align , self .sort )
1674
- frame_lines .extend (variables )
1675
- # add frame
1676
- frames .append (frame_lines )
1677
- # next
1678
- frame = frame .older ()
1679
- number += 1
1680
- # check finished according to the limit
1681
- if self .limit and len (frames ) == self .limit :
1682
- # more frames to show but limited
1683
- if frame :
1684
- more = True
1652
+ frames = [gdb .selected_frame ()]
1653
+ going_down = True
1654
+ while True :
1655
+ # stack frames limit reached
1656
+ if len (frames ) == self .limit :
1657
+ more = True
1685
1658
break
1659
+ # zigzag the frames starting from the selected one
1660
+ if going_down :
1661
+ frame = frames [- 1 ].older ()
1662
+ if frame :
1663
+ frames .append (frame )
1664
+ else :
1665
+ frame = frames [0 ].newer ()
1666
+ if frame :
1667
+ frames .insert (0 , frame )
1668
+ else :
1669
+ break
1670
+ else :
1671
+ frame = frames [0 ].newer ()
1672
+ if frame :
1673
+ frames .insert (0 , frame )
1674
+ else :
1675
+ frame = frames [- 1 ].older ()
1676
+ if frame :
1677
+ frames .append (frame )
1678
+ else :
1679
+ break
1680
+ # switch direction
1681
+ going_down = not going_down
1686
1682
# format the output
1687
1683
lines = []
1688
- for frame_lines in frames :
1689
- lines .extend (frame_lines )
1684
+ for frame in frames :
1685
+ number = frame .level ()
1686
+ selected = frame == gdb .selected_frame ()
1687
+ lines .extend (self .get_frame_lines (number , frame , selected ))
1690
1688
# add the placeholder
1691
1689
if more :
1692
1690
lines .append ('[{}]' .format (ansi ('+' , R .style_selected_2 )))
@@ -1729,6 +1727,19 @@ Optionally list the frame arguments and locals too.'''
1729
1727
}
1730
1728
}
1731
1729
1730
+ def get_frame_lines (self , number , frame , selected = False ):
1731
+ # fetch frame info
1732
+ style = R .style_selected_1 if selected else R .style_selected_2
1733
+ frame_id = ansi (str (number ), style )
1734
+ info = Stack .get_pc_line (frame , style )
1735
+ frame_lines = []
1736
+ frame_lines .append ('[{}] {}' .format (frame_id , info ))
1737
+ # add frame arguments and locals
1738
+ variables = Variables .format_frame (
1739
+ frame , self .show_arguments , self .show_locals , self .compact , self .align , self .sort )
1740
+ frame_lines .extend (variables )
1741
+ return frame_lines
1742
+
1732
1743
@staticmethod
1733
1744
def format_line (prefix , line ):
1734
1745
prefix = ansi (prefix , R .style_low )
0 commit comments