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:
Doug Evans 2010-05-25 15:27:17 +00:00
parent 8e45593ff3
commit 07ca107c2d
10 changed files with 255 additions and 13 deletions

View file

@ -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;
}