From: Eli Zaretskii Date: Sat, 10 Jun 2017 08:29:58 +0000 (+0300) Subject: Fix handling of Python/Guile commands with arguments in gdb-mi.el X-Git-Tag: emacs-26.0.90~521^2~138 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=30c0f81f9faca5df012a93b6b0dc9cab5a7de65d;p=emacs.git Fix handling of Python/Guile commands with arguments in gdb-mi.el * lisp/progmodes/gdb-mi.el (gdb-python-guile-commands-regexp): New variable. (gdb-control-commands-regexp): Use it. (gdb-send): Don't increment gdb-control-level if the command matches gdb-python-guile-commands-regexp and has non-empty arguments. Reported by David Boles in http://lists.gnu.org/archive/html/emacs-devel/2017-06/msg00009.html. --- diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el index 1af520dbc32..cc9205c0d8a 100644 --- a/lisp/progmodes/gdb-mi.el +++ b/lisp/progmodes/gdb-mi.el @@ -1767,13 +1767,17 @@ static char *magick[] = { :group 'gdb) +(defvar gdb-python-guile-commands-regexp + "python\\|python-interactive\\|pi\\|guile\\|guile-repl\\|gr" + "Regexp that matches Python and Guile commands supported by GDB.") + (defvar gdb-control-commands-regexp (concat "^\\(" "commands\\|if\\|while\\|define\\|document\\|" - "python\\|python-interactive\\|pi\\|guile\\|guile-repl\\|gr\\|" - "while-stepping\\|stepping\\|ws\\|actions" - "\\)\\([[:blank:]]+.*\\)?$") + gdb-python-guile-commands-regexp + "\\|while-stepping\\|stepping\\|ws\\|actions" + "\\)\\([[:blank:]]+\\([^[:blank:]]*\\)\\)?$") "Regexp matching GDB commands that enter a recursive reading loop. As long as GDB is in the recursive reading loop, it does not expect commands to be prefixed by \"-interpreter-exec console\".") @@ -1831,8 +1835,17 @@ commands to be prefixed by \"-interpreter-exec console\".") (> gdb-control-level 0)) (setq gdb-control-level (1- gdb-control-level))) (setq gdb-continuation nil))) - (if (string-match gdb-control-commands-regexp string) - (setq gdb-control-level (1+ gdb-control-level)))) + ;; Python and Guile commands that have an argument don't enter the + ;; recursive reading loop. + (let* ((control-command-p (string-match gdb-control-commands-regexp string)) + (command-arg (match-string 3 string)) + (python-or-guile-p (string-match gdb-python-guile-commands-regexp + string))) + (if (and control-command-p + (or (not python-or-guile-p) + (null command-arg) + (zerop (length command-arg)))) + (setq gdb-control-level (1+ gdb-control-level))))) (defun gdb-mi-quote (string) "Return STRING quoted properly as an MI argument.