diff options
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/python/py-cmd.c | 48 | ||||
-rw-r--r-- | gdb/python/py-function.c | 51 | ||||
-rw-r--r-- | gdb/python/py-utils.c | 56 | ||||
-rw-r--r-- | gdb/python/python-internal.h | 1 |
5 files changed, 66 insertions, 97 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f887159..cbbd146 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,12 @@ 2018-09-23 Tom Tromey <tom@tromey.com> + * python/py-function.c (fnpy_call): Use gdbpy_handle_exception. + * python/py-cmd.c (cmdpy_function): Use gdbpy_handle_exception. + * python/python-internal.h (gdbpy_handle_exception): Declare. + * python/py-utils.c (gdbpy_handle_exception): New function. + +2018-09-23 Tom Tromey <tom@tromey.com> + PR python/17284: * python/py-type.c (typy_template_argument): Check for negative argument number. diff --git a/gdb/python/py-cmd.c b/gdb/python/py-cmd.c index 27c4689..e7eb66f 100644 --- a/gdb/python/py-cmd.c +++ b/gdb/python/py-cmd.c @@ -145,53 +145,7 @@ cmdpy_function (struct cmd_list_element *command, NULL)); if (result == NULL) - { - PyObject *ptype, *pvalue, *ptraceback; - - PyErr_Fetch (&ptype, &pvalue, &ptraceback); - - /* Try to fetch an error message contained within ptype, pvalue. - When fetching the error message we need to make our own copy, - we no longer own ptype, pvalue after the call to PyErr_Restore. */ - - gdb::unique_xmalloc_ptr<char> - msg (gdbpy_exception_to_string (ptype, pvalue)); - - if (msg == NULL) - { - /* An error occurred computing the string representation of the - error message. This is rare, but we should inform the user. */ - printf_filtered (_("An error occurred in a Python command\n" - "and then another occurred computing the " - "error message.\n")); - gdbpy_print_stack (); - } - - /* Don't print the stack for gdb.GdbError exceptions. - It is generally used to flag user errors. - - We also don't want to print "Error occurred in Python command" - for user errors. However, a missing message for gdb.GdbError - exceptions is arguably a bug, so we flag it as such. */ - - if (! PyErr_GivenExceptionMatches (ptype, gdbpy_gdberror_exc) - || msg == NULL || *msg == '\0') - { - PyErr_Restore (ptype, pvalue, ptraceback); - gdbpy_print_stack (); - if (msg != NULL && *msg != '\0') - error (_("Error occurred in Python command: %s"), msg.get ()); - else - error (_("Error occurred in Python command.")); - } - else - { - Py_XDECREF (ptype); - Py_XDECREF (pvalue); - Py_XDECREF (ptraceback); - error ("%s", msg.get ()); - } - } + gdbpy_handle_exception (); } /* Helper function for the Python command completers (both "pure" diff --git a/gdb/python/py-function.c b/gdb/python/py-function.c index c461231..1900f0f 100644 --- a/gdb/python/py-function.c +++ b/gdb/python/py-function.c @@ -83,56 +83,7 @@ fnpy_call (struct gdbarch *gdbarch, const struct language_defn *language, } if (result == NULL) - { - PyObject *ptype, *pvalue, *ptraceback; - - PyErr_Fetch (&ptype, &pvalue, &ptraceback); - - /* Try to fetch an error message contained within ptype, pvalue. - When fetching the error message we need to make our own copy, - we no longer own ptype, pvalue after the call to PyErr_Restore. */ - - gdb::unique_xmalloc_ptr<char> - msg (gdbpy_exception_to_string (ptype, pvalue)); - - if (msg == NULL) - { - /* An error occurred computing the string representation of the - error message. This is rare, but we should inform the user. */ - - printf_filtered (_("An error occurred in a Python " - "convenience function\n" - "and then another occurred computing the " - "error message.\n")); - gdbpy_print_stack (); - } - - /* Don't print the stack for gdb.GdbError exceptions. - It is generally used to flag user errors. - - We also don't want to print "Error occurred in Python command" - for user errors. However, a missing message for gdb.GdbError - exceptions is arguably a bug, so we flag it as such. */ - - if (!PyErr_GivenExceptionMatches (ptype, gdbpy_gdberror_exc) - || msg == NULL || *msg == '\0') - { - PyErr_Restore (ptype, pvalue, ptraceback); - gdbpy_print_stack (); - if (msg != NULL && *msg != '\0') - error (_("Error occurred in Python convenience function: %s"), - msg.get ()); - else - error (_("Error occurred in Python convenience function.")); - } - else - { - Py_XDECREF (ptype); - Py_XDECREF (pvalue); - Py_XDECREF (ptraceback); - error ("%s", msg.get ()); - } - } + gdbpy_handle_exception (); value = convert_value_from_python (result.get ()); if (value == NULL) diff --git a/gdb/python/py-utils.c b/gdb/python/py-utils.c index 01fd6ad..6ef0d7e 100644 --- a/gdb/python/py-utils.c +++ b/gdb/python/py-utils.c @@ -384,3 +384,59 @@ gdb_pymodule_addobject (PyObject *module, const char *name, PyObject *object) Py_DECREF (object); return result; } + +/* Handle a Python exception when the special gdb.GdbError treatment + is desired. This should only be called when an exception is set. + If the exception is a gdb.GdbError, throw a gdb exception with the + exception text. For other exceptions, print the Python stack and + then throw a gdb exception. */ + +void +gdbpy_handle_exception () +{ + PyObject *ptype, *pvalue, *ptraceback; + + PyErr_Fetch (&ptype, &pvalue, &ptraceback); + + /* Try to fetch an error message contained within ptype, pvalue. + When fetching the error message we need to make our own copy, + we no longer own ptype, pvalue after the call to PyErr_Restore. */ + + gdb::unique_xmalloc_ptr<char> + msg (gdbpy_exception_to_string (ptype, pvalue)); + + if (msg == NULL) + { + /* An error occurred computing the string representation of the + error message. This is rare, but we should inform the user. */ + printf_filtered (_("An error occurred in Python " + "and then another occurred computing the " + "error message.\n")); + gdbpy_print_stack (); + } + + /* Don't print the stack for gdb.GdbError exceptions. + It is generally used to flag user errors. + + We also don't want to print "Error occurred in Python command" + for user errors. However, a missing message for gdb.GdbError + exceptions is arguably a bug, so we flag it as such. */ + + if (! PyErr_GivenExceptionMatches (ptype, gdbpy_gdberror_exc) + || msg == NULL || *msg == '\0') + { + PyErr_Restore (ptype, pvalue, ptraceback); + gdbpy_print_stack (); + if (msg != NULL && *msg != '\0') + error (_("Error occurred in Python: %s"), msg.get ()); + else + error (_("Error occurred in Python.")); + } + else + { + Py_XDECREF (ptype); + Py_XDECREF (pvalue); + Py_XDECREF (ptraceback); + error ("%s", msg.get ()); + } +} diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index e32502d..1812abb 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -654,6 +654,7 @@ extern const struct language_defn *python_language; int gdbpy_print_python_errors_p (void); void gdbpy_print_stack (void); +void gdbpy_handle_exception () ATTRIBUTE_NORETURN; PyObject *python_string_to_unicode (PyObject *obj); gdb::unique_xmalloc_ptr<char> unicode_to_target_string (PyObject *unicode_str); |