Skip to content

Commit 13b37ab

Browse files
committed
Center the selected frame in the Stack module when possible
Closes #286 as it provides a better solution.
1 parent 396ac41 commit 13b37ab

File tree

1 file changed

+47
-36
lines changed

1 file changed

+47
-36
lines changed

.gdbinit

Lines changed: 47 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1647,46 +1647,44 @@ Optionally list the frame arguments and locals too.'''
16471647
# skip if the current thread is not stopped
16481648
if not gdb.selected_thread().is_stopped():
16491649
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
16611651
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
16851658
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
16861682
# format the output
16871683
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))
16901688
# add the placeholder
16911689
if more:
16921690
lines.append('[{}]'.format(ansi('+', R.style_selected_2)))
@@ -1729,6 +1727,19 @@ Optionally list the frame arguments and locals too.'''
17291727
}
17301728
}
17311729

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+
17321743
@staticmethod
17331744
def format_line(prefix, line):
17341745
prefix = ansi(prefix, R.style_low)

0 commit comments

Comments
 (0)