]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix bug #11279 with sending command blocks to GDB.
authorEli Zaretskii <eliz@gnu.org>
Fri, 20 Apr 2012 10:09:40 +0000 (13:09 +0300)
committerEli Zaretskii <eliz@gnu.org>
Fri, 20 Apr 2012 10:09:40 +0000 (13:09 +0300)
 lisp/progmodes/gdb-mi.el (gdb-control-level): New variable.
 (gdb): Make it buffer-local and init to zero.
 (gdb-control-commands-regexp): New variable.
 (gdb-send): Don't wrap in "-interpreter-exec console" if
 gdb-control-level is positive.  Increment gdb-control-level
 whenever the command matches gdb-control-commands-regexp, and
 decrement it each time the command is "end".  (Bug#11279)

lisp/ChangeLog
lisp/progmodes/gdb-mi.el

index e139a7b2bba26ada057a71d4091c0f4e7fc22c12..c5c4d2573b1b47f74295940e4b617d9b3075c2e8 100644 (file)
@@ -1,3 +1,13 @@
+2012-04-20  Eli Zaretskii  <eliz@gnu.org>
+
+       * progmodes/gdb-mi.el (gdb-control-level): New variable.
+       (gdb): Make it buffer-local and init to zero.
+       (gdb-control-commands-regexp): New variable.
+       (gdb-send): Don't wrap in "-interpreter-exec console" if
+       gdb-control-level is positive.  Increment gdb-control-level
+       whenever the command matches gdb-control-commands-regexp, and
+       decrement it each time the command is "end".  (Bug#11279)
+
 2012-04-20  Martin Rudalics  <rudalics@gmx.at>
 
        * window.el (adjust-window-trailing-edge, enlarge-window)
index f2d8f1f75b7e49ac0005d6d01efc227410d86b83..b19c828d1710226d4da6cd258e52c1898995c865 100644 (file)
@@ -603,6 +603,8 @@ NOARG must be t when this macro is used outside `gud-def'"
         (set (make-local-variable 'gud-marker-filter) #'gud-gdb-marker-filter))
       (funcall filter proc string))))
 
+(defvar gdb-control-level 0)
+
 ;;;###autoload
 (defun gdb (command-line)
   "Run gdb on program FILE in buffer *gud-FILE*.
@@ -677,6 +679,7 @@ detailed description of this mode.
     (set-process-filter proc #'gdb--check-interpreter))
 
   (set (make-local-variable 'gud-minor-mode) 'gdbmi)
+  (set (make-local-variable 'gdb-control-level) 0)
   (setq comint-input-sender 'gdb-send)
   (when (ring-empty-p comint-input-ring) ; cf shell-mode
     (let ((hfile (expand-file-name (or (getenv "GDBHISTFILE")
@@ -1700,6 +1703,16 @@ static char *magick[] = {
   :group 'gdb)
 
 \f
+(defvar gdb-control-commands-regexp
+  (concat
+   "^\\("
+   "commands\\|if\\|while\\|define\\|document\\|python\\|"
+   "while-stepping\\|stepping\\|ws\\|actions"
+   "\\)\\([[: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\".")
+
 (defun gdb-send (proc string)
   "A comint send filter for gdb."
   (with-current-buffer gud-comint-buffer
@@ -1709,11 +1722,15 @@ static char *magick[] = {
   (if (not (string= "" string))
       (setq gdb-last-command string)
     (if gdb-last-command (setq string gdb-last-command)))
-  (if (string-match "^-" string)
-      ;; MI command
+  (if (or (string-match "^-" string)
+         (> gdb-control-level 0))
+      ;; Either MI command or we are feeding GDB's recursive reading loop.
       (progn
        (setq gdb-first-done-or-error t)
-       (process-send-string proc (concat string "\n")))
+       (process-send-string proc (concat string "\n"))
+       (if (and (string-match "^end$" string)
+                (> gdb-control-level 0))
+           (setq gdb-control-level (1- gdb-control-level))))
     ;; CLI command
     (if (string-match "\\\\$" string)
        (setq gdb-continuation (concat gdb-continuation string "\n"))
@@ -1724,7 +1741,12 @@ static char *magick[] = {
         (if gdb-enable-debug
             (push (cons 'mi-send to-send) gdb-debug-log))
         (process-send-string proc to-send))
-      (setq gdb-continuation nil))))
+      (if (and (string-match "^end$" string)
+              (> 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))))
 
 (defun gdb-mi-quote (string)
   "Return STRING quoted properly as an MI argument.