From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12158 invoked by alias); 14 Nov 2005 04:09:40 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 12150 invoked by uid 22791); 14 Nov 2005 04:09:36 -0000 Received: from viper.snap.net.nz (HELO viper.snap.net.nz) (202.37.101.8) by sourceware.org (qpsmtpd/0.30-dev) with ESMTP; Mon, 14 Nov 2005 04:09:36 +0000 Received: from kahikatea.snap.net.nz (p32-tnt1.snap.net.nz [202.124.110.32]) by viper.snap.net.nz (Postfix) with ESMTP id 6BCDE7311AE for ; Mon, 14 Nov 2005 17:09:15 +1300 (NZDT) Received: by kahikatea.snap.net.nz (Postfix, from userid 500) id 396348402; Mon, 14 Nov 2005 17:09:31 +1300 (NZDT) From: Nick Roberts MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <17272.3578.497649.130924@kahikatea.snap.net.nz> Date: Mon, 14 Nov 2005 11:34:00 -0000 To: gdb-patches@sources.redhat.com Subject: [PATCH] gdb-mi.el X-SW-Source: 2005-11/txt/msg00186.txt.bz2 Here's another patch for gdb-mi.el. OK to commit to mainline and release branch? Nick 2005-11-14 Nick Roberts * mi/gdb-mi.el (gdb-source-file-list): Declare. (gdbmi): Bind new functions. (gdbmi-var-list-children-handler, gdbmi-var-list-children-regexp): Handle string expressions properly. Move "type" field into regexp. (gdbmi-var-update-regexp, gdbmi-var-update-handler): Handle string expressions properly. Update speedbar. (gdbmi-breakpoints-buffer, gdb-stack-buffer, gdb-locals-buffer) (gdb-registers-buffer): Use def-gdb-auto-update-trigger instead of def-gdb-auto-updated-buffer as handlers is defined explicitly. (gdb-stack-list-locals-handler): Handle string expressions properly. (gdb-data-list-register-values-handler) (gdb-data-list-register-values-custom): Fontify buffer. *** gdb-mi.el 27 Oct 2005 22:35:38 +1300 1.3 --- gdb-mi.el 14 Nov 2005 16:28:37 +1300 *************** *** 58,63 **** --- 58,64 ---- (require 'gud) (require 'gdb-ui) + (defvar gdb-source-file-list nil) (defvar gdb-register-names nil "List of register names.") (defvar gdb-changed-registers nil "List of changed register numbers (strings).") *************** *** 81,87 **** Watch expressions appear in the speedbar/slowbar. ! The following interactive lisp functions help control operation : `gdb-many-windows' - Toggle the number of windows gdb uses. `gdb-restore-windows' - To restore the window layout. --- 82,88 ---- Watch expressions appear in the speedbar/slowbar. ! The following commands help control operation : `gdb-many-windows' - Toggle the number of windows gdb uses. `gdb-restore-windows' - To restore the window layout. *************** *** 90,118 **** detailed description of this mode. ! --------------------------------------------------------------------- ! GDB Toolbar ! --------------------------------------------------------------------- ! GUD buffer (I/O of GDB) | Locals buffer ! | ! | ! | ! --------------------------------------------------------------------- ! Source buffer | Input/Output (of inferior) buffer ! | (comint-mode) ! | ! | ! | ! | ! | ! | ! --------------------------------------------------------------------- ! Stack buffer | Breakpoints buffer ! RET gdb-frames-select | SPC gdb-toggle-breakpoint ! | RET gdb-goto-breakpoint ! | d gdb-delete-breakpoint ! --------------------------------------------------------------------- ! " ;; (interactive (list (gud-query-cmdline 'gdbmi))) ;; --- 91,118 ---- detailed description of this mode. ! +--------------------------------------------------------------+ ! | GDB Toolbar | ! +-------------------------------+------------------------------+ ! | GUD buffer (I/O of GDB) | Locals buffer | ! | | | ! | | | ! | | | ! +-------------------------------+------------------------------+ ! | Source buffer | I/O buffer (of inferior) | ! | | (comint-mode) | ! | | | ! | | | ! | | | ! | | | ! | | | ! | | | ! +-------------------------------+------------------------------+ ! | Stack buffer | Breakpoints buffer | ! | RET gdb-frames-select | SPC gdb-toggle-breakpoint | ! | | RET gdb-goto-breakpoint | ! | | d gdb-delete-breakpoint | ! +-------------------------------+------------------------------+" ;; (interactive (list (gud-query-cmdline 'gdbmi))) ;; *************** *** 162,169 **** 'gdb-mouse-set-clear-breakpoint) (define-key gud-minor-mode-map [left-fringe mouse-1] 'gdb-mouse-set-clear-breakpoint) (define-key gud-minor-mode-map [left-margin mouse-3] ! 'gdb-mouse-toggle-breakpoint) (setq comint-input-sender 'gdbmi-send) ;; --- 162,175 ---- 'gdb-mouse-set-clear-breakpoint) (define-key gud-minor-mode-map [left-fringe mouse-1] 'gdb-mouse-set-clear-breakpoint) + (define-key gud-minor-mode-map [left-fringe mouse-2] + 'gdb-mouse-until) + (define-key gud-minor-mode-map [left-fringe drag-mouse-1] + 'gdb-mouse-until) (define-key gud-minor-mode-map [left-margin mouse-3] ! 'gdb-mouse-toggle-breakpoint-margin) ! (define-key gud-minor-mode-map [left-fringe mouse-3] ! 'gdb-mouse-toggle-breakpoint-fringe) (setq comint-input-sender 'gdbmi-send) ;; *************** *** 223,230 **** `(lambda () (gdbmi-var-list-children-handler ,varnum))))) (defconst gdbmi-var-list-children-regexp ! "name=\"\\(.*?\\)\",exp=\"\\(.*?\\)\",numchild=\"\\(.*?\\)\",\ ! value=\"\\(.*?\\)\"") (defun gdbmi-var-list-children-handler (varnum) (with-current-buffer (gdb-get-create-buffer 'gdb-partial-output-buffer) --- 229,236 ---- `(lambda () (gdbmi-var-list-children-handler ,varnum))))) (defconst gdbmi-var-list-children-regexp ! "name=\"\\(.+?\\)\",exp=\"\\(.+?\\)\",numchild=\"\\(.+?\\)\",\ ! value=\\(\".*?\"\\),type=\"\\(.+?\\)\"}") (defun gdbmi-var-list-children-handler (varnum) (with-current-buffer (gdb-get-create-buffer 'gdb-partial-output-buffer) *************** *** 239,249 **** (let ((varchild (list (match-string 2) (match-string 1) (match-string 3) ! nil ! (match-string 4) nil))) - (if (looking-at ",type=\"\\(.*?\\)\"") - (setcar (nthcdr 3 varchild) (match-string 1))) (dolist (var1 gdb-var-list) (if (string-equal (cadr var1) (cadr varchild)) (throw 'child-already-watched nil))) --- 245,253 ---- (let ((varchild (list (match-string 2) (match-string 1) (match-string 3) ! (match-string 5) ! (read (match-string 4)) nil))) (dolist (var1 gdb-var-list) (if (string-equal (cadr var1) (cadr varchild)) (throw 'child-already-watched nil))) *************** *** 257,280 **** (gdb-enqueue-input (list "-var-update --all-values *\n" 'gdbmi-var-update-handler))) ! (defconst gdbmi-var-update-regexp "name=\"\\(.*?\\)\",value=\"\\(.*?\\)\"") (defun gdbmi-var-update-handler () (with-current-buffer (gdb-get-create-buffer 'gdb-partial-output-buffer) (goto-char (point-min)) (while (re-search-forward gdbmi-var-update-regexp nil t) (let ((varnum (match-string 1))) ! (catch 'var-found1 (let ((num 0)) (dolist (var gdb-var-list) (if (string-equal varnum (cadr var)) (progn (setcar (nthcdr 5 var) t) ! (setcar (nthcdr 4 var) (match-string 2)) (setcar (nthcdr num gdb-var-list) var) ! (throw 'var-found1 nil))) (setq num (+ num 1)))))) ! (setq gdb-var-changed t)))) (defun gdbmi-send (proc string) "A comint send filter for gdb." --- 261,286 ---- (gdb-enqueue-input (list "-var-update --all-values *\n" 'gdbmi-var-update-handler))) ! (defconst gdbmi-var-update-regexp "name=\"\\(.*?\\)\",value=\\(\".*\"\\),") (defun gdbmi-var-update-handler () (with-current-buffer (gdb-get-create-buffer 'gdb-partial-output-buffer) (goto-char (point-min)) (while (re-search-forward gdbmi-var-update-regexp nil t) (let ((varnum (match-string 1))) ! (catch 'var-found-1 (let ((num 0)) (dolist (var gdb-var-list) (if (string-equal varnum (cadr var)) (progn (setcar (nthcdr 5 var) t) ! (setcar (nthcdr 4 var) (read (match-string 2))) (setcar (nthcdr num gdb-var-list) var) ! (throw 'var-found-1 nil))) (setq num (+ num 1)))))) ! (setq gdb-var-changed t))) ! (with-current-buffer gud-comint-buffer ! (speedbar-timer-fn))) (defun gdbmi-send (proc string) "A comint send filter for gdb." *************** *** 454,476 **** ;; Breakpoint buffer : This displays the output of `-break-list'. ;; ! (def-gdb-auto-updated-buffer gdb-breakpoints-buffer ! ;; This defines the auto update rule for buffers of type ! ;; `gdb-breakpoints-buffer'. ! ;; ! ;; It defines a function that queues the command below. That function is ! ;; called: ! gdbmi-invalidate-breakpoints ! ;; ! ;; To update the buffer, this command is sent to gdb. "-break-list\n" ! ;; ! ;; This also defines a function to be the handler for the output ! ;; from the command above. That function will copy the output into ! ;; the appropriately typed buffer. That function will be called: ! gdb-break-list-handler ! ;; buffer specific functions ! gdb-break-list-custom) (defconst gdb-break-list-regexp "number=\"\\(.*?\\)\",type=\"\\(.*?\\)\",disp=\"\\(.*?\\)\",enabled=\"\\(.\\)\",\ --- 460,469 ---- ;; Breakpoint buffer : This displays the output of `-break-list'. ;; ! (def-gdb-auto-update-trigger gdbmi-invalidate-breakpoints ! (gdb-get-buffer 'gdb-breakpoints-buffer) "-break-list\n" ! gdb-break-list-handler) (defconst gdb-break-list-regexp "number=\"\\(.*?\\)\",type=\"\\(.*?\\)\",disp=\"\\(.*?\\)\",enabled=\"\\(.\\)\",\ *************** *** 560,565 **** --- 553,560 ---- (end-of-line))) (if (gdb-get-buffer 'gdb-assembler-buffer) (gdb-assembler-custom))) + (defvar gdb-source-file-regexp "fullname=\"\\(.*?\\)\"") + (defun gdbmi-get-location (bptno line flag) "Find the directory containing the relevant source file. Put in buffer and place breakpoint icon." *************** *** 586,596 **** ;; Frames buffer. This displays a perpetually correct bactrack trace. ;; ! (def-gdb-auto-updated-buffer gdb-stack-buffer ! gdbmi-invalidate-frames "-stack-list-frames\n" ! gdb-stack-list-frames-handler ! gdb-stack-list-frames-custom) (defconst gdb-stack-list-frames-regexp "level=\"\\(.*?\\)\",addr=\"\\(.*?\\)\",func=\"\\(.*?\\)\",\ --- 581,591 ---- ;; Frames buffer. This displays a perpetually correct bactrack trace. ;; ! (def-gdb-auto-update-trigger gdbmi-invalidate-frames ! (gdb-get-buffer 'gdb-stack-buffer) "-stack-list-frames\n" ! gdb-stack-list-frames-handler) ! (defconst gdb-stack-list-frames-regexp "level=\"\\(.*?\\)\",addr=\"\\(.*?\\)\",func=\"\\(.*?\\)\",\ *************** *** 644,654 **** ;; Locals buffer. ;; uses "-stack-list-locals --simple-values". Needs GDB 6.1 onwards. ! (def-gdb-auto-updated-buffer gdb-locals-buffer ! gdbmi-invalidate-locals "-stack-list-locals --simple-values\n" ! gdb-stack-list-locals-handler ! gdb-stack-list-locals-custom) (defconst gdb-stack-list-locals-regexp (concat "name=\"\\(.*?\\)\",type=\"\\(.*?\\)\"")) --- 639,648 ---- ;; Locals buffer. ;; uses "-stack-list-locals --simple-values". Needs GDB 6.1 onwards. ! (def-gdb-auto-update-trigger gdbmi-invalidate-locals ! (gdb-get-buffer 'gdb-locals-buffer) "-stack-list-locals --simple-values\n" ! gdb-stack-list-locals-handler) (defconst gdb-stack-list-locals-regexp (concat "name=\"\\(.*?\\)\",type=\"\\(.*?\\)\"")) *************** *** 666,677 **** (let ((local (list (match-string 1) (match-string 2) nil))) ! (if (looking-at ",value=\"\\(.*?\\)\"") ! (setcar (nthcdr 2 local) (match-string 1))) (push local locals-list)))) (let ((buf (gdb-get-buffer 'gdb-locals-buffer))) (and buf (with-current-buffer buf ! (let ((p (window-point (get-buffer-window buf 0))) (buffer-read-only nil)) (erase-buffer) (dolist (local locals-list) --- 660,672 ---- (let ((local (list (match-string 1) (match-string 2) nil))) ! (if (looking-at ",value=\\(\".*\"\\)}") ! (setcar (nthcdr 2 local) (read (match-string 1)))) (push local locals-list)))) (let ((buf (gdb-get-buffer 'gdb-locals-buffer))) (and buf (with-current-buffer buf ! (let* ((window (get-buffer-window buf 0)) ! (p (window-point window)) (buffer-read-only nil)) (erase-buffer) (dolist (local locals-list) *************** *** 682,700 **** "(structure)" "(array)")) "\n"))) ! (set-window-point (get-buffer-window buf 0) p))))))) ! ! (defun gdb-stack-list-locals-custom () ! nil) ;; Registers buffer. ;; ! (def-gdb-auto-updated-buffer gdb-registers-buffer ! gdbmi-invalidate-registers "-data-list-register-values x\n" ! gdb-data-list-register-values-handler ! gdb-data-list-register-values-custom) (defconst gdb-data-list-register-values-regexp "number=\"\\(.*?\\)\",value=\"\\(.*?\\)\"") --- 677,691 ---- "(structure)" "(array)")) "\n"))) ! (set-window-point window p))))))) ;; Registers buffer. ;; ! (def-gdb-auto-update-trigger gdbmi-invalidate-registers ! (gdb-get-buffer 'gdb-registers-buffer) "-data-list-register-values x\n" ! gdb-data-list-register-values-handler) (defconst gdb-data-list-register-values-regexp "number=\"\\(.*?\\)\",value=\"\\(.*?\\)\"") *************** *** 731,739 **** (buffer-read-only nil)) (erase-buffer) (insert register-values) ! (set-window-point (get-buffer-window buf 0) p)))))))) ! (defun gdb-data-list-register-values-custom ()) (defun gdb-get-changed-registers () (if (and (gdb-get-buffer 'gdb-registers-buffer) --- 722,742 ---- (buffer-read-only nil)) (erase-buffer) (insert register-values) ! (set-window-point (get-buffer-window buf 0) p))))))) ! (gdb-data-list-register-values-custom)) ! (defun gdb-data-list-register-values-custom () ! (with-current-buffer (gdb-get-buffer 'gdb-registers-buffer) ! (save-excursion ! (let ((buffer-read-only nil) ! bl) ! (goto-char (point-min)) ! (while (< (point) (point-max)) ! (setq bl (line-beginning-position)) ! (when (looking-at "^[^\t]+") ! (put-text-property bl (match-end 0) ! 'face font-lock-variable-name-face)) ! (forward-line 1)))))) (defun gdb-get-changed-registers () (if (and (gdb-get-buffer 'gdb-registers-buffer) *************** *** 745,750 **** --- 748,755 ---- 'gdb-get-changed-registers-handler)) (push 'gdb-get-changed-registers gdb-pending-triggers)))) + (defconst gdb-data-list-register-names-regexp "\"\\(.*?\\)\"") + (defun gdb-get-changed-registers-handler () (setq gdb-pending-triggers (delq 'gdb-get-changed-registers gdb-pending-triggers)) *************** *** 754,762 **** (while (re-search-forward gdb-data-list-register-names-regexp nil t) (push (match-string 1) gdb-changed-registers)))) - - (defconst gdb-data-list-register-names-regexp "\"\\(.*?\\)\"") - (defun gdb-get-register-names () "Create a list of register names." (goto-char (point-min)) --- 759,764 ---- *************** *** 767,775 **** ;; these functions/variables may go into gdb-ui.el in the near future ;; (from gdb-nui.el) - (defvar gdb-source-file-list nil) - (defvar gdb-source-file-regexp "fullname=\"\\(.*?\\)\"") - (defun gdb-get-source-file () "Find the source file where the program starts and display it with related buffers, if required." --- 769,774 ----