diff options
author | Tom Tromey <tromey@adacore.com> | 2023-10-06 13:40:39 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2023-11-17 07:09:36 -0700 |
commit | 1920148904fe5ca0035c1addf2376f9ab13ffd3d (patch) | |
tree | 69a13a377af5b457744e81be80a2f82aeb5581b5 /gdb/testsuite/gdb.dap/stack-format.py | |
parent | 74affa1bc070ff0530b2a1b92d8d9fbcae6024ec (diff) | |
download | binutils-1920148904fe5ca0035c1addf2376f9ab13ffd3d.zip binutils-1920148904fe5ca0035c1addf2376f9ab13ffd3d.tar.gz binutils-1920148904fe5ca0035c1addf2376f9ab13ffd3d.tar.bz2 |
Handle StackFrameFormat in DAP
DAP specifies a StackFrameFormat object that can be used to change how
the "name" part of a stack frame is constructed. While this output
can already be done in a nicer way (and also letting the client choose
the formatting), nevertheless it is in the spec, so I figured I'd
implement it.
While implementing this, I discovered that the current code does not
correctly preserve frame IDs across requests. I rewrote frame
iteration to preserve this, and it turned out to be simpler to combine
these patches.
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30475
Diffstat (limited to 'gdb/testsuite/gdb.dap/stack-format.py')
-rw-r--r-- | gdb/testsuite/gdb.dap/stack-format.py | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.dap/stack-format.py b/gdb/testsuite/gdb.dap/stack-format.py new file mode 100644 index 0000000..b15cb8a --- /dev/null +++ b/gdb/testsuite/gdb.dap/stack-format.py @@ -0,0 +1,64 @@ +# Copyright (C) 2023 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + + +import gdb +import itertools + +from gdb.FrameDecorator import DAPFrameDecorator + + +class ElidingFrameDecorator(DAPFrameDecorator): + def __init__(self, frame, elided_frames): + super(ElidingFrameDecorator, self).__init__(frame) + self.elided_frames = elided_frames + + def elided(self): + return iter(self.elided_frames) + + +class ElidingIterator: + def __init__(self, ii): + self.input_iterator = ii + + def __iter__(self): + return self + + def __next__(self): + frame = next(self.input_iterator) + if str(frame.function()) != "function": + return frame + + # Elide the next three frames. + elided = [] + elided.append(next(self.input_iterator)) + elided.append(next(self.input_iterator)) + elided.append(next(self.input_iterator)) + + return ElidingFrameDecorator(frame, elided) + + +class FrameElider: + def __init__(self): + self.name = "Elider" + self.priority = 900 + self.enabled = True + gdb.frame_filters[self.name] = self + + def filter(self, frame_iter): + return ElidingIterator(frame_iter) + + +FrameElider() |