diff options
author | Doug Evans <dje@google.com> | 2010-05-25 15:27:17 +0000 |
---|---|---|
committer | Doug Evans <dje@google.com> | 2010-05-25 15:27:17 +0000 |
commit | 07ca107c2d958b45633ef0cdcce7219a95f0cf01 (patch) | |
tree | 489e342ae66a8cac06bdb3d0106dbccb2b15010c /gdb/python/py-utils.c | |
parent | 8e45593ff36c03d6f39e28a0a7947ce3d282794d (diff) | |
download | binutils-07ca107c2d958b45633ef0cdcce7219a95f0cf01.zip binutils-07ca107c2d958b45633ef0cdcce7219a95f0cf01.tar.gz binutils-07ca107c2d958b45633ef0cdcce7219a95f0cf01.tar.bz2 |
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.
Diffstat (limited to 'gdb/python/py-utils.c')
-rw-r--r-- | gdb/python/py-utils.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/gdb/python/py-utils.c b/gdb/python/py-utils.c index cd11834..944e6b4 100644 --- a/gdb/python/py-utils.c +++ b/gdb/python/py-utils.c @@ -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; +} |