From 6ef2312a177ebdfa841e82b515c144975073a501 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Tue, 25 Dec 2018 11:44:58 -0700 Subject: [PATCH] Consolidate some Python exception-printing functions A few places in the Python code would either call gdbpy_print_stack, or throw a gdb "quit", depending on the pending exception. This patch consolidates these into a helper function. gdb/ChangeLog 2018-12-27 Tom Tromey * python/python-internal.h (gdbpy_print_stack_or_quit): Declare. * python/py-unwind.c (pyuw_sniffer): Use gdbpy_print_stack_or_quit. * python/py-framefilter.c (throw_quit_or_print_exception): Remove. (gdbpy_apply_frame_filter): Use gdbpy_print_stack_or_quit. * python/python.c (gdbpy_print_stack_or_quit): New function. --- gdb/ChangeLog | 10 ++++++++++ gdb/python/py-framefilter.c | 21 +++------------------ gdb/python/py-unwind.c | 7 +------ gdb/python/python-internal.h | 1 + gdb/python/python.c | 14 ++++++++++++++ 5 files changed, 29 insertions(+), 24 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 15c59b2..612f82f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,15 @@ 2018-12-27 Tom Tromey + * python/python-internal.h (gdbpy_print_stack_or_quit): Declare. + * python/py-unwind.c (pyuw_sniffer): Use + gdbpy_print_stack_or_quit. + * python/py-framefilter.c (throw_quit_or_print_exception): + Remove. + (gdbpy_apply_frame_filter): Use gdbpy_print_stack_or_quit. + * python/python.c (gdbpy_print_stack_or_quit): New function. + +2018-12-27 Tom Tromey + * python/py-value.c (convert_value_from_python): Use gdbpy_convert_exception. * python/py-param.c (parmpy_init): Use gdbpy_convert_exception. diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c index fe17b70..b4bc413 100644 --- a/gdb/python/py-framefilter.c +++ b/gdb/python/py-framefilter.c @@ -1054,21 +1054,6 @@ bootstrap_python_frame_filters (struct frame_info *frame, return iterable.release (); } -/* A helper function that will either print an exception or, if it is - a KeyboardException, throw a quit. This can only be called when - the Python exception is set. */ - -static void -throw_quit_or_print_exception () -{ - if (PyErr_ExceptionMatches (PyExc_KeyboardInterrupt)) - { - PyErr_Clear (); - throw_quit ("Quit"); - } - gdbpy_print_stack (); -} - /* This is the only publicly exported function in this file. FRAME is the source frame to start frame-filter invocation. FLAGS is an integer holding the flags for printing. The following elements of @@ -1139,7 +1124,7 @@ gdbpy_apply_frame_filter (const struct extension_language_defn *extlang, initialization error. This return code will trigger a default backtrace. */ - throw_quit_or_print_exception (); + gdbpy_print_stack_or_quit (); return EXT_LANG_BT_NO_FILTERS; } @@ -1162,7 +1147,7 @@ gdbpy_apply_frame_filter (const struct extension_language_defn *extlang, { if (PyErr_Occurred ()) { - throw_quit_or_print_exception (); + gdbpy_print_stack_or_quit (); return EXT_LANG_BT_ERROR; } break; @@ -1196,7 +1181,7 @@ gdbpy_apply_frame_filter (const struct extension_language_defn *extlang, /* Do not exit on error printing a single frame. Print the error and continue with other frames. */ if (success == EXT_LANG_BT_ERROR) - throw_quit_or_print_exception (); + gdbpy_print_stack_or_quit (); } return success; diff --git a/gdb/python/py-unwind.c b/gdb/python/py-unwind.c index 469ae48..efef4f7 100644 --- a/gdb/python/py-unwind.c +++ b/gdb/python/py-unwind.c @@ -535,12 +535,7 @@ pyuw_sniffer (const struct frame_unwind *self, struct frame_info *this_frame, { /* If the unwinder is cancelled due to a Ctrl-C, then propagate the Ctrl-C as a GDB exception instead of swallowing it. */ - if (PyErr_ExceptionMatches (PyExc_KeyboardInterrupt)) - { - PyErr_Clear (); - quit (); - } - gdbpy_print_stack (); + gdbpy_print_stack_or_quit (); return 0; } if (pyo_unwind_info == Py_None) diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index 1ac54f9..6a0d232 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_print_stack_or_quit (); void gdbpy_handle_exception () ATTRIBUTE_NORETURN; gdbpy_ref<> python_string_to_unicode (PyObject *obj); diff --git a/gdb/python/python.c b/gdb/python/python.c index f790d48..3d0b0a0 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -1268,6 +1268,20 @@ gdbpy_print_stack (void) } } +/* Like gdbpy_print_stack, but if the exception is a + KeyboardException, throw a gdb "quit" instead. */ + +void +gdbpy_print_stack_or_quit () +{ + if (PyErr_ExceptionMatches (PyExc_KeyboardInterrupt)) + { + PyErr_Clear (); + throw_quit ("Quit"); + } + gdbpy_print_stack (); +} + /* Return a sequence holding all the Progspaces. */ -- 2.7.4