Update copyright year range in header of all files managed by GDB
[binutils-gdb.git] / gdb / python / py-frame.c
blob6d4e8c20dc12f54670b5f0bf45f0b381c27e2191
1 /* Python interface to stack frames
3 Copyright (C) 2008-2023 Free Software Foundation, Inc.
5 This file is part of GDB.
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.
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.
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/>. */
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"
31 struct frame_object {
32 PyObject_HEAD
33 struct frame_id frame_id;
34 struct gdbarch *gdbarch;
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;
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)
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. */
60 frame_info_ptr
61 frame_object_to_frame_info (PyObject *obj)
63 frame_object *frame_obj = (frame_object *) obj;
64 frame_info_ptr frame;
66 frame = frame_find_by_id (frame_obj->frame_id);
67 if (frame == NULL)
68 return NULL;
70 if (frame_obj->frame_id_is_next)
71 frame = get_prev_frame (frame);
73 return frame;
76 /* Called by the Python interpreter to obtain string representation
77 of the object. */
79 static PyObject *
80 frapy_str (PyObject *self)
82 const frame_id &fid = ((frame_object *) self)->frame_id;
83 return PyUnicode_FromString (fid.to_string ().c_str ());
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. */
90 static PyObject *
91 frapy_is_valid (PyObject *self, PyObject *args)
93 frame_info_ptr frame = NULL;
95 try
97 frame = frame_object_to_frame_info (self);
99 catch (const gdb_exception &except)
101 GDB_PY_HANDLE_EXCEPTION (except);
104 if (frame == NULL)
105 Py_RETURN_FALSE;
107 Py_RETURN_TRUE;
110 /* Implementation of gdb.Frame.name (self) -> String.
111 Returns the name of the function corresponding to this frame. */
113 static PyObject *
114 frapy_name (PyObject *self, PyObject *args)
116 frame_info_ptr frame;
117 gdb::unique_xmalloc_ptr<char> name;
118 enum language lang;
119 PyObject *result;
123 FRAPY_REQUIRE_VALID (self, frame);
125 name = find_frame_funname (frame, &lang, NULL);
127 catch (const gdb_exception &except)
129 GDB_PY_HANDLE_EXCEPTION (except);
132 if (name)
134 result = PyUnicode_Decode (name.get (), strlen (name.get ()),
135 host_charset (), NULL);
137 else
139 result = Py_None;
140 Py_INCREF (Py_None);
143 return result;
146 /* Implementation of gdb.Frame.type (self) -> Integer.
147 Returns the frame type, namely one of the gdb.*_FRAME constants. */
149 static PyObject *
150 frapy_type (PyObject *self, PyObject *args)
152 frame_info_ptr frame;
153 enum frame_type type = NORMAL_FRAME;/* Initialize to appease gcc warning. */
157 FRAPY_REQUIRE_VALID (self, frame);
159 type = get_frame_type (frame);
161 catch (const gdb_exception &except)
163 GDB_PY_HANDLE_EXCEPTION (except);
166 return gdb_py_object_from_longest (type).release ();
169 /* Implementation of gdb.Frame.architecture (self) -> gdb.Architecture.
170 Returns the frame's architecture as a gdb.Architecture object. */
172 static PyObject *
173 frapy_arch (PyObject *self, PyObject *args)
175 frame_info_ptr frame = NULL; /* Initialize to appease gcc warning. */
176 frame_object *obj = (frame_object *) self;
180 FRAPY_REQUIRE_VALID (self, frame);
182 catch (const gdb_exception &except)
184 GDB_PY_HANDLE_EXCEPTION (except);
187 return gdbarch_to_arch_object (obj->gdbarch);
190 /* Implementation of gdb.Frame.unwind_stop_reason (self) -> Integer.
191 Returns one of the gdb.FRAME_UNWIND_* constants. */
193 static PyObject *
194 frapy_unwind_stop_reason (PyObject *self, PyObject *args)
196 frame_info_ptr frame = NULL; /* Initialize to appease gcc warning. */
197 enum unwind_stop_reason stop_reason;
201 FRAPY_REQUIRE_VALID (self, frame);
203 catch (const gdb_exception &except)
205 GDB_PY_HANDLE_EXCEPTION (except);
208 stop_reason = get_frame_unwind_stop_reason (frame);
210 return gdb_py_object_from_longest (stop_reason).release ();
213 /* Implementation of gdb.Frame.pc (self) -> Long.
214 Returns the frame's resume address. */
216 static PyObject *
217 frapy_pc (PyObject *self, PyObject *args)
219 CORE_ADDR pc = 0; /* Initialize to appease gcc warning. */
220 frame_info_ptr frame;
224 FRAPY_REQUIRE_VALID (self, frame);
226 pc = get_frame_pc (frame);
228 catch (const gdb_exception &except)
230 GDB_PY_HANDLE_EXCEPTION (except);
233 return gdb_py_object_from_ulongest (pc).release ();
236 /* Implementation of gdb.Frame.read_register (self, register) -> gdb.Value.
237 Returns the value of a register in this frame. */
239 static PyObject *
240 frapy_read_register (PyObject *self, PyObject *args)
242 PyObject *pyo_reg_id;
243 struct value *val = NULL;
245 if (!PyArg_UnpackTuple (args, "read_register", 1, 1, &pyo_reg_id))
246 return NULL;
249 frame_info_ptr frame;
250 int regnum;
252 FRAPY_REQUIRE_VALID (self, frame);
254 if (!gdbpy_parse_register_id (get_frame_arch (frame), pyo_reg_id,
255 &regnum))
256 return nullptr;
258 gdb_assert (regnum >= 0);
259 val = value_of_register (regnum, frame);
261 if (val == NULL)
262 PyErr_SetString (PyExc_ValueError, _("Can't read register."));
264 catch (const gdb_exception &except)
266 GDB_PY_HANDLE_EXCEPTION (except);
269 return val == NULL ? NULL : value_to_value_object (val);
272 /* Implementation of gdb.Frame.block (self) -> gdb.Block.
273 Returns the frame's code block. */
275 static PyObject *
276 frapy_block (PyObject *self, PyObject *args)
278 frame_info_ptr frame;
279 const struct block *block = NULL, *fn_block;
283 FRAPY_REQUIRE_VALID (self, frame);
284 block = get_frame_block (frame, NULL);
286 catch (const gdb_exception &except)
288 GDB_PY_HANDLE_EXCEPTION (except);
291 for (fn_block = block;
292 fn_block != NULL && fn_block->function () == NULL;
293 fn_block = fn_block->superblock ())
296 if (block == NULL || fn_block == NULL || fn_block->function () == NULL)
298 PyErr_SetString (PyExc_RuntimeError,
299 _("Cannot locate block for frame."));
300 return NULL;
303 if (block)
305 return block_to_block_object
306 (block, fn_block->function ()->objfile ());
309 Py_RETURN_NONE;
313 /* Implementation of gdb.Frame.function (self) -> gdb.Symbol.
314 Returns the symbol for the function corresponding to this frame. */
316 static PyObject *
317 frapy_function (PyObject *self, PyObject *args)
319 struct symbol *sym = NULL;
320 frame_info_ptr frame;
324 enum language funlang;
326 FRAPY_REQUIRE_VALID (self, frame);
328 gdb::unique_xmalloc_ptr<char> funname
329 = find_frame_funname (frame, &funlang, &sym);
331 catch (const gdb_exception &except)
333 GDB_PY_HANDLE_EXCEPTION (except);
336 if (sym)
337 return symbol_to_symbol_object (sym);
339 Py_RETURN_NONE;
342 /* Convert a frame_info struct to a Python Frame object.
343 Sets a Python exception and returns NULL on error. */
345 PyObject *
346 frame_info_to_frame_object (frame_info_ptr frame)
348 gdbpy_ref<frame_object> frame_obj (PyObject_New (frame_object,
349 &frame_object_type));
350 if (frame_obj == NULL)
351 return NULL;
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)
363 frame_obj->frame_id = get_frame_id (get_next_frame (frame));
364 frame_obj->frame_id_is_next = 1;
366 else
368 frame_obj->frame_id = get_frame_id (frame);
369 frame_obj->frame_id_is_next = 0;
371 frame_obj->gdbarch = get_frame_arch (frame);
373 catch (const gdb_exception &except)
375 gdbpy_convert_exception (except);
376 return NULL;
379 return (PyObject *) frame_obj.release ();
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. */
386 static PyObject *
387 frapy_older (PyObject *self, PyObject *args)
389 frame_info_ptr frame, prev = NULL;
390 PyObject *prev_obj = NULL; /* Initialize to appease gcc warning. */
394 FRAPY_REQUIRE_VALID (self, frame);
396 prev = get_prev_frame (frame);
398 catch (const gdb_exception &except)
400 GDB_PY_HANDLE_EXCEPTION (except);
403 if (prev)
404 prev_obj = frame_info_to_frame_object (prev);
405 else
407 Py_INCREF (Py_None);
408 prev_obj = Py_None;
411 return prev_obj;
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. */
418 static PyObject *
419 frapy_newer (PyObject *self, PyObject *args)
421 frame_info_ptr frame, next = NULL;
422 PyObject *next_obj = NULL; /* Initialize to appease gcc warning. */
426 FRAPY_REQUIRE_VALID (self, frame);
428 next = get_next_frame (frame);
430 catch (const gdb_exception &except)
432 GDB_PY_HANDLE_EXCEPTION (except);
435 if (next)
436 next_obj = frame_info_to_frame_object (next);
437 else
439 Py_INCREF (Py_None);
440 next_obj = Py_None;
443 return next_obj;
446 /* Implementation of gdb.Frame.find_sal (self) -> gdb.Symtab_and_line.
447 Returns the frame's symtab and line. */
449 static PyObject *
450 frapy_find_sal (PyObject *self, PyObject *args)
452 frame_info_ptr frame;
453 PyObject *sal_obj = NULL; /* Initialize to appease gcc warning. */
457 FRAPY_REQUIRE_VALID (self, frame);
459 symtab_and_line sal = find_frame_sal (frame);
460 sal_obj = symtab_and_line_to_sal_object (sal);
462 catch (const gdb_exception &except)
464 GDB_PY_HANDLE_EXCEPTION (except);
467 return sal_obj;
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)
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;
486 if (!PyArg_ParseTuple (args, "O|O", &sym_obj, &block_obj))
487 return NULL;
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))
493 gdb::unique_xmalloc_ptr<char>
494 var_name (python_string_to_target_string (sym_obj));
496 if (!var_name)
497 return NULL;
499 if (block_obj)
501 block = block_object_to_block (block_obj);
502 if (!block)
504 PyErr_SetString (PyExc_RuntimeError,
505 _("Second argument must be block."));
506 return NULL;
512 struct block_symbol lookup_sym;
513 FRAPY_REQUIRE_VALID (self, frame);
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;
521 catch (const gdb_exception &except)
523 gdbpy_convert_exception (except);
524 return NULL;
527 if (!var)
529 PyErr_Format (PyExc_ValueError,
530 _("Variable '%s' not found."), var_name.get ());
532 return NULL;
535 else
537 PyErr_SetString (PyExc_TypeError,
538 _("Argument must be a symbol or string."));
539 return NULL;
544 FRAPY_REQUIRE_VALID (self, frame);
546 val = read_var_value (var, block, frame);
548 catch (const gdb_exception &except)
550 GDB_PY_HANDLE_EXCEPTION (except);
553 return value_to_value_object (val);
556 /* Select this frame. */
558 static PyObject *
559 frapy_select (PyObject *self, PyObject *args)
561 frame_info_ptr fi;
565 FRAPY_REQUIRE_VALID (self, fi);
567 select_frame (fi);
569 catch (const gdb_exception &except)
571 GDB_PY_HANDLE_EXCEPTION (except);
574 Py_RETURN_NONE;
577 /* The stack frame level for this frame. */
579 static PyObject *
580 frapy_level (PyObject *self, PyObject *args)
582 frame_info_ptr fi;
586 FRAPY_REQUIRE_VALID (self, fi);
588 return gdb_py_object_from_longest (frame_relative_level (fi)).release ();
590 catch (const gdb_exception &except)
592 GDB_PY_HANDLE_EXCEPTION (except);
595 Py_RETURN_NONE;
598 /* The language for this frame. */
600 static PyObject *
601 frapy_language (PyObject *self, PyObject *args)
605 frame_info_ptr fi;
606 FRAPY_REQUIRE_VALID (self, fi);
608 enum language lang = get_frame_language (fi);
609 const language_defn *lang_def = language_def (lang);
611 return host_string_to_python_string (lang_def->name ()).release ();
613 catch (const gdb_exception &except)
615 GDB_PY_HANDLE_EXCEPTION (except);
618 Py_RETURN_NONE;
621 /* Implementation of gdb.newest_frame () -> gdb.Frame.
622 Returns the newest frame object. */
624 PyObject *
625 gdbpy_newest_frame (PyObject *self, PyObject *args)
627 frame_info_ptr frame = NULL;
631 frame = get_current_frame ();
633 catch (const gdb_exception &except)
635 GDB_PY_HANDLE_EXCEPTION (except);
638 return frame_info_to_frame_object (frame);
641 /* Implementation of gdb.selected_frame () -> gdb.Frame.
642 Returns the selected frame object. */
644 PyObject *
645 gdbpy_selected_frame (PyObject *self, PyObject *args)
647 frame_info_ptr frame = NULL;
651 frame = get_selected_frame ("No frame is currently selected.");
653 catch (const gdb_exception &except)
655 GDB_PY_HANDLE_EXCEPTION (except);
658 return frame_info_to_frame_object (frame);
661 /* Implementation of gdb.stop_reason_string (Integer) -> String.
662 Return a string explaining the unwind stop reason. */
664 PyObject *
665 gdbpy_frame_stop_reason_string (PyObject *self, PyObject *args)
667 int reason;
668 const char *str;
670 if (!PyArg_ParseTuple (args, "i", &reason))
671 return NULL;
673 if (reason < UNWIND_FIRST || reason > UNWIND_LAST)
675 PyErr_SetString (PyExc_ValueError,
676 _("Invalid frame stop reason."));
677 return NULL;
680 str = unwind_stop_reason_to_string ((enum unwind_stop_reason) reason);
681 return PyUnicode_Decode (str, strlen (str), host_charset (), NULL);
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. */
688 static PyObject *
689 frapy_richcompare (PyObject *self, PyObject *other, int op)
691 int result;
693 if (!PyObject_TypeCheck (other, &frame_object_type)
694 || (op != Py_EQ && op != Py_NE))
696 Py_INCREF (Py_NotImplemented);
697 return Py_NotImplemented;
700 frame_object *self_frame = (frame_object *) self;
701 frame_object *other_frame = (frame_object *) other;
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;
709 if (op == result)
710 Py_RETURN_TRUE;
711 Py_RETURN_FALSE;
714 /* Sets up the Frame API in the gdb module. */
717 gdbpy_initialize_frames (void)
719 frame_object_type.tp_new = PyType_GenericNew;
720 if (PyType_Ready (&frame_object_type) < 0)
721 return -1;
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;
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
744 return gdb_pymodule_addobject (gdb_module, "Frame",
745 (PyObject *) &frame_object_type);
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 */
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 */