Add python gdb.GdbError and gdb.string_to_argv.
* NEWS: Document them. * python/py-cmd.c (cmdpy_function): Don't print a traceback if the exception is gdb.GdbError. Print a second traceback if there's an error computing the error message. (gdbpy_string_to_argv): New function. * python/py-utils.c (gdbpy_obj_to_string): New function. (gdbpy_exception_to_string): New function. * python/python-internal.h (gdbpy_string_to_argv): Declare. (gdbpy_obj_to_string, gdbpy_exception_to_string): Declare. (gdbpy_gdberror_exc): Declare. * python/python.c (gdbpy_gdberror_exc): New global. (_initialize_python): Initialize gdbpy_gdberror_exc and create gdb.GdbError. (GdbMethods): Add string_to_argv. doc/ * gdb.texinfo (Exception Handling): Document gdb.GdbError. (Commands In Python): Document gdb.string_to_argv. testsuite/ * gdb.python/py-cmd.exp: Add tests for gdb.GdbError and gdb.string_to_argv.
This commit is contained in:
parent
8e45593ff3
commit
07ca107c2d
10 changed files with 255 additions and 13 deletions
|
@ -222,3 +222,53 @@ gdbpy_is_string (PyObject *obj)
|
|||
{
|
||||
return PyString_Check (obj) || PyUnicode_Check (obj);
|
||||
}
|
||||
|
||||
/* Return the string representation of OBJ, i.e., str (obj).
|
||||
Space for the result is malloc'd, the caller must free.
|
||||
If the result is NULL a python error occurred, the caller must clear it. */
|
||||
|
||||
char *
|
||||
gdbpy_obj_to_string (PyObject *obj)
|
||||
{
|
||||
PyObject *str_obj = PyObject_Str (obj);
|
||||
|
||||
if (str_obj != NULL)
|
||||
{
|
||||
char *msg = xstrdup (PyString_AsString (str_obj));
|
||||
|
||||
Py_DECREF (str_obj);
|
||||
return msg;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Return the string representation of the exception represented by
|
||||
TYPE, VALUE which is assumed to have been obtained with PyErr_Fetch,
|
||||
i.e., the error indicator is currently clear.
|
||||
Space for the result is malloc'd, the caller must free.
|
||||
If the result is NULL a python error occurred, the caller must clear it. */
|
||||
|
||||
char *
|
||||
gdbpy_exception_to_string (PyObject *ptype, PyObject *pvalue)
|
||||
{
|
||||
PyObject *str_obj = PyObject_Str (pvalue);
|
||||
char *str;
|
||||
|
||||
/* There are a few cases to consider.
|
||||
For example:
|
||||
pvalue is a string when PyErr_SetString is used.
|
||||
pvalue is not a string when raise "foo" is used, instead it is None
|
||||
and ptype is "foo".
|
||||
So the algorithm we use is to print `str (pvalue)' if it's not
|
||||
None, otherwise we print `str (ptype)'.
|
||||
Using str (aka PyObject_Str) will fetch the error message from
|
||||
gdb.GdbError ("message"). */
|
||||
|
||||
if (pvalue && pvalue != Py_None)
|
||||
str = gdbpy_obj_to_string (pvalue);
|
||||
else
|
||||
str = gdbpy_obj_to_string (ptype);
|
||||
|
||||
return str;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue