diff options
Diffstat (limited to 'share/gdb/python/gdb/function/caller_is.py')
-rw-r--r-- | share/gdb/python/gdb/function/caller_is.py | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/share/gdb/python/gdb/function/caller_is.py b/share/gdb/python/gdb/function/caller_is.py new file mode 100644 index 0000000..7a7be9d --- /dev/null +++ b/share/gdb/python/gdb/function/caller_is.py @@ -0,0 +1,160 @@ +# Caller-is functions. +# Copyright (C) 2008-2015 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 re + +class CallerIs(gdb.Function): + """Check the calling function's name. + +Usage: + $_caller_is(name [, number_of_frames]) + +Arguments: + + name: The name of the function to search for. + + number_of_frames: How many stack frames to traverse back from the currently + selected frame to compare with. If the value is greater than the depth of + the stack from that point then the result is False. + The default is 1. + +Returns: + True if the function's name at the specified frame is equal to name. +""" + + def __init__(self): + super(CallerIs, self).__init__("_caller_is") + + def invoke(self, name, nframes = 1): + if nframes < 0: + raise ValueError("nframes must be >= 0") + frame = gdb.selected_frame() + while nframes > 0: + frame = frame.older() + if frame is None: + return False + nframes = nframes - 1 + return frame.name() == name.string() + +class CallerMatches(gdb.Function): + """Compare the calling function's name with a regexp. + +Usage: + $_caller_matches(regex [, number_of_frames]) + +Arguments: + + regex: The regular expression to compare the function's name with. + + number_of_frames: How many stack frames to traverse back from the currently + selected frame to compare with. If the value is greater than the depth of + the stack from that point then the result is False. + The default is 1. + +Returns: + True if the function's name at the specified frame matches regex. +""" + + def __init__(self): + super(CallerMatches, self).__init__("_caller_matches") + + def invoke(self, name, nframes = 1): + if nframes < 0: + raise ValueError("nframes must be >= 0") + frame = gdb.selected_frame() + while nframes > 0: + frame = frame.older() + if frame is None: + return False + nframes = nframes - 1 + return re.match(name.string(), frame.name()) is not None + +class AnyCallerIs(gdb.Function): + """Check all calling function's names. + +Usage: + $_any_caller_is(name [, number_of_frames]) + +Arguments: + + name: The name of the function to search for. + + number_of_frames: How many stack frames to traverse back from the currently + selected frame to compare with. If the value is greater than the depth of + the stack from that point then the result is False. + The default is 1. + +Returns: + True if any function's name is equal to name. +""" + + def __init__(self): + super(AnyCallerIs, self).__init__("_any_caller_is") + + def invoke(self, name, nframes = 1): + if nframes < 0: + raise ValueError("nframes must be >= 0") + frame = gdb.selected_frame() + while nframes >= 0: + if frame.name() == name.string(): + return True + frame = frame.older() + if frame is None: + return False + nframes = nframes - 1 + return False + +class AnyCallerMatches(gdb.Function): + """Compare all calling function's names with a regexp. + +Usage: + $_any_caller_matches(regex [, number_of_frames]) + +Arguments: + + regex: The regular expression to compare the function's name with. + + number_of_frames: How many stack frames to traverse back from the currently + selected frame to compare with. If the value is greater than the depth of + the stack from that point then the result is False. + The default is 1. + +Returns: + True if any function's name matches regex. +""" + + def __init__(self): + super(AnyCallerMatches, self).__init__("_any_caller_matches") + + def invoke(self, name, nframes = 1): + if nframes < 0: + raise ValueError("nframes must be >= 0") + frame = gdb.selected_frame() + name_re = re.compile(name.string()) + while nframes >= 0: + if name_re.match(frame.name()) is not None: + return True + frame = frame.older() + if frame is None: + return False + nframes = nframes - 1 + return False + +CallerIs() +CallerMatches() +AnyCallerIs() +AnyCallerMatches() |