Throw a "quit" on a KeyboardException in py-framefilter.c
[deliverable/binutils-gdb.git] / gdb / python / py-framefilter.c
index 28d5c37b25bdb4b59e659f8c1ad15b19503d3cc9..0662e689416647dab17bb7f13e91228d9cddaee5 100644 (file)
@@ -1305,6 +1305,21 @@ 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
@@ -1375,7 +1390,7 @@ gdbpy_apply_frame_filter (const struct extension_language_defn *extlang,
         initialization error.  This return code will trigger a
         default backtrace.  */
 
-      gdbpy_print_stack ();
+      throw_quit_or_print_exception ();
       return EXT_LANG_BT_NO_FILTERS;
     }
 
@@ -1398,7 +1413,7 @@ gdbpy_apply_frame_filter (const struct extension_language_defn *extlang,
        {
          if (PyErr_Occurred ())
            {
-             gdbpy_print_stack ();
+             throw_quit_or_print_exception ();
              return EXT_LANG_BT_ERROR;
            }
          break;
@@ -1423,7 +1438,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)
-       gdbpy_print_stack ();
+       throw_quit_or_print_exception ();
     }
 
   return success;
This page took 0.037415 seconds and 4 git commands to generate.