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 15c59b2de96..612f82ff7bf 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +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 diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c index fe17b70f53d..b4bc41306bf 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 469ae489f43..efef4f7e0fe 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 1ac54f9b57a..6a0d2328ed3 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 f790d48cc22..3d0b0a0cc71 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.30.2