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