diff lisp/progmodes/gdb-ui.el @ 90737:95d0cdf160ea

Merge from emacs--devo--0 Patches applied: * emacs--devo--0 (patch 586-614) - Update from CVS - Update from erc--emacs--22 - Merge from gnus--rel--5.10 - Merge from erc--main--0 - Make byte compiler correctly write circular constants * gnus--rel--5.10 (patch 186-196) - Update from CVS - Merge from emacs--devo--0 Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-162
author Miles Bader <miles@gnu.org>
date Fri, 26 Jan 2007 06:16:11 +0000
parents bc10a33dd40b bab23bcfde6e
children f83d17e1ace6
line wrap: on
line diff
--- a/lisp/progmodes/gdb-ui.el	Fri Jan 26 02:30:28 2007 +0000
+++ b/lisp/progmodes/gdb-ui.el	Fri Jan 26 06:16:11 2007 +0000
@@ -4,7 +4,7 @@
 ;; Maintainer: FSF
 ;; Keywords: unix, tools
 
-;; Copyright (C) 2002, 2003, 2004, 2005, 2006
+;; Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007
 ;; Free Software Foundation, Inc.
 
 ;; This file is part of GNU Emacs.
@@ -123,9 +123,10 @@
 (defvar gdb-server-prefix nil)
 (defvar gdb-flush-pending-output nil)
 (defvar gdb-location-alist nil
-  "Alist of breakpoint numbers and full filenames.")
-(defvar gdb-active-process nil "GUD tooltips display variable values when t, \
-and #define directives otherwise.")
+  "Alist of breakpoint numbers and full filenames.  Only used for files that
+Emacs can't find.")
+(defvar gdb-active-process nil
+  "GUD tooltips display variable values when t, and macro definitions otherwise.")
 (defvar gdb-error "Non-nil when GDB is reporting an error.")
 (defvar gdb-macro-info nil
   "Non-nil if GDB knows that the inferior includes preprocessor macro info.")
@@ -273,19 +274,22 @@
   (gdb command-line)
   (gdb-init-1))
 
-(defcustom gdb-debug-ring-max 128
-  "Maximum size of `gdb-debug-ring'."
+(defcustom gdb-debug-log-max 128
+  "Maximum size of `gdb-debug-log'.  If nil, size is unlimited."
   :group 'gud
-  :type 'integer
+  :type '(choice (integer :tag "Number of elements")
+		 (const   :tag "Unlimited" nil))
   :version "22.1")
 
-(defvar gdb-debug-ring nil
-  "List of commands, most recent first, sent to and replies received from GDB.
-This variable is used to debug GDB-UI.")
+(defvar gdb-debug-log nil
+  "List of commands sent to and replies received from GDB.  Most
+recent commands are listed first.  This list stores only the last
+'gdb-debug-log-max' values.  This variable is used to debug
+GDB-UI.")
 
 ;;;###autoload
 (defcustom gdb-enable-debug nil
-  "Non-nil means record the process input and output in `gdb-debug-ring'."
+  "Non-nil means record the process input and output in `gdb-debug-log'."
   :type 'boolean
   :group 'gud
   :version "22.1")
@@ -316,7 +320,7 @@
   :version "22.1")
 
 (defcustom gdb-many-windows nil
-  "If nil just pop up the GUD buffer unless `gdb-show-main' is t.
+  "If nil, just pop up the GUD buffer unless `gdb-show-main' is t.
 In this case start with two windows: one displaying the GUD
 buffer and the other with the source file with the main routine
 of the debugged program.  Non-nil means display the layout shown
@@ -550,7 +554,7 @@
 	gdb-error nil
 	gdb-macro-info nil
 	gdb-buffer-fringe-width (car (window-fringes))
-	gdb-debug-ring nil
+	gdb-debug-log nil
 	gdb-signalled nil
 	gdb-source-window nil
 	gdb-inferior-status nil
@@ -721,7 +725,7 @@
       (message "gud-watch is a no-op in this mode."))))
 
 (defconst gdb-var-create-regexp
-  "name=\"\\(.*?\\)\",.*numchild=\"\\(.*?\\)\",.*type=\"\\(.*?\\)\"")
+  "name=\"\\(.*?\\)\",.*numchild=\"\\(.*?\\)\",\\(?:.*value=\\(\".*\"\\),\\)?.*type=\"\\(.*?\\)\"")
 
 (defun gdb-var-create-handler (expr)
   (goto-char (point-min))
@@ -733,20 +737,23 @@
 		      (setq expr (concat gdb-selected-frame "::" expr))
 		    expr)
 		  (match-string 2)
-		  (match-string 3)
-		  nil nil gdb-frame-address)))
+		  (match-string 4)
+		  (if (match-string 3) (read (match-string 3)))
+		   nil gdb-frame-address)))
 	(push var gdb-var-list)
 	(unless (string-equal
 		 speedbar-initial-expansion-list-name "GUD")
 	  (speedbar-change-initial-expansion-list "GUD"))
-	(gdb-enqueue-input
-	 (list
-	  (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba)
-	      (concat "server interpreter mi \"0-var-evaluate-expression "
-		      (car var) "\"\n")
-	    (concat "0-var-evaluate-expression " (car var) "\n"))
-	  `(lambda () (gdb-var-evaluate-expression-handler
-		       ,(car var) nil)))))
+	(unless (nth 4 var)
+	  (gdb-enqueue-input
+	   (list
+	    (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer)
+		    'gdba)
+		(concat "server interpreter mi \"0-var-evaluate-expression "
+			(car var) "\"\n")
+	      (concat "0-var-evaluate-expression " (car var) "\n"))
+	      `(lambda () (gdb-var-evaluate-expression-handler
+			   ,(car var) nil))))))
     (if (search-forward "Undefined command" nil t)
 	(message-box "Watching expressions requires GDB 6.0 onwards")
       (message-box "No symbol \"%s\" in current context." expr))))
@@ -896,6 +903,12 @@
   :group 'gud
   :version "22.1")
 
+(defcustom gdb-max-children 40
+  "Maximum number of children before expansion requires confirmation."
+  :type 'integer
+  :group 'gud
+  :version "22.1")
+
 (defun gdb-speedbar-expand-node (text token indent)
   "Expand the node the user clicked on.
 TEXT is the text of the button we clicked on, a + or - item.
@@ -904,11 +917,17 @@
   (if (and gud-comint-buffer (buffer-name gud-comint-buffer))
       (progn
 	(cond ((string-match "+" text)	;expand this node
-	       (if (and (eq (buffer-local-value
-			     'gud-minor-mode gud-comint-buffer) 'gdba)
-			(string-equal gdb-version "pre-6.4"))
-		   (gdb-var-list-children token)
-		 (gdb-var-list-children-1 token)))
+	       (let* ((var (assoc token gdb-var-list))
+		      (expr (nth 1 var)) (children (nth 2 var)))
+		 (if (or (<= (string-to-number children) gdb-max-children)
+			  (y-or-n-p
+			   (format
+			    "%s has %s children. Continue? " expr children)))
+		     (if (and (eq (buffer-local-value
+				   'gud-minor-mode gud-comint-buffer) 'gdba)
+			      (string-equal gdb-version "pre-6.4"))
+			 (gdb-var-list-children token)
+		       (gdb-var-list-children-1 token)))))
 	      ((string-match "-" text)	;contract this node
 	       (dolist (var gdb-var-list)
 		 (if (string-match (concat token "\\.") (car var))
@@ -1118,7 +1137,7 @@
     (if gud-running
 	(progn
 	  (let ((item (concat string "\n")))
-	    (if gdb-enable-debug (push (cons 'send item) gdb-debug-ring))
+	    (if gdb-enable-debug (push (cons 'send item) gdb-debug-log))
 	    (process-send-string proc item)))
       (if (and (string-match "\\\\$" string)
 	       (not comint-input-sender-no-newline)) ;;Try to catch C-d.
@@ -1147,7 +1166,7 @@
 
 (defun gdb-send-item (item)
   (setq gdb-flush-pending-output nil)
-  (if gdb-enable-debug (push (cons 'send-item item) gdb-debug-ring))
+  (if gdb-enable-debug (push (cons 'send-item item) gdb-debug-log))
   (setq gdb-current-item item)
   (let ((process (get-buffer-process gud-comint-buffer)))
     (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba)
@@ -1498,9 +1517,10 @@
   (if gdb-flush-pending-output
       nil
     (when gdb-enable-debug
-	(push (cons 'recv string) gdb-debug-ring)
-	(if (> (length gdb-debug-ring) gdb-debug-ring-max)
-	  (setcdr (nthcdr (1- gdb-debug-ring-max) gdb-debug-ring) nil)))
+	(push (cons 'recv string) gdb-debug-log)
+	(if (and gdb-debug-log-max
+		 (> (length gdb-debug-log) gdb-debug-log-max))
+	    (setcdr (nthcdr (1- gdb-debug-log-max) gdb-debug-log) nil)))
     ;; Recall the left over gud-marker-acc from last time.
     (setq gud-marker-acc (concat gud-marker-acc string))
     ;; Start accumulating output for the GUD buffer.
@@ -2017,13 +2037,19 @@
 ;;
 ;; Alas, if your stack is deep, it is costly.
 ;;
+(defcustom gdb-max-frames 40
+  "Maximum number of frames displayed in call stack."
+  :type 'integer
+  :group 'gud
+  :version "22.1")
+
 (gdb-set-buffer-rules 'gdb-stack-buffer
 		      'gdb-stack-buffer-name
 		      'gdb-frames-mode)
 
 (def-gdb-auto-updated-buffer gdb-stack-buffer
   gdb-invalidate-frames
-  "server info stack\n"
+  (concat "server info stack " (number-to-string gdb-max-frames) "\n")
   gdb-info-stack-handler
   gdb-info-stack-custom)
 
@@ -2065,7 +2091,14 @@
 		(while (re-search-forward "\\(\\(\\sw\\|[_.]\\)+\\)=" el t)
 		  (put-text-property (match-beginning 1) (match-end 1)
 				     'face font-lock-variable-name-face))))
-	    (forward-line 1))))
+	    (forward-line 1))
+	  (forward-line -1)
+	  (when (looking-at "(More stack frames follow...)")
+	    (add-text-properties (match-beginning 0) (match-end 0)
+	     '(mouse-face highlight
+	       gdb-max-frames t
+	       help-echo
+               "mouse-2, RET: customize gdb-max-frames to see more frames")))))
       (when gdb-look-up-stack
 	    (goto-char (point-min))
 	    (when (re-search-forward "\\(\\S-+?\\):\\([0-9]+\\)" nil t)
@@ -2135,16 +2168,21 @@
     (end-of-line)
     (let* ((start (line-beginning-position))
 	   (pos (re-search-backward "^#*\\([0-9]+\\)" start t))
-	   (n (or (and pos (match-string-no-properties 1)) "0")))
+	   (n (or (and pos (match-string 1)) "0")))
       n)))
 
 (defun gdb-frames-select (&optional event)
   "Select the frame and display the relevant source."
   (interactive (list last-input-event))
   (if event (posn-set-point (event-end event)))
-  (gdb-enqueue-input
-   (list (concat gdb-server-prefix "frame "
-		 (gdb-get-frame-number) "\n") 'ignore)))
+  (if (get-text-property (point) 'gdb-max-frames)
+      (progn
+	(message-box "After setting gdb-max-frames, you need to enter\n\
+another GDB command e.g pwd, to see new frames")
+      (customize-variable-other-window 'gdb-max-frames))
+    (gdb-enqueue-input
+     (list (concat gdb-server-prefix "frame "
+		   (gdb-get-frame-number) "\n") 'ignore))))
 
 
 ;; Threads buffer.  This displays a selectable thread list.
@@ -2569,7 +2607,7 @@
 	   (propertize
 	    "-"
 	    'face font-lock-warning-face
-	    'help-echo "mouse-1: Decrement address"
+	    'help-echo "mouse-1: decrement address"
 	    'mouse-face 'mode-line-highlight
 	    'local-map
 	    (gdb-make-header-line-mouse-map
@@ -2589,7 +2627,7 @@
 	   "|"
 	   (propertize "+"
 		       'face font-lock-warning-face
-		       'help-echo "mouse-1: Increment address"
+		       'help-echo "mouse-1: increment address"
 		       'mouse-face 'mode-line-highlight
 		       'local-map (gdb-make-header-line-mouse-map
 				   'mouse-1
@@ -2599,7 +2637,7 @@
 	   "]: "
 	   (propertize gdb-memory-address
 		       'face font-lock-warning-face
-		       'help-echo "mouse-1: Set memory address"
+		       'help-echo "mouse-1: set memory address"
 		       'mouse-face 'mode-line-highlight
 		       'local-map (gdb-make-header-line-mouse-map
 				   'mouse-1
@@ -2607,7 +2645,7 @@
 	   "  Repeat Count: "
 	   (propertize (number-to-string gdb-memory-repeat-count)
 		       'face font-lock-warning-face
-		       'help-echo "mouse-1: Set repeat count"
+		       'help-echo "mouse-1: set repeat count"
 		       'mouse-face 'mode-line-highlight
 		       'local-map (gdb-make-header-line-mouse-map
 				   'mouse-1
@@ -2615,13 +2653,13 @@
 	   "  Display Format: "
 	   (propertize gdb-memory-format
 		       'face font-lock-warning-face
-		       'help-echo "mouse-3: Select display format"
+		       'help-echo "mouse-3: select display format"
 		       'mouse-face 'mode-line-highlight
 		       'local-map gdb-memory-format-map)
 	   "  Unit Size: "
 	   (propertize gdb-memory-unit
 		       'face font-lock-warning-face
-		       'help-echo "mouse-3: Select unit size"
+		       'help-echo "mouse-3: select unit size"
 		       'mouse-face 'mode-line-highlight
 		       'local-map gdb-memory-unit-map))))
   (set (make-local-variable 'font-lock-defaults)
@@ -2999,7 +3037,7 @@
       (if (member (if (string-equal gdb-version "pre-6.4")
 		      (file-name-nondirectory buffer-file-name)
 		    buffer-file-name)
-	  gdb-source-file-list)
+		  gdb-source-file-list)
 	  (with-current-buffer (find-buffer-visiting buffer-file-name)
 	    (set (make-local-variable 'gud-minor-mode)
 		 (buffer-local-value 'gud-minor-mode gud-comint-buffer))