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