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