aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2018-12-25 12:38:01 -0700
committerTom Tromey <tom@tromey.com>2018-12-27 13:34:39 -0700
commitbc543c902f9891f732be68817e16ff379b69566e (patch)
treef7efae208fc1ffdb36ba601b33905652550523a6
parent6ef2312a177ebdfa841e82b515c144975073a501 (diff)
downloadgdb-bc543c902f9891f732be68817e16ff379b69566e.zip
gdb-bc543c902f9891f732be68817e16ff379b69566e.tar.gz
gdb-bc543c902f9891f732be68817e16ff379b69566e.tar.bz2
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 <tom@tromey.com> * python/py-utils.c (gdbpy_handle_exception): Translate PyExc_KeyboardInterrupt to quit. gdb/testsuite/ChangeLog 2018-12-27 Tom Tromey <tom@tromey.com> * gdb.python/py-cmd.exp (test_python_inline_or_multiline): Add pagination test.
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/python/py-utils.c4
-rw-r--r--gdb/testsuite/ChangeLog5
-rw-r--r--gdb/testsuite/gdb.python/py-cmd.exp40
4 files changed, 53 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 612f82f..eea0c21 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,10 @@
2018-12-27 Tom Tromey <tom@tromey.com>
+ * python/py-utils.c (gdbpy_handle_exception): Translate
+ PyExc_KeyboardInterrupt to quit.
+
+2018-12-27 Tom Tromey <tom@tromey.com>
+
* python/python-internal.h (gdbpy_print_stack_or_quit): Declare.
* python/py-unwind.c (pyuw_sniffer): Use
gdbpy_print_stack_or_quit.
diff --git a/gdb/python/py-utils.c b/gdb/python/py-utils.c
index e0aedb5..a587644 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 47572ba..b86d625 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-12-27 Tom Tromey <tom@tromey.com>
+
+ * gdb.python/py-cmd.exp (test_python_inline_or_multiline): Add
+ pagination test.
+
2018-12-24 Andrew Burgess <andrew.burgess@embecosm.com>
* 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 33a5b39..473fce2 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 <RET>" {
+ 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
+ }
+}