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