| Index: gdb/python/py-frame.c
|
| diff --git a/gdb/python/py-frame.c b/gdb/python/py-frame.c
|
| index 12a54e8cb2d0a420c47bc70b34d33601f5b39b5f..0f189f00c12ded359a34ce014cbfc16595c63c36 100644
|
| --- a/gdb/python/py-frame.c
|
| +++ b/gdb/python/py-frame.c
|
| @@ -1,6 +1,6 @@
|
| /* Python interface to stack frames
|
|
|
| - Copyright (C) 2008-2012 Free Software Foundation, Inc.
|
| + Copyright (C) 2008-2013 Free Software Foundation, Inc.
|
|
|
| This file is part of GDB.
|
|
|
| @@ -61,7 +61,7 @@ typedef struct {
|
| struct frame_info *
|
| frame_object_to_frame_info (PyObject *obj)
|
| {
|
| - frame_object *frame_obj = (frame_object *) obj;
|
| + frame_object *frame_obj = (frame_object *) obj;
|
| struct frame_info *frame;
|
|
|
| frame = frame_find_by_id (frame_obj->frame_id);
|
| @@ -122,7 +122,7 @@ static PyObject *
|
| frapy_name (PyObject *self, PyObject *args)
|
| {
|
| struct frame_info *frame;
|
| - const char *name;
|
| + char *name = NULL;
|
| enum language lang;
|
| PyObject *result;
|
| volatile struct gdb_exception except;
|
| @@ -133,10 +133,17 @@ frapy_name (PyObject *self, PyObject *args)
|
|
|
| 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);
|
| + {
|
| + result = PyUnicode_Decode (name, strlen (name), host_charset (), NULL);
|
| + xfree (name);
|
| + }
|
| else
|
| {
|
| result = Py_None;
|
| @@ -167,6 +174,25 @@ frapy_type (PyObject *self, PyObject *args)
|
| return PyInt_FromLong (type);
|
| }
|
|
|
| +/* Implementation of gdb.Frame.architecture (self) -> gdb.Architecture.
|
| + Returns the frame's architecture as a gdb.Architecture object. */
|
| +
|
| +static PyObject *
|
| +frapy_arch (PyObject *self, PyObject *args)
|
| +{
|
| + struct frame_info *frame = NULL; /* Initialize to appease gcc warning. */
|
| + 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);
|
| +}
|
| +
|
| /* Implementation of gdb.Frame.unwind_stop_reason (self) -> Integer.
|
| Returns one of the gdb.FRAME_UNWIND_* constants. */
|
|
|
| @@ -234,7 +260,7 @@ frapy_block (PyObject *self, PyObject *args)
|
| if (block == NULL || fn_block == NULL || BLOCK_FUNCTION (fn_block) == NULL)
|
| {
|
| PyErr_SetString (PyExc_RuntimeError,
|
| - _("Cannot locate object file for block."));
|
| + _("Cannot locate block for frame."));
|
| return NULL;
|
| }
|
|
|
| @@ -285,11 +311,7 @@ frame_info_to_frame_object (struct frame_info *frame)
|
|
|
| frame_obj = PyObject_New (frame_object, &frame_object_type);
|
| if (frame_obj == NULL)
|
| - {
|
| - PyErr_SetString (PyExc_MemoryError,
|
| - _("Could not allocate frame object."));
|
| - return NULL;
|
| - }
|
| + return NULL;
|
|
|
| TRY_CATCH (except, RETURN_MASK_ALL)
|
| {
|
| @@ -311,8 +333,12 @@ frame_info_to_frame_object (struct frame_info *frame)
|
| }
|
| frame_obj->gdbarch = get_frame_arch (frame);
|
| }
|
| - GDB_PY_HANDLE_EXCEPTION (except);
|
| -
|
| + if (except.reason < 0)
|
| + {
|
| + Py_DECREF (frame_obj);
|
| + gdbpy_convert_exception (except);
|
| + return NULL;
|
| + }
|
| return (PyObject *) frame_obj;
|
| }
|
|
|
| @@ -323,7 +349,7 @@ frame_info_to_frame_object (struct frame_info *frame)
|
| static PyObject *
|
| frapy_older (PyObject *self, PyObject *args)
|
| {
|
| - struct frame_info *frame, *prev;
|
| + struct frame_info *frame, *prev = NULL;
|
| volatile struct gdb_exception except;
|
| PyObject *prev_obj = NULL; /* Initialize to appease gcc warning. */
|
|
|
| @@ -332,16 +358,17 @@ frapy_older (PyObject *self, PyObject *args)
|
| FRAPY_REQUIRE_VALID (self, frame);
|
|
|
| prev = get_prev_frame (frame);
|
| - if (prev)
|
| - prev_obj = (PyObject *) frame_info_to_frame_object (prev);
|
| - else
|
| - {
|
| - Py_INCREF (Py_None);
|
| - prev_obj = Py_None;
|
| - }
|
| }
|
| 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;
|
| }
|
|
|
| @@ -352,7 +379,7 @@ frapy_older (PyObject *self, PyObject *args)
|
| static PyObject *
|
| frapy_newer (PyObject *self, PyObject *args)
|
| {
|
| - struct frame_info *frame, *next;
|
| + struct frame_info *frame, *next = NULL;
|
| volatile struct gdb_exception except;
|
| PyObject *next_obj = NULL; /* Initialize to appease gcc warning. */
|
|
|
| @@ -361,16 +388,17 @@ frapy_newer (PyObject *self, PyObject *args)
|
| FRAPY_REQUIRE_VALID (self, frame);
|
|
|
| next = get_next_frame (frame);
|
| - if (next)
|
| - next_obj = (PyObject *) frame_info_to_frame_object (next);
|
| - else
|
| - {
|
| - Py_INCREF (Py_None);
|
| - next_obj = Py_None;
|
| - }
|
| }
|
| 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;
|
| }
|
|
|
| @@ -437,6 +465,7 @@ frapy_read_var (PyObject *self, PyObject *args)
|
| {
|
| PyErr_SetString (PyExc_RuntimeError,
|
| _("Second argument must be block."));
|
| + do_cleanups (cleanup);
|
| return NULL;
|
| }
|
| }
|
| @@ -449,7 +478,12 @@ frapy_read_var (PyObject *self, PyObject *args)
|
| block = get_frame_block (frame, NULL);
|
| var = lookup_symbol (var_name, block, VAR_DOMAIN, NULL);
|
| }
|
| - GDB_PY_HANDLE_EXCEPTION (except);
|
| + if (except.reason < 0)
|
| + {
|
| + do_cleanups (cleanup);
|
| + gdbpy_convert_exception (except);
|
| + return NULL;
|
| + }
|
|
|
| if (!var)
|
| {
|
| @@ -505,18 +539,16 @@ frapy_select (PyObject *self, PyObject *args)
|
| PyObject *
|
| gdbpy_newest_frame (PyObject *self, PyObject *args)
|
| {
|
| - struct frame_info *frame;
|
| - PyObject *frame_obj = NULL; /* Initialize to appease gcc warning. */
|
| + struct frame_info *frame = NULL;
|
| volatile struct gdb_exception except;
|
|
|
| TRY_CATCH (except, RETURN_MASK_ALL)
|
| {
|
| frame = get_current_frame ();
|
| - frame_obj = frame_info_to_frame_object (frame);
|
| }
|
| GDB_PY_HANDLE_EXCEPTION (except);
|
|
|
| - return frame_obj;
|
| + return frame_info_to_frame_object (frame);
|
| }
|
|
|
| /* Implementation of gdb.selected_frame () -> gdb.Frame.
|
| @@ -525,18 +557,16 @@ gdbpy_newest_frame (PyObject *self, PyObject *args)
|
| PyObject *
|
| gdbpy_selected_frame (PyObject *self, PyObject *args)
|
| {
|
| - struct frame_info *frame;
|
| - PyObject *frame_obj = NULL; /* Initialize to appease gcc warning. */
|
| + 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.");
|
| - frame_obj = frame_info_to_frame_object (frame);
|
| }
|
| GDB_PY_HANDLE_EXCEPTION (except);
|
|
|
| - return frame_obj;
|
| + return frame_info_to_frame_object (frame);
|
| }
|
|
|
| /* Implementation of gdb.stop_reason_string (Integer) -> String.
|
| @@ -553,7 +583,7 @@ gdbpy_frame_stop_reason_string (PyObject *self, PyObject *args)
|
|
|
| if (reason < UNWIND_FIRST || reason > UNWIND_LAST)
|
| {
|
| - PyErr_SetString (PyExc_ValueError,
|
| + PyErr_SetString (PyExc_ValueError,
|
| _("Invalid frame stop reason."));
|
| return NULL;
|
| }
|
| @@ -591,33 +621,36 @@ frapy_richcompare (PyObject *self, PyObject *other, int op)
|
|
|
| /* Sets up the Frame API in the gdb module. */
|
|
|
| -void
|
| +int
|
| gdbpy_initialize_frames (void)
|
| {
|
| frame_object_type.tp_new = PyType_GenericNew;
|
| if (PyType_Ready (&frame_object_type) < 0)
|
| - return;
|
| + return -1;
|
|
|
| /* Note: These would probably be best exposed as class attributes of
|
| Frame, but I don't know how to do it except by messing with the
|
| type's dictionary. That seems too messy. */
|
| - PyModule_AddIntConstant (gdb_module, "NORMAL_FRAME", NORMAL_FRAME);
|
| - PyModule_AddIntConstant (gdb_module, "DUMMY_FRAME", DUMMY_FRAME);
|
| - PyModule_AddIntConstant (gdb_module, "INLINE_FRAME", INLINE_FRAME);
|
| - PyModule_AddIntConstant (gdb_module, "TAILCALL_FRAME", TAILCALL_FRAME);
|
| - PyModule_AddIntConstant (gdb_module, "SIGTRAMP_FRAME", SIGTRAMP_FRAME);
|
| - PyModule_AddIntConstant (gdb_module, "ARCH_FRAME", ARCH_FRAME);
|
| - PyModule_AddIntConstant (gdb_module, "SENTINEL_FRAME", SENTINEL_FRAME);
|
| + 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) \
|
| - PyModule_AddIntConstant (gdb_module, "FRAME_"#name, name);
|
| -#define FIRST_ERROR(name) \
|
| - PyModule_AddIntConstant (gdb_module, "FRAME_"#name, name);
|
| + if (PyModule_AddIntConstant (gdb_module, "FRAME_"#name, name) < 0) \
|
| + return -1;
|
| #include "unwind_stop_reasons.def"
|
| #undef SET
|
|
|
| - Py_INCREF (&frame_object_type);
|
| - PyModule_AddObject (gdb_module, "Frame", (PyObject *) &frame_object_type);
|
| + return gdb_pymodule_addobject (gdb_module, "Frame",
|
| + (PyObject *) &frame_object_type);
|
| }
|
|
|
|
|
| @@ -632,6 +665,9 @@ 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." },
|
| @@ -662,8 +698,7 @@ Return the value of the variable in this frame." },
|
| };
|
|
|
| PyTypeObject frame_object_type = {
|
| - PyObject_HEAD_INIT (NULL)
|
| - 0, /* ob_size */
|
| + PyVarObject_HEAD_INIT (NULL, 0)
|
| "gdb.Frame", /* tp_name */
|
| sizeof (frame_object), /* tp_basicsize */
|
| 0, /* tp_itemsize */
|
|
|