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