From bc543c902f9891f732be68817e16ff379b69566e Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Tue, 25 Dec 2018 12:38:01 -0700 Subject: [PATCH] Translate PyExc_KeyboardInterrupt to gdb "quit" A while back I typed "info pretty-printers" with a large number of printers installed, and I typed "q" to stop the pagination. I noticed that gdb printed a Python exception in this case. It seems to me that, instead, quitting pagination (or control-c'ing a Python command generally) should be handled the same way that gdb normally handles a quit. This patch implements this idea by changing gdbpy_handle_exception to treat PyExc_KeyboardInterrupt specially. gdb/ChangeLog 2018-12-27 Tom Tromey * python/py-utils.c (gdbpy_handle_exception): Translate PyExc_KeyboardInterrupt to quit. gdb/testsuite/ChangeLog 2018-12-27 Tom Tromey * gdb.python/py-cmd.exp (test_python_inline_or_multiline): Add pagination test. --- gdb/ChangeLog | 5 ++++ gdb/python/py-utils.c | 4 ++- gdb/testsuite/ChangeLog | 5 ++++ gdb/testsuite/gdb.python/py-cmd.exp | 40 +++++++++++++++++++++++++++++ 4 files changed, 53 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 612f82ff7bf..eea0c21d17b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2018-12-27 Tom Tromey + + * python/py-utils.c (gdbpy_handle_exception): Translate + PyExc_KeyboardInterrupt to quit. + 2018-12-27 Tom Tromey * python/python-internal.h (gdbpy_print_stack_or_quit): Declare. diff --git a/gdb/python/py-utils.c b/gdb/python/py-utils.c index e0aedb5b58e..a587644e226 100644 --- a/gdb/python/py-utils.c +++ b/gdb/python/py-utils.c @@ -422,7 +422,9 @@ gdbpy_handle_exception () 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) + if (PyErr_GivenExceptionMatches (ptype, PyExc_KeyboardInterrupt)) + throw_quit ("Quit"); + else if (! PyErr_GivenExceptionMatches (ptype, gdbpy_gdberror_exc) || msg == NULL || *msg == '\0') { PyErr_Restore (ptype, pvalue, ptraceback); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 47572ba14ac..b86d6257def 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-12-27 Tom Tromey + + * gdb.python/py-cmd.exp (test_python_inline_or_multiline): Add + pagination test. + 2018-12-24 Andrew Burgess * gdb.dwarf2/dw2-unusual-field-names.c: New file. diff --git a/gdb/testsuite/gdb.python/py-cmd.exp b/gdb/testsuite/gdb.python/py-cmd.exp index 33a5b39842e..473fce23e87 100644 --- a/gdb/testsuite/gdb.python/py-cmd.exp +++ b/gdb/testsuite/gdb.python/py-cmd.exp @@ -261,3 +261,43 @@ if { [readline_is_used] } { } } } + + +# Test that interrupting pagination throws a gdb quit. +gdb_test_no_output "set height 10" + +gdb_py_test_multiple "input multi-line-output command" \ + "python" "" \ + "class test_mline (gdb.Command):" "" \ + " \"\"\"Docstring\"\"\"" "" \ + " def __init__ (self):" "" \ + " super (test_mline, self).__init__ (\"test_multiline\", gdb.COMMAND_USER)" "" \ + " def invoke (self, arg, from_tty):" "" \ + " for f in range(20):" "" \ + " print (\"test_multiline output\")" "" \ + "test_mline ()" "" \ + "end" "" + +set test "verify pagination from test_multiline" +gdb_test_multiple "test_multiline" $test { + -re "--Type " { + exp_continue + } + -re " for more, q to quit" { + exp_continue + } + -re ", c to continue without paging--$" { + pass $test + } +} + +send_gdb "q\n" +set test "verify pagination from test_multiline: q" +gdb_test_multiple "test_multiline" $test { + -re "Error occurred in Python" { + fail $test + } + -re "Quit" { + pass $test + } +} -- 2.30.2