]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/python/lib/gdb/function/caller_is.py
update copyright year range in GDB files
[thirdparty/binutils-gdb.git] / gdb / python / lib / gdb / function / caller_is.py
1 # Caller-is functions.
2 # Copyright (C) 2008-2017 Free Software Foundation, Inc.
3
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 3 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
17 import gdb
18 import re
19
20 class CallerIs(gdb.Function):
21 """Check the calling function's name.
22
23 Usage:
24 $_caller_is(name [, number_of_frames])
25
26 Arguments:
27
28 name: The name of the function to search for.
29
30 number_of_frames: How many stack frames to traverse back from the currently
31 selected frame to compare with. If the value is greater than the depth of
32 the stack from that point then the result is False.
33 The default is 1.
34
35 Returns:
36 True if the function's name at the specified frame is equal to name.
37 """
38
39 def __init__(self):
40 super(CallerIs, self).__init__("_caller_is")
41
42 def invoke(self, name, nframes = 1):
43 if nframes < 0:
44 raise ValueError("nframes must be >= 0")
45 frame = gdb.selected_frame()
46 while nframes > 0:
47 frame = frame.older()
48 if frame is None:
49 return False
50 nframes = nframes - 1
51 return frame.name() == name.string()
52
53 class CallerMatches(gdb.Function):
54 """Compare the calling function's name with a regexp.
55
56 Usage:
57 $_caller_matches(regex [, number_of_frames])
58
59 Arguments:
60
61 regex: The regular expression to compare the function's name with.
62
63 number_of_frames: How many stack frames to traverse back from the currently
64 selected frame to compare with. If the value is greater than the depth of
65 the stack from that point then the result is False.
66 The default is 1.
67
68 Returns:
69 True if the function's name at the specified frame matches regex.
70 """
71
72 def __init__(self):
73 super(CallerMatches, self).__init__("_caller_matches")
74
75 def invoke(self, name, nframes = 1):
76 if nframes < 0:
77 raise ValueError("nframes must be >= 0")
78 frame = gdb.selected_frame()
79 while nframes > 0:
80 frame = frame.older()
81 if frame is None:
82 return False
83 nframes = nframes - 1
84 return re.match(name.string(), frame.name()) is not None
85
86 class AnyCallerIs(gdb.Function):
87 """Check all calling function's names.
88
89 Usage:
90 $_any_caller_is(name [, number_of_frames])
91
92 Arguments:
93
94 name: The name of the function to search for.
95
96 number_of_frames: How many stack frames to traverse back from the currently
97 selected frame to compare with. If the value is greater than the depth of
98 the stack from that point then the result is False.
99 The default is 1.
100
101 Returns:
102 True if any function's name is equal to name.
103 """
104
105 def __init__(self):
106 super(AnyCallerIs, self).__init__("_any_caller_is")
107
108 def invoke(self, name, nframes = 1):
109 if nframes < 0:
110 raise ValueError("nframes must be >= 0")
111 frame = gdb.selected_frame()
112 while nframes >= 0:
113 if frame.name() == name.string():
114 return True
115 frame = frame.older()
116 if frame is None:
117 return False
118 nframes = nframes - 1
119 return False
120
121 class AnyCallerMatches(gdb.Function):
122 """Compare all calling function's names with a regexp.
123
124 Usage:
125 $_any_caller_matches(regex [, number_of_frames])
126
127 Arguments:
128
129 regex: The regular expression to compare the function's name with.
130
131 number_of_frames: How many stack frames to traverse back from the currently
132 selected frame to compare with. If the value is greater than the depth of
133 the stack from that point then the result is False.
134 The default is 1.
135
136 Returns:
137 True if any function's name matches regex.
138 """
139
140 def __init__(self):
141 super(AnyCallerMatches, self).__init__("_any_caller_matches")
142
143 def invoke(self, name, nframes = 1):
144 if nframes < 0:
145 raise ValueError("nframes must be >= 0")
146 frame = gdb.selected_frame()
147 name_re = re.compile(name.string())
148 while nframes >= 0:
149 if name_re.match(frame.name()) is not None:
150 return True
151 frame = frame.older()
152 if frame is None:
153 return False
154 nframes = nframes - 1
155 return False
156
157 CallerIs()
158 CallerMatches()
159 AnyCallerIs()
160 AnyCallerMatches()