gdb/python/py-frame.c - gdb
Global variables defined
Data types defined
Functions defined
Macros defined
Source code
- #include "defs.h"
- #include "charset.h"
- #include "block.h"
- #include "frame.h"
- #include "symtab.h"
- #include "stack.h"
- #include "value.h"
- #include "python-internal.h"
- #include "symfile.h"
- #include "objfiles.h"
- #include "user-regs.h"
- typedef struct {
- PyObject_HEAD
- struct frame_id frame_id;
- struct gdbarch *gdbarch;
-
- int frame_id_is_next;
- } frame_object;
- #define FRAPY_REQUIRE_VALID(frame_obj, frame) \
- do { \
- frame = frame_object_to_frame_info (frame_obj); \
- if (frame == NULL) \
- error (_("Frame is invalid.")); \
- } while (0)
- struct frame_info *
- frame_object_to_frame_info (PyObject *obj)
- {
- frame_object *frame_obj = (frame_object *) obj;
- struct frame_info *frame;
- frame = frame_find_by_id (frame_obj->frame_id);
- if (frame == NULL)
- return NULL;
- if (frame_obj->frame_id_is_next)
- frame = get_prev_frame (frame);
- return frame;
- }
- static PyObject *
- frapy_str (PyObject *self)
- {
- char *s;
- PyObject *result;
- struct ui_file *strfile;
- strfile = mem_fileopen ();
- fprint_frame_id (strfile, ((frame_object *) self)->frame_id);
- s = ui_file_xstrdup (strfile, NULL);
- result = PyString_FromString (s);
- xfree (s);
- return result;
- }
- static PyObject *
- frapy_is_valid (PyObject *self, PyObject *args)
- {
- struct frame_info *frame = NULL;
- volatile struct gdb_exception except;
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- frame = frame_object_to_frame_info (self);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
- if (frame == NULL)
- Py_RETURN_FALSE;
- Py_RETURN_TRUE;
- }
- static PyObject *
- frapy_name (PyObject *self, PyObject *args)
- {
- struct frame_info *frame;
- char *name = NULL;
- enum language lang;
- PyObject *result;
- volatile struct gdb_exception except;
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- FRAPY_REQUIRE_VALID (self, frame);
- find_frame_funname (frame, &name, &lang, NULL);
- }
- if (except.reason < 0)
- xfree (name);
- GDB_PY_HANDLE_EXCEPTION (except);
- if (name)
- {
- result = PyUnicode_Decode (name, strlen (name), host_charset (), NULL);
- xfree (name);
- }
- else
- {
- result = Py_None;
- Py_INCREF (Py_None);
- }
- return result;
- }
- static PyObject *
- frapy_type (PyObject *self, PyObject *args)
- {
- struct frame_info *frame;
- enum frame_type type = NORMAL_FRAME;
- volatile struct gdb_exception except;
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- FRAPY_REQUIRE_VALID (self, frame);
- type = get_frame_type (frame);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
- return PyInt_FromLong (type);
- }
- static PyObject *
- frapy_arch (PyObject *self, PyObject *args)
- {
- struct frame_info *frame = NULL;
- frame_object *obj = (frame_object *) self;
- volatile struct gdb_exception except;
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- FRAPY_REQUIRE_VALID (self, frame);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
- return gdbarch_to_arch_object (obj->gdbarch);
- }
- static PyObject *
- frapy_unwind_stop_reason (PyObject *self, PyObject *args)
- {
- struct frame_info *frame = NULL;
- volatile struct gdb_exception except;
- enum unwind_stop_reason stop_reason;
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- FRAPY_REQUIRE_VALID (self, frame);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
- stop_reason = get_frame_unwind_stop_reason (frame);
- return PyInt_FromLong (stop_reason);
- }
- static PyObject *
- frapy_pc (PyObject *self, PyObject *args)
- {
- CORE_ADDR pc = 0;
- struct frame_info *frame;
- volatile struct gdb_exception except;
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- FRAPY_REQUIRE_VALID (self, frame);
- pc = get_frame_pc (frame);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
- return gdb_py_long_from_ulongest (pc);
- }
- static PyObject *
- frapy_read_register (PyObject *self, PyObject *args)
- {
- volatile struct gdb_exception except;
- const char *regnum_str;
- struct value *val = NULL;
- if (!PyArg_ParseTuple (args, "s", ®num_str))
- return NULL;
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- struct frame_info *frame;
- int regnum;
- FRAPY_REQUIRE_VALID (self, frame);
- regnum = user_reg_map_name_to_regnum (get_frame_arch (frame),
- regnum_str,
- strlen (regnum_str));
- if (regnum >= 0)
- val = value_of_register (regnum, frame);
- if (val == NULL)
- PyErr_SetString (PyExc_ValueError, _("Unknown register."));
- }
- GDB_PY_HANDLE_EXCEPTION (except);
- return val == NULL ? NULL : value_to_value_object (val);
- }
- static PyObject *
- frapy_block (PyObject *self, PyObject *args)
- {
- struct frame_info *frame;
- const struct block *block = NULL, *fn_block;
- volatile struct gdb_exception except;
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- FRAPY_REQUIRE_VALID (self, frame);
- block = get_frame_block (frame, NULL);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
- for (fn_block = block;
- fn_block != NULL && BLOCK_FUNCTION (fn_block) == NULL;
- fn_block = BLOCK_SUPERBLOCK (fn_block))
- ;
- if (block == NULL || fn_block == NULL || BLOCK_FUNCTION (fn_block) == NULL)
- {
- PyErr_SetString (PyExc_RuntimeError,
- _("Cannot locate block for frame."));
- return NULL;
- }
- if (block)
- {
- return block_to_block_object
- (block, symbol_objfile (BLOCK_FUNCTION (fn_block)));
- }
- Py_RETURN_NONE;
- }
- static PyObject *
- frapy_function (PyObject *self, PyObject *args)
- {
- struct symbol *sym = NULL;
- struct frame_info *frame;
- volatile struct gdb_exception except;
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- FRAPY_REQUIRE_VALID (self, frame);
- sym = find_pc_function (get_frame_address_in_block (frame));
- }
- GDB_PY_HANDLE_EXCEPTION (except);
- if (sym)
- return symbol_to_symbol_object (sym);
- Py_RETURN_NONE;
- }
- PyObject *
- frame_info_to_frame_object (struct frame_info *frame)
- {
- frame_object *frame_obj;
- volatile struct gdb_exception except;
- frame_obj = PyObject_New (frame_object, &frame_object_type);
- if (frame_obj == NULL)
- return NULL;
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
-
- if (get_prev_frame (frame) == NULL
- && get_frame_unwind_stop_reason (frame) != UNWIND_NO_REASON
- && get_next_frame (frame) != NULL)
- {
- frame_obj->frame_id = get_frame_id (get_next_frame (frame));
- frame_obj->frame_id_is_next = 1;
- }
- else
- {
- frame_obj->frame_id = get_frame_id (frame);
- frame_obj->frame_id_is_next = 0;
- }
- frame_obj->gdbarch = get_frame_arch (frame);
- }
- if (except.reason < 0)
- {
- Py_DECREF (frame_obj);
- gdbpy_convert_exception (except);
- return NULL;
- }
- return (PyObject *) frame_obj;
- }
- static PyObject *
- frapy_older (PyObject *self, PyObject *args)
- {
- struct frame_info *frame, *prev = NULL;
- volatile struct gdb_exception except;
- PyObject *prev_obj = NULL;
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- FRAPY_REQUIRE_VALID (self, frame);
- prev = get_prev_frame (frame);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
- if (prev)
- prev_obj = (PyObject *) frame_info_to_frame_object (prev);
- else
- {
- Py_INCREF (Py_None);
- prev_obj = Py_None;
- }
- return prev_obj;
- }
- static PyObject *
- frapy_newer (PyObject *self, PyObject *args)
- {
- struct frame_info *frame, *next = NULL;
- volatile struct gdb_exception except;
- PyObject *next_obj = NULL;
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- FRAPY_REQUIRE_VALID (self, frame);
- next = get_next_frame (frame);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
- if (next)
- next_obj = (PyObject *) frame_info_to_frame_object (next);
- else
- {
- Py_INCREF (Py_None);
- next_obj = Py_None;
- }
- return next_obj;
- }
- static PyObject *
- frapy_find_sal (PyObject *self, PyObject *args)
- {
- struct frame_info *frame;
- struct symtab_and_line sal;
- volatile struct gdb_exception except;
- PyObject *sal_obj = NULL;
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- FRAPY_REQUIRE_VALID (self, frame);
- find_frame_sal (frame, &sal);
- sal_obj = symtab_and_line_to_sal_object (sal);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
- return sal_obj;
- }
- static PyObject *
- frapy_read_var (PyObject *self, PyObject *args)
- {
- struct frame_info *frame;
- PyObject *sym_obj, *block_obj = NULL;
- struct symbol *var = NULL;
- struct value *val = NULL;
- volatile struct gdb_exception except;
- if (!PyArg_ParseTuple (args, "O|O", &sym_obj, &block_obj))
- return NULL;
- if (PyObject_TypeCheck (sym_obj, &symbol_object_type))
- var = symbol_object_to_symbol (sym_obj);
- else if (gdbpy_is_string (sym_obj))
- {
- char *var_name;
- const struct block *block = NULL;
- struct cleanup *cleanup;
- volatile struct gdb_exception except;
- var_name = python_string_to_target_string (sym_obj);
- if (!var_name)
- return NULL;
- cleanup = make_cleanup (xfree, var_name);
- if (block_obj)
- {
- block = block_object_to_block (block_obj);
- if (!block)
- {
- PyErr_SetString (PyExc_RuntimeError,
- _("Second argument must be block."));
- do_cleanups (cleanup);
- return NULL;
- }
- }
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- FRAPY_REQUIRE_VALID (self, frame);
- if (!block)
- block = get_frame_block (frame, NULL);
- var = lookup_symbol (var_name, block, VAR_DOMAIN, NULL);
- }
- if (except.reason < 0)
- {
- do_cleanups (cleanup);
- gdbpy_convert_exception (except);
- return NULL;
- }
- if (!var)
- {
- PyErr_Format (PyExc_ValueError,
- _("Variable '%s' not found."), var_name);
- do_cleanups (cleanup);
- return NULL;
- }
- do_cleanups (cleanup);
- }
- else
- {
- PyErr_SetString (PyExc_TypeError,
- _("Argument must be a symbol or string."));
- return NULL;
- }
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- FRAPY_REQUIRE_VALID (self, frame);
- val = read_var_value (var, frame);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
- return value_to_value_object (val);
- }
- static PyObject *
- frapy_select (PyObject *self, PyObject *args)
- {
- struct frame_info *fi;
- volatile struct gdb_exception except;
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- FRAPY_REQUIRE_VALID (self, fi);
- select_frame (fi);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
- Py_RETURN_NONE;
- }
- PyObject *
- gdbpy_newest_frame (PyObject *self, PyObject *args)
- {
- struct frame_info *frame = NULL;
- volatile struct gdb_exception except;
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- frame = get_current_frame ();
- }
- GDB_PY_HANDLE_EXCEPTION (except);
- return frame_info_to_frame_object (frame);
- }
- PyObject *
- gdbpy_selected_frame (PyObject *self, PyObject *args)
- {
- struct frame_info *frame = NULL;
- volatile struct gdb_exception except;
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- frame = get_selected_frame ("No frame is currently selected.");
- }
- GDB_PY_HANDLE_EXCEPTION (except);
- return frame_info_to_frame_object (frame);
- }
- PyObject *
- gdbpy_frame_stop_reason_string (PyObject *self, PyObject *args)
- {
- int reason;
- const char *str;
- if (!PyArg_ParseTuple (args, "i", &reason))
- return NULL;
- if (reason < UNWIND_FIRST || reason > UNWIND_LAST)
- {
- PyErr_SetString (PyExc_ValueError,
- _("Invalid frame stop reason."));
- return NULL;
- }
- str = unwind_stop_reason_to_string (reason);
- return PyUnicode_Decode (str, strlen (str), host_charset (), NULL);
- }
- static PyObject *
- frapy_richcompare (PyObject *self, PyObject *other, int op)
- {
- int result;
- if (!PyObject_TypeCheck (other, &frame_object_type)
- || (op != Py_EQ && op != Py_NE))
- {
- Py_INCREF (Py_NotImplemented);
- return Py_NotImplemented;
- }
- if (frame_id_eq (((frame_object *) self)->frame_id,
- ((frame_object *) other)->frame_id))
- result = Py_EQ;
- else
- result = Py_NE;
- if (op == result)
- Py_RETURN_TRUE;
- Py_RETURN_FALSE;
- }
- int
- gdbpy_initialize_frames (void)
- {
- frame_object_type.tp_new = PyType_GenericNew;
- if (PyType_Ready (&frame_object_type) < 0)
- return -1;
-
- if (PyModule_AddIntConstant (gdb_module, "NORMAL_FRAME", NORMAL_FRAME) < 0
- || PyModule_AddIntConstant (gdb_module, "DUMMY_FRAME", DUMMY_FRAME) < 0
- || PyModule_AddIntConstant (gdb_module, "INLINE_FRAME", INLINE_FRAME) < 0
- || PyModule_AddIntConstant (gdb_module, "TAILCALL_FRAME",
- TAILCALL_FRAME) < 0
- || PyModule_AddIntConstant (gdb_module, "SIGTRAMP_FRAME",
- SIGTRAMP_FRAME) < 0
- || PyModule_AddIntConstant (gdb_module, "ARCH_FRAME", ARCH_FRAME) < 0
- || PyModule_AddIntConstant (gdb_module, "SENTINEL_FRAME",
- SENTINEL_FRAME) < 0)
- return -1;
- #define SET(name, description) \
- if (PyModule_AddIntConstant (gdb_module, "FRAME_"#name, name) < 0) \
- return -1;
- #include "unwind_stop_reasons.def"
- #undef SET
- return gdb_pymodule_addobject (gdb_module, "Frame",
- (PyObject *) &frame_object_type);
- }
- static PyMethodDef frame_object_methods[] = {
- { "is_valid", frapy_is_valid, METH_NOARGS,
- "is_valid () -> Boolean.\n\
- Return true if this frame is valid, false if not." },
- { "name", frapy_name, METH_NOARGS,
- "name () -> String.\n\
- Return the function name of the frame, or None if it can't be determined." },
- { "type", frapy_type, METH_NOARGS,
- "type () -> Integer.\n\
- Return the type of the frame." },
- { "architecture", frapy_arch, METH_NOARGS,
- "architecture () -> gdb.Architecture.\n\
- Return the architecture of the frame." },
- { "unwind_stop_reason", frapy_unwind_stop_reason, METH_NOARGS,
- "unwind_stop_reason () -> Integer.\n\
- Return the reason why it's not possible to find frames older than this." },
- { "pc", frapy_pc, METH_NOARGS,
- "pc () -> Long.\n\
- Return the frame's resume address." },
- { "read_register", frapy_read_register, METH_VARARGS,
- "read_register (register_name) -> gdb.Value\n\
- Return the value of the register in the frame." },
- { "block", frapy_block, METH_NOARGS,
- "block () -> gdb.Block.\n\
- Return the frame's code block." },
- { "function", frapy_function, METH_NOARGS,
- "function () -> gdb.Symbol.\n\
- Returns the symbol for the function corresponding to this frame." },
- { "older", frapy_older, METH_NOARGS,
- "older () -> gdb.Frame.\n\
- Return the frame that called this frame." },
- { "newer", frapy_newer, METH_NOARGS,
- "newer () -> gdb.Frame.\n\
- Return the frame called by this frame." },
- { "find_sal", frapy_find_sal, METH_NOARGS,
- "find_sal () -> gdb.Symtab_and_line.\n\
- Return the frame's symtab and line." },
- { "read_var", frapy_read_var, METH_VARARGS,
- "read_var (variable) -> gdb.Value.\n\
- Return the value of the variable in this frame." },
- { "select", frapy_select, METH_NOARGS,
- "Select this frame as the user's current frame." },
- {NULL}
- };
- PyTypeObject frame_object_type = {
- PyVarObject_HEAD_INIT (NULL, 0)
- "gdb.Frame",
- sizeof (frame_object),
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- frapy_str,
- 0,
- 0,
- 0,
- Py_TPFLAGS_DEFAULT,
- "GDB frame object",
- 0,
- 0,
- frapy_richcompare,
- 0,
- 0,
- 0,
- frame_object_methods,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- };