py-frame.c revision 1.7 1 1.1 christos /* Python interface to stack frames
2 1.1 christos
3 1.7 christos Copyright (C) 2008-2017 Free Software Foundation, Inc.
4 1.1 christos
5 1.1 christos This file is part of GDB.
6 1.1 christos
7 1.1 christos This program is free software; you can redistribute it and/or modify
8 1.1 christos it under the terms of the GNU General Public License as published by
9 1.1 christos the Free Software Foundation; either version 3 of the License, or
10 1.1 christos (at your option) any later version.
11 1.1 christos
12 1.1 christos This program is distributed in the hope that it will be useful,
13 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 christos GNU General Public License for more details.
16 1.1 christos
17 1.1 christos You should have received a copy of the GNU General Public License
18 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 1.1 christos
20 1.1 christos #include "defs.h"
21 1.1 christos #include "charset.h"
22 1.1 christos #include "block.h"
23 1.1 christos #include "frame.h"
24 1.1 christos #include "symtab.h"
25 1.1 christos #include "stack.h"
26 1.1 christos #include "value.h"
27 1.1 christos #include "python-internal.h"
28 1.1 christos #include "symfile.h"
29 1.1 christos #include "objfiles.h"
30 1.3 christos #include "user-regs.h"
31 1.7 christos #include "py-ref.h"
32 1.1 christos
33 1.1 christos typedef struct {
34 1.1 christos PyObject_HEAD
35 1.1 christos struct frame_id frame_id;
36 1.1 christos struct gdbarch *gdbarch;
37 1.1 christos
38 1.1 christos /* Marks that the FRAME_ID member actually holds the ID of the frame next
39 1.1 christos to this, and not this frames' ID itself. This is a hack to permit Python
40 1.1 christos frame objects which represent invalid frames (i.e., the last frame_info
41 1.1 christos in a corrupt stack). The problem arises from the fact that this code
42 1.1 christos relies on FRAME_ID to uniquely identify a frame, which is not always true
43 1.1 christos for the last "frame" in a corrupt stack (it can have a null ID, or the same
44 1.1 christos ID as the previous frame). Whenever get_prev_frame returns NULL, we
45 1.1 christos record the frame_id of the next frame and set FRAME_ID_IS_NEXT to 1. */
46 1.1 christos int frame_id_is_next;
47 1.1 christos } frame_object;
48 1.1 christos
49 1.1 christos /* Require a valid frame. This must be called inside a TRY_CATCH, or
50 1.1 christos another context in which a gdb exception is allowed. */
51 1.1 christos #define FRAPY_REQUIRE_VALID(frame_obj, frame) \
52 1.1 christos do { \
53 1.1 christos frame = frame_object_to_frame_info (frame_obj); \
54 1.1 christos if (frame == NULL) \
55 1.1 christos error (_("Frame is invalid.")); \
56 1.1 christos } while (0)
57 1.1 christos
58 1.1 christos /* Returns the frame_info object corresponding to the given Python Frame
59 1.1 christos object. If the frame doesn't exist anymore (the frame id doesn't
60 1.1 christos correspond to any frame in the inferior), returns NULL. */
61 1.1 christos
62 1.1 christos struct frame_info *
63 1.1 christos frame_object_to_frame_info (PyObject *obj)
64 1.1 christos {
65 1.1 christos frame_object *frame_obj = (frame_object *) obj;
66 1.1 christos struct frame_info *frame;
67 1.1 christos
68 1.1 christos frame = frame_find_by_id (frame_obj->frame_id);
69 1.1 christos if (frame == NULL)
70 1.1 christos return NULL;
71 1.1 christos
72 1.1 christos if (frame_obj->frame_id_is_next)
73 1.1 christos frame = get_prev_frame (frame);
74 1.1 christos
75 1.1 christos return frame;
76 1.1 christos }
77 1.1 christos
78 1.1 christos /* Called by the Python interpreter to obtain string representation
79 1.1 christos of the object. */
80 1.1 christos
81 1.1 christos static PyObject *
82 1.1 christos frapy_str (PyObject *self)
83 1.1 christos {
84 1.7 christos string_file strfile;
85 1.1 christos
86 1.7 christos fprint_frame_id (&strfile, ((frame_object *) self)->frame_id);
87 1.7 christos return PyString_FromString (strfile.c_str ());
88 1.1 christos }
89 1.1 christos
90 1.1 christos /* Implementation of gdb.Frame.is_valid (self) -> Boolean.
91 1.1 christos Returns True if the frame corresponding to the frame_id of this
92 1.1 christos object still exists in the inferior. */
93 1.1 christos
94 1.1 christos static PyObject *
95 1.1 christos frapy_is_valid (PyObject *self, PyObject *args)
96 1.1 christos {
97 1.1 christos struct frame_info *frame = NULL;
98 1.1 christos
99 1.5 christos TRY
100 1.1 christos {
101 1.1 christos frame = frame_object_to_frame_info (self);
102 1.1 christos }
103 1.5 christos CATCH (except, RETURN_MASK_ALL)
104 1.5 christos {
105 1.5 christos GDB_PY_HANDLE_EXCEPTION (except);
106 1.5 christos }
107 1.5 christos END_CATCH
108 1.1 christos
109 1.1 christos if (frame == NULL)
110 1.1 christos Py_RETURN_FALSE;
111 1.1 christos
112 1.1 christos Py_RETURN_TRUE;
113 1.1 christos }
114 1.1 christos
115 1.1 christos /* Implementation of gdb.Frame.name (self) -> String.
116 1.1 christos Returns the name of the function corresponding to this frame. */
117 1.1 christos
118 1.1 christos static PyObject *
119 1.1 christos frapy_name (PyObject *self, PyObject *args)
120 1.1 christos {
121 1.1 christos struct frame_info *frame;
122 1.1 christos char *name = NULL;
123 1.1 christos enum language lang;
124 1.1 christos PyObject *result;
125 1.1 christos
126 1.5 christos TRY
127 1.1 christos {
128 1.1 christos FRAPY_REQUIRE_VALID (self, frame);
129 1.1 christos
130 1.1 christos find_frame_funname (frame, &name, &lang, NULL);
131 1.1 christos }
132 1.5 christos CATCH (except, RETURN_MASK_ALL)
133 1.5 christos {
134 1.5 christos xfree (name);
135 1.5 christos GDB_PY_HANDLE_EXCEPTION (except);
136 1.5 christos }
137 1.5 christos END_CATCH
138 1.1 christos
139 1.1 christos if (name)
140 1.1 christos {
141 1.1 christos result = PyUnicode_Decode (name, strlen (name), host_charset (), NULL);
142 1.1 christos xfree (name);
143 1.1 christos }
144 1.1 christos else
145 1.1 christos {
146 1.1 christos result = Py_None;
147 1.1 christos Py_INCREF (Py_None);
148 1.1 christos }
149 1.1 christos
150 1.1 christos return result;
151 1.1 christos }
152 1.1 christos
153 1.1 christos /* Implementation of gdb.Frame.type (self) -> Integer.
154 1.1 christos Returns the frame type, namely one of the gdb.*_FRAME constants. */
155 1.1 christos
156 1.1 christos static PyObject *
157 1.1 christos frapy_type (PyObject *self, PyObject *args)
158 1.1 christos {
159 1.1 christos struct frame_info *frame;
160 1.1 christos enum frame_type type = NORMAL_FRAME;/* Initialize to appease gcc warning. */
161 1.1 christos
162 1.5 christos TRY
163 1.1 christos {
164 1.1 christos FRAPY_REQUIRE_VALID (self, frame);
165 1.1 christos
166 1.1 christos type = get_frame_type (frame);
167 1.1 christos }
168 1.5 christos CATCH (except, RETURN_MASK_ALL)
169 1.5 christos {
170 1.5 christos GDB_PY_HANDLE_EXCEPTION (except);
171 1.5 christos }
172 1.5 christos END_CATCH
173 1.1 christos
174 1.1 christos return PyInt_FromLong (type);
175 1.1 christos }
176 1.1 christos
177 1.1 christos /* Implementation of gdb.Frame.architecture (self) -> gdb.Architecture.
178 1.1 christos Returns the frame's architecture as a gdb.Architecture object. */
179 1.1 christos
180 1.1 christos static PyObject *
181 1.1 christos frapy_arch (PyObject *self, PyObject *args)
182 1.1 christos {
183 1.1 christos struct frame_info *frame = NULL; /* Initialize to appease gcc warning. */
184 1.1 christos frame_object *obj = (frame_object *) self;
185 1.1 christos
186 1.5 christos TRY
187 1.1 christos {
188 1.1 christos FRAPY_REQUIRE_VALID (self, frame);
189 1.1 christos }
190 1.5 christos CATCH (except, RETURN_MASK_ALL)
191 1.5 christos {
192 1.5 christos GDB_PY_HANDLE_EXCEPTION (except);
193 1.5 christos }
194 1.5 christos END_CATCH
195 1.1 christos
196 1.1 christos return gdbarch_to_arch_object (obj->gdbarch);
197 1.1 christos }
198 1.1 christos
199 1.1 christos /* Implementation of gdb.Frame.unwind_stop_reason (self) -> Integer.
200 1.1 christos Returns one of the gdb.FRAME_UNWIND_* constants. */
201 1.1 christos
202 1.1 christos static PyObject *
203 1.1 christos frapy_unwind_stop_reason (PyObject *self, PyObject *args)
204 1.1 christos {
205 1.1 christos struct frame_info *frame = NULL; /* Initialize to appease gcc warning. */
206 1.1 christos enum unwind_stop_reason stop_reason;
207 1.1 christos
208 1.5 christos TRY
209 1.1 christos {
210 1.1 christos FRAPY_REQUIRE_VALID (self, frame);
211 1.1 christos }
212 1.5 christos CATCH (except, RETURN_MASK_ALL)
213 1.5 christos {
214 1.5 christos GDB_PY_HANDLE_EXCEPTION (except);
215 1.5 christos }
216 1.5 christos END_CATCH
217 1.1 christos
218 1.1 christos stop_reason = get_frame_unwind_stop_reason (frame);
219 1.1 christos
220 1.1 christos return PyInt_FromLong (stop_reason);
221 1.1 christos }
222 1.1 christos
223 1.1 christos /* Implementation of gdb.Frame.pc (self) -> Long.
224 1.1 christos Returns the frame's resume address. */
225 1.1 christos
226 1.1 christos static PyObject *
227 1.1 christos frapy_pc (PyObject *self, PyObject *args)
228 1.1 christos {
229 1.1 christos CORE_ADDR pc = 0; /* Initialize to appease gcc warning. */
230 1.1 christos struct frame_info *frame;
231 1.1 christos
232 1.5 christos TRY
233 1.1 christos {
234 1.1 christos FRAPY_REQUIRE_VALID (self, frame);
235 1.1 christos
236 1.1 christos pc = get_frame_pc (frame);
237 1.1 christos }
238 1.5 christos CATCH (except, RETURN_MASK_ALL)
239 1.5 christos {
240 1.5 christos GDB_PY_HANDLE_EXCEPTION (except);
241 1.5 christos }
242 1.5 christos END_CATCH
243 1.1 christos
244 1.1 christos return gdb_py_long_from_ulongest (pc);
245 1.1 christos }
246 1.1 christos
247 1.3 christos /* Implementation of gdb.Frame.read_register (self, register) -> gdb.Value.
248 1.3 christos Returns the value of a register in this frame. */
249 1.3 christos
250 1.3 christos static PyObject *
251 1.3 christos frapy_read_register (PyObject *self, PyObject *args)
252 1.3 christos {
253 1.3 christos const char *regnum_str;
254 1.3 christos struct value *val = NULL;
255 1.3 christos
256 1.3 christos if (!PyArg_ParseTuple (args, "s", ®num_str))
257 1.3 christos return NULL;
258 1.3 christos
259 1.5 christos TRY
260 1.3 christos {
261 1.3 christos struct frame_info *frame;
262 1.3 christos int regnum;
263 1.3 christos
264 1.3 christos FRAPY_REQUIRE_VALID (self, frame);
265 1.3 christos
266 1.3 christos regnum = user_reg_map_name_to_regnum (get_frame_arch (frame),
267 1.3 christos regnum_str,
268 1.3 christos strlen (regnum_str));
269 1.3 christos if (regnum >= 0)
270 1.3 christos val = value_of_register (regnum, frame);
271 1.3 christos
272 1.3 christos if (val == NULL)
273 1.3 christos PyErr_SetString (PyExc_ValueError, _("Unknown register."));
274 1.3 christos }
275 1.5 christos CATCH (except, RETURN_MASK_ALL)
276 1.5 christos {
277 1.5 christos GDB_PY_HANDLE_EXCEPTION (except);
278 1.5 christos }
279 1.5 christos END_CATCH
280 1.3 christos
281 1.3 christos return val == NULL ? NULL : value_to_value_object (val);
282 1.3 christos }
283 1.3 christos
284 1.1 christos /* Implementation of gdb.Frame.block (self) -> gdb.Block.
285 1.1 christos Returns the frame's code block. */
286 1.1 christos
287 1.1 christos static PyObject *
288 1.1 christos frapy_block (PyObject *self, PyObject *args)
289 1.1 christos {
290 1.1 christos struct frame_info *frame;
291 1.3 christos const struct block *block = NULL, *fn_block;
292 1.1 christos
293 1.5 christos TRY
294 1.1 christos {
295 1.1 christos FRAPY_REQUIRE_VALID (self, frame);
296 1.1 christos block = get_frame_block (frame, NULL);
297 1.1 christos }
298 1.5 christos CATCH (except, RETURN_MASK_ALL)
299 1.5 christos {
300 1.5 christos GDB_PY_HANDLE_EXCEPTION (except);
301 1.5 christos }
302 1.5 christos END_CATCH
303 1.1 christos
304 1.1 christos for (fn_block = block;
305 1.1 christos fn_block != NULL && BLOCK_FUNCTION (fn_block) == NULL;
306 1.1 christos fn_block = BLOCK_SUPERBLOCK (fn_block))
307 1.1 christos ;
308 1.1 christos
309 1.1 christos if (block == NULL || fn_block == NULL || BLOCK_FUNCTION (fn_block) == NULL)
310 1.1 christos {
311 1.1 christos PyErr_SetString (PyExc_RuntimeError,
312 1.1 christos _("Cannot locate block for frame."));
313 1.1 christos return NULL;
314 1.1 christos }
315 1.1 christos
316 1.1 christos if (block)
317 1.1 christos {
318 1.3 christos return block_to_block_object
319 1.3 christos (block, symbol_objfile (BLOCK_FUNCTION (fn_block)));
320 1.1 christos }
321 1.1 christos
322 1.1 christos Py_RETURN_NONE;
323 1.1 christos }
324 1.1 christos
325 1.1 christos
326 1.1 christos /* Implementation of gdb.Frame.function (self) -> gdb.Symbol.
327 1.1 christos Returns the symbol for the function corresponding to this frame. */
328 1.1 christos
329 1.1 christos static PyObject *
330 1.1 christos frapy_function (PyObject *self, PyObject *args)
331 1.1 christos {
332 1.1 christos struct symbol *sym = NULL;
333 1.1 christos struct frame_info *frame;
334 1.1 christos
335 1.5 christos TRY
336 1.1 christos {
337 1.6 christos char *funname;
338 1.6 christos enum language funlang;
339 1.6 christos
340 1.1 christos FRAPY_REQUIRE_VALID (self, frame);
341 1.1 christos
342 1.6 christos find_frame_funname (frame, &funname, &funlang, &sym);
343 1.6 christos xfree (funname);
344 1.1 christos }
345 1.5 christos CATCH (except, RETURN_MASK_ALL)
346 1.5 christos {
347 1.5 christos GDB_PY_HANDLE_EXCEPTION (except);
348 1.5 christos }
349 1.5 christos END_CATCH
350 1.1 christos
351 1.1 christos if (sym)
352 1.1 christos return symbol_to_symbol_object (sym);
353 1.1 christos
354 1.1 christos Py_RETURN_NONE;
355 1.1 christos }
356 1.1 christos
357 1.1 christos /* Convert a frame_info struct to a Python Frame object.
358 1.1 christos Sets a Python exception and returns NULL on error. */
359 1.1 christos
360 1.1 christos PyObject *
361 1.1 christos frame_info_to_frame_object (struct frame_info *frame)
362 1.1 christos {
363 1.7 christos gdbpy_ref<frame_object> frame_obj (PyObject_New (frame_object,
364 1.7 christos &frame_object_type));
365 1.1 christos if (frame_obj == NULL)
366 1.1 christos return NULL;
367 1.1 christos
368 1.5 christos TRY
369 1.1 christos {
370 1.1 christos
371 1.1 christos /* Try to get the previous frame, to determine if this is the last frame
372 1.1 christos in a corrupt stack. If so, we need to store the frame_id of the next
373 1.1 christos frame and not of this one (which is possibly invalid). */
374 1.1 christos if (get_prev_frame (frame) == NULL
375 1.1 christos && get_frame_unwind_stop_reason (frame) != UNWIND_NO_REASON
376 1.1 christos && get_next_frame (frame) != NULL)
377 1.1 christos {
378 1.1 christos frame_obj->frame_id = get_frame_id (get_next_frame (frame));
379 1.1 christos frame_obj->frame_id_is_next = 1;
380 1.1 christos }
381 1.1 christos else
382 1.1 christos {
383 1.1 christos frame_obj->frame_id = get_frame_id (frame);
384 1.1 christos frame_obj->frame_id_is_next = 0;
385 1.1 christos }
386 1.1 christos frame_obj->gdbarch = get_frame_arch (frame);
387 1.1 christos }
388 1.5 christos CATCH (except, RETURN_MASK_ALL)
389 1.1 christos {
390 1.1 christos gdbpy_convert_exception (except);
391 1.1 christos return NULL;
392 1.1 christos }
393 1.5 christos END_CATCH
394 1.5 christos
395 1.7 christos return (PyObject *) frame_obj.release ();
396 1.1 christos }
397 1.1 christos
398 1.1 christos /* Implementation of gdb.Frame.older (self) -> gdb.Frame.
399 1.1 christos Returns the frame immediately older (outer) to this frame, or None if
400 1.1 christos there isn't one. */
401 1.1 christos
402 1.1 christos static PyObject *
403 1.1 christos frapy_older (PyObject *self, PyObject *args)
404 1.1 christos {
405 1.1 christos struct frame_info *frame, *prev = NULL;
406 1.1 christos PyObject *prev_obj = NULL; /* Initialize to appease gcc warning. */
407 1.1 christos
408 1.5 christos TRY
409 1.1 christos {
410 1.1 christos FRAPY_REQUIRE_VALID (self, frame);
411 1.1 christos
412 1.1 christos prev = get_prev_frame (frame);
413 1.1 christos }
414 1.5 christos CATCH (except, RETURN_MASK_ALL)
415 1.5 christos {
416 1.5 christos GDB_PY_HANDLE_EXCEPTION (except);
417 1.5 christos }
418 1.5 christos END_CATCH
419 1.1 christos
420 1.1 christos if (prev)
421 1.1 christos prev_obj = (PyObject *) frame_info_to_frame_object (prev);
422 1.1 christos else
423 1.1 christos {
424 1.1 christos Py_INCREF (Py_None);
425 1.1 christos prev_obj = Py_None;
426 1.1 christos }
427 1.1 christos
428 1.1 christos return prev_obj;
429 1.1 christos }
430 1.1 christos
431 1.1 christos /* Implementation of gdb.Frame.newer (self) -> gdb.Frame.
432 1.1 christos Returns the frame immediately newer (inner) to this frame, or None if
433 1.1 christos there isn't one. */
434 1.1 christos
435 1.1 christos static PyObject *
436 1.1 christos frapy_newer (PyObject *self, PyObject *args)
437 1.1 christos {
438 1.1 christos struct frame_info *frame, *next = NULL;
439 1.1 christos PyObject *next_obj = NULL; /* Initialize to appease gcc warning. */
440 1.1 christos
441 1.5 christos TRY
442 1.1 christos {
443 1.1 christos FRAPY_REQUIRE_VALID (self, frame);
444 1.1 christos
445 1.1 christos next = get_next_frame (frame);
446 1.1 christos }
447 1.5 christos CATCH (except, RETURN_MASK_ALL)
448 1.5 christos {
449 1.5 christos GDB_PY_HANDLE_EXCEPTION (except);
450 1.5 christos }
451 1.5 christos END_CATCH
452 1.1 christos
453 1.1 christos if (next)
454 1.1 christos next_obj = (PyObject *) frame_info_to_frame_object (next);
455 1.1 christos else
456 1.1 christos {
457 1.1 christos Py_INCREF (Py_None);
458 1.1 christos next_obj = Py_None;
459 1.1 christos }
460 1.1 christos
461 1.1 christos return next_obj;
462 1.1 christos }
463 1.1 christos
464 1.1 christos /* Implementation of gdb.Frame.find_sal (self) -> gdb.Symtab_and_line.
465 1.1 christos Returns the frame's symtab and line. */
466 1.1 christos
467 1.1 christos static PyObject *
468 1.1 christos frapy_find_sal (PyObject *self, PyObject *args)
469 1.1 christos {
470 1.1 christos struct frame_info *frame;
471 1.1 christos struct symtab_and_line sal;
472 1.1 christos PyObject *sal_obj = NULL; /* Initialize to appease gcc warning. */
473 1.1 christos
474 1.5 christos TRY
475 1.1 christos {
476 1.1 christos FRAPY_REQUIRE_VALID (self, frame);
477 1.1 christos
478 1.1 christos find_frame_sal (frame, &sal);
479 1.1 christos sal_obj = symtab_and_line_to_sal_object (sal);
480 1.1 christos }
481 1.5 christos CATCH (except, RETURN_MASK_ALL)
482 1.5 christos {
483 1.5 christos GDB_PY_HANDLE_EXCEPTION (except);
484 1.5 christos }
485 1.5 christos END_CATCH
486 1.1 christos
487 1.1 christos return sal_obj;
488 1.1 christos }
489 1.1 christos
490 1.1 christos /* Implementation of gdb.Frame.read_var_value (self, variable,
491 1.1 christos [block]) -> gdb.Value. If the optional block argument is provided
492 1.1 christos start the search from that block, otherwise search from the frame's
493 1.1 christos current block (determined by examining the resume address of the
494 1.1 christos frame). The variable argument must be a string or an instance of a
495 1.1 christos gdb.Symbol. The block argument must be an instance of gdb.Block. Returns
496 1.1 christos NULL on error, with a python exception set. */
497 1.1 christos static PyObject *
498 1.1 christos frapy_read_var (PyObject *self, PyObject *args)
499 1.1 christos {
500 1.1 christos struct frame_info *frame;
501 1.1 christos PyObject *sym_obj, *block_obj = NULL;
502 1.1 christos struct symbol *var = NULL; /* gcc-4.3.2 false warning. */
503 1.6 christos const struct block *block = NULL;
504 1.1 christos struct value *val = NULL;
505 1.1 christos
506 1.1 christos if (!PyArg_ParseTuple (args, "O|O", &sym_obj, &block_obj))
507 1.1 christos return NULL;
508 1.1 christos
509 1.1 christos if (PyObject_TypeCheck (sym_obj, &symbol_object_type))
510 1.1 christos var = symbol_object_to_symbol (sym_obj);
511 1.1 christos else if (gdbpy_is_string (sym_obj))
512 1.1 christos {
513 1.7 christos gdb::unique_xmalloc_ptr<char>
514 1.7 christos var_name (python_string_to_target_string (sym_obj));
515 1.1 christos
516 1.1 christos if (!var_name)
517 1.1 christos return NULL;
518 1.1 christos
519 1.1 christos if (block_obj)
520 1.1 christos {
521 1.1 christos block = block_object_to_block (block_obj);
522 1.1 christos if (!block)
523 1.1 christos {
524 1.1 christos PyErr_SetString (PyExc_RuntimeError,
525 1.1 christos _("Second argument must be block."));
526 1.1 christos return NULL;
527 1.1 christos }
528 1.1 christos }
529 1.1 christos
530 1.5 christos TRY
531 1.1 christos {
532 1.6 christos struct block_symbol lookup_sym;
533 1.1 christos FRAPY_REQUIRE_VALID (self, frame);
534 1.1 christos
535 1.1 christos if (!block)
536 1.1 christos block = get_frame_block (frame, NULL);
537 1.7 christos lookup_sym = lookup_symbol (var_name.get (), block, VAR_DOMAIN, NULL);
538 1.6 christos var = lookup_sym.symbol;
539 1.6 christos block = lookup_sym.block;
540 1.1 christos }
541 1.5 christos CATCH (except, RETURN_MASK_ALL)
542 1.1 christos {
543 1.1 christos gdbpy_convert_exception (except);
544 1.1 christos return NULL;
545 1.1 christos }
546 1.5 christos END_CATCH
547 1.1 christos
548 1.1 christos if (!var)
549 1.1 christos {
550 1.1 christos PyErr_Format (PyExc_ValueError,
551 1.7 christos _("Variable '%s' not found."), var_name.get ());
552 1.1 christos
553 1.1 christos return NULL;
554 1.1 christos }
555 1.1 christos }
556 1.1 christos else
557 1.1 christos {
558 1.1 christos PyErr_SetString (PyExc_TypeError,
559 1.1 christos _("Argument must be a symbol or string."));
560 1.1 christos return NULL;
561 1.1 christos }
562 1.1 christos
563 1.5 christos TRY
564 1.1 christos {
565 1.1 christos FRAPY_REQUIRE_VALID (self, frame);
566 1.1 christos
567 1.6 christos val = read_var_value (var, block, frame);
568 1.1 christos }
569 1.5 christos CATCH (except, RETURN_MASK_ALL)
570 1.5 christos {
571 1.5 christos GDB_PY_HANDLE_EXCEPTION (except);
572 1.5 christos }
573 1.5 christos END_CATCH
574 1.1 christos
575 1.1 christos return value_to_value_object (val);
576 1.1 christos }
577 1.1 christos
578 1.1 christos /* Select this frame. */
579 1.1 christos
580 1.1 christos static PyObject *
581 1.1 christos frapy_select (PyObject *self, PyObject *args)
582 1.1 christos {
583 1.1 christos struct frame_info *fi;
584 1.1 christos
585 1.5 christos TRY
586 1.1 christos {
587 1.1 christos FRAPY_REQUIRE_VALID (self, fi);
588 1.1 christos
589 1.1 christos select_frame (fi);
590 1.1 christos }
591 1.5 christos CATCH (except, RETURN_MASK_ALL)
592 1.5 christos {
593 1.5 christos GDB_PY_HANDLE_EXCEPTION (except);
594 1.5 christos }
595 1.5 christos END_CATCH
596 1.1 christos
597 1.1 christos Py_RETURN_NONE;
598 1.1 christos }
599 1.1 christos
600 1.1 christos /* Implementation of gdb.newest_frame () -> gdb.Frame.
601 1.1 christos Returns the newest frame object. */
602 1.1 christos
603 1.1 christos PyObject *
604 1.1 christos gdbpy_newest_frame (PyObject *self, PyObject *args)
605 1.1 christos {
606 1.1 christos struct frame_info *frame = NULL;
607 1.1 christos
608 1.5 christos TRY
609 1.1 christos {
610 1.1 christos frame = get_current_frame ();
611 1.1 christos }
612 1.5 christos CATCH (except, RETURN_MASK_ALL)
613 1.5 christos {
614 1.5 christos GDB_PY_HANDLE_EXCEPTION (except);
615 1.5 christos }
616 1.5 christos END_CATCH
617 1.1 christos
618 1.1 christos return frame_info_to_frame_object (frame);
619 1.1 christos }
620 1.1 christos
621 1.1 christos /* Implementation of gdb.selected_frame () -> gdb.Frame.
622 1.1 christos Returns the selected frame object. */
623 1.1 christos
624 1.1 christos PyObject *
625 1.1 christos gdbpy_selected_frame (PyObject *self, PyObject *args)
626 1.1 christos {
627 1.1 christos struct frame_info *frame = NULL;
628 1.1 christos
629 1.5 christos TRY
630 1.1 christos {
631 1.1 christos frame = get_selected_frame ("No frame is currently selected.");
632 1.1 christos }
633 1.5 christos CATCH (except, RETURN_MASK_ALL)
634 1.5 christos {
635 1.5 christos GDB_PY_HANDLE_EXCEPTION (except);
636 1.5 christos }
637 1.5 christos END_CATCH
638 1.1 christos
639 1.1 christos return frame_info_to_frame_object (frame);
640 1.1 christos }
641 1.1 christos
642 1.1 christos /* Implementation of gdb.stop_reason_string (Integer) -> String.
643 1.1 christos Return a string explaining the unwind stop reason. */
644 1.1 christos
645 1.1 christos PyObject *
646 1.1 christos gdbpy_frame_stop_reason_string (PyObject *self, PyObject *args)
647 1.1 christos {
648 1.1 christos int reason;
649 1.1 christos const char *str;
650 1.1 christos
651 1.1 christos if (!PyArg_ParseTuple (args, "i", &reason))
652 1.1 christos return NULL;
653 1.1 christos
654 1.1 christos if (reason < UNWIND_FIRST || reason > UNWIND_LAST)
655 1.1 christos {
656 1.1 christos PyErr_SetString (PyExc_ValueError,
657 1.1 christos _("Invalid frame stop reason."));
658 1.1 christos return NULL;
659 1.1 christos }
660 1.1 christos
661 1.6 christos str = unwind_stop_reason_to_string ((enum unwind_stop_reason) reason);
662 1.1 christos return PyUnicode_Decode (str, strlen (str), host_charset (), NULL);
663 1.1 christos }
664 1.1 christos
665 1.1 christos /* Implements the equality comparison for Frame objects.
666 1.1 christos All other comparison operators will throw a TypeError Python exception,
667 1.1 christos as they aren't valid for frames. */
668 1.1 christos
669 1.1 christos static PyObject *
670 1.1 christos frapy_richcompare (PyObject *self, PyObject *other, int op)
671 1.1 christos {
672 1.1 christos int result;
673 1.1 christos
674 1.1 christos if (!PyObject_TypeCheck (other, &frame_object_type)
675 1.1 christos || (op != Py_EQ && op != Py_NE))
676 1.1 christos {
677 1.1 christos Py_INCREF (Py_NotImplemented);
678 1.1 christos return Py_NotImplemented;
679 1.1 christos }
680 1.1 christos
681 1.1 christos if (frame_id_eq (((frame_object *) self)->frame_id,
682 1.1 christos ((frame_object *) other)->frame_id))
683 1.1 christos result = Py_EQ;
684 1.1 christos else
685 1.1 christos result = Py_NE;
686 1.1 christos
687 1.1 christos if (op == result)
688 1.1 christos Py_RETURN_TRUE;
689 1.1 christos Py_RETURN_FALSE;
690 1.1 christos }
691 1.1 christos
692 1.1 christos /* Sets up the Frame API in the gdb module. */
693 1.1 christos
694 1.1 christos int
695 1.1 christos gdbpy_initialize_frames (void)
696 1.1 christos {
697 1.1 christos frame_object_type.tp_new = PyType_GenericNew;
698 1.1 christos if (PyType_Ready (&frame_object_type) < 0)
699 1.1 christos return -1;
700 1.1 christos
701 1.1 christos /* Note: These would probably be best exposed as class attributes of
702 1.1 christos Frame, but I don't know how to do it except by messing with the
703 1.1 christos type's dictionary. That seems too messy. */
704 1.1 christos if (PyModule_AddIntConstant (gdb_module, "NORMAL_FRAME", NORMAL_FRAME) < 0
705 1.1 christos || PyModule_AddIntConstant (gdb_module, "DUMMY_FRAME", DUMMY_FRAME) < 0
706 1.1 christos || PyModule_AddIntConstant (gdb_module, "INLINE_FRAME", INLINE_FRAME) < 0
707 1.1 christos || PyModule_AddIntConstant (gdb_module, "TAILCALL_FRAME",
708 1.1 christos TAILCALL_FRAME) < 0
709 1.1 christos || PyModule_AddIntConstant (gdb_module, "SIGTRAMP_FRAME",
710 1.1 christos SIGTRAMP_FRAME) < 0
711 1.1 christos || PyModule_AddIntConstant (gdb_module, "ARCH_FRAME", ARCH_FRAME) < 0
712 1.1 christos || PyModule_AddIntConstant (gdb_module, "SENTINEL_FRAME",
713 1.1 christos SENTINEL_FRAME) < 0)
714 1.1 christos return -1;
715 1.1 christos
716 1.1 christos #define SET(name, description) \
717 1.1 christos if (PyModule_AddIntConstant (gdb_module, "FRAME_"#name, name) < 0) \
718 1.1 christos return -1;
719 1.1 christos #include "unwind_stop_reasons.def"
720 1.1 christos #undef SET
721 1.1 christos
722 1.1 christos return gdb_pymodule_addobject (gdb_module, "Frame",
723 1.1 christos (PyObject *) &frame_object_type);
724 1.1 christos }
725 1.1 christos
726 1.1 christos
727 1.1 christos
729 1.1 christos static PyMethodDef frame_object_methods[] = {
730 1.1 christos { "is_valid", frapy_is_valid, METH_NOARGS,
731 1.1 christos "is_valid () -> Boolean.\n\
732 1.1 christos Return true if this frame is valid, false if not." },
733 1.1 christos { "name", frapy_name, METH_NOARGS,
734 1.1 christos "name () -> String.\n\
735 1.1 christos Return the function name of the frame, or None if it can't be determined." },
736 1.1 christos { "type", frapy_type, METH_NOARGS,
737 1.1 christos "type () -> Integer.\n\
738 1.1 christos Return the type of the frame." },
739 1.1 christos { "architecture", frapy_arch, METH_NOARGS,
740 1.1 christos "architecture () -> gdb.Architecture.\n\
741 1.1 christos Return the architecture of the frame." },
742 1.1 christos { "unwind_stop_reason", frapy_unwind_stop_reason, METH_NOARGS,
743 1.1 christos "unwind_stop_reason () -> Integer.\n\
744 1.1 christos Return the reason why it's not possible to find frames older than this." },
745 1.1 christos { "pc", frapy_pc, METH_NOARGS,
746 1.1 christos "pc () -> Long.\n\
747 1.3 christos Return the frame's resume address." },
748 1.3 christos { "read_register", frapy_read_register, METH_VARARGS,
749 1.3 christos "read_register (register_name) -> gdb.Value\n\
750 1.1 christos Return the value of the register in the frame." },
751 1.1 christos { "block", frapy_block, METH_NOARGS,
752 1.1 christos "block () -> gdb.Block.\n\
753 1.1 christos Return the frame's code block." },
754 1.1 christos { "function", frapy_function, METH_NOARGS,
755 1.1 christos "function () -> gdb.Symbol.\n\
756 1.1 christos Returns the symbol for the function corresponding to this frame." },
757 1.1 christos { "older", frapy_older, METH_NOARGS,
758 1.1 christos "older () -> gdb.Frame.\n\
759 1.1 christos Return the frame that called this frame." },
760 1.1 christos { "newer", frapy_newer, METH_NOARGS,
761 1.1 christos "newer () -> gdb.Frame.\n\
762 1.1 christos Return the frame called by this frame." },
763 1.1 christos { "find_sal", frapy_find_sal, METH_NOARGS,
764 1.1 christos "find_sal () -> gdb.Symtab_and_line.\n\
765 1.1 christos Return the frame's symtab and line." },
766 1.1 christos { "read_var", frapy_read_var, METH_VARARGS,
767 1.1 christos "read_var (variable) -> gdb.Value.\n\
768 1.1 christos Return the value of the variable in this frame." },
769 1.1 christos { "select", frapy_select, METH_NOARGS,
770 1.1 christos "Select this frame as the user's current frame." },
771 1.1 christos {NULL} /* Sentinel */
772 1.1 christos };
773 1.1 christos
774 1.1 christos PyTypeObject frame_object_type = {
775 1.1 christos PyVarObject_HEAD_INIT (NULL, 0)
776 1.1 christos "gdb.Frame", /* tp_name */
777 1.1 christos sizeof (frame_object), /* tp_basicsize */
778 1.1 christos 0, /* tp_itemsize */
779 1.1 christos 0, /* tp_dealloc */
780 1.1 christos 0, /* tp_print */
781 1.1 christos 0, /* tp_getattr */
782 1.1 christos 0, /* tp_setattr */
783 1.1 christos 0, /* tp_compare */
784 1.1 christos 0, /* tp_repr */
785 1.1 christos 0, /* tp_as_number */
786 1.1 christos 0, /* tp_as_sequence */
787 1.1 christos 0, /* tp_as_mapping */
788 1.1 christos 0, /* tp_hash */
789 1.1 christos 0, /* tp_call */
790 1.1 christos frapy_str, /* tp_str */
791 1.1 christos 0, /* tp_getattro */
792 1.1 christos 0, /* tp_setattro */
793 1.1 christos 0, /* tp_as_buffer */
794 1.1 christos Py_TPFLAGS_DEFAULT, /* tp_flags */
795 1.1 christos "GDB frame object", /* tp_doc */
796 1.1 christos 0, /* tp_traverse */
797 1.1 christos 0, /* tp_clear */
798 1.1 christos frapy_richcompare, /* tp_richcompare */
799 1.1 christos 0, /* tp_weaklistoffset */
800 1.1 christos 0, /* tp_iter */
801 1.1 christos 0, /* tp_iternext */
802 1.1 christos frame_object_methods, /* tp_methods */
803 1.1 christos 0, /* tp_members */
804 1.1 christos 0, /* tp_getset */
805 1.1 christos 0, /* tp_base */
806 1.1 christos 0, /* tp_dict */
807 1.1 christos 0, /* tp_descr_get */
808 1.1 christos 0, /* tp_descr_set */
809 1.1 christos 0, /* tp_dictoffset */
810 1.1 christos 0, /* tp_init */
811 1.1 christos 0, /* tp_alloc */
812 };
813