]> Git Repo - binutils.git/blob - gdb/python/py-frame.c
Change GDB to use frame_info_ptr
[binutils.git] / gdb / python / py-frame.c
1 /* Python interface to stack frames
2
3    Copyright (C) 2008-2022 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 \f
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 };
This page took 0.073809 seconds and 4 git commands to generate.