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