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