# HG changeset patch # User Nick Roberts # Date 1140303506 0 # Node ID 3d9e09ba3ace30c214bb84e57958560105a9e0ab # Parent dccdda472b02949c66ce88c224dd82eb1a5aacd5 (gdb-var-evaluate-expression-handler) (gdb-var-update-handler): Detect out of scope variables with pre GDB 6.4 too. (gdb-post-prompt): Revert changet 2006-02-17 (force update). Reset status of variable objexts to nil in update handlers. (gdb-var-update-handler-1): Detect when a variable object comes in scope. setcar on var changes gdb-var-list directly. diff -r dccdda472b02 -r 3d9e09ba3ace lisp/progmodes/gdb-ui.el --- a/lisp/progmodes/gdb-ui.el Sat Feb 18 22:57:05 2006 +0000 +++ b/lisp/progmodes/gdb-ui.el Sat Feb 18 22:58:26 2006 +0000 @@ -624,7 +624,7 @@ (dolist (var gdb-var-list) (if (string-equal varnum (cadr var)) (progn - (if changed (setcar (nthcdr 5 var) t)) + (if changed (setcar (nthcdr 5 var) 'changed)) (setcar (nthcdr 4 var) (read (match-string 1))) (setcar (nthcdr num gdb-var-list) var) (throw 'var-found nil))) @@ -679,16 +679,26 @@ (defun gdb-var-update-handler () (goto-char (point-min)) + (dolist (var gdb-var-list) + (when (and (eq (car (nthcdr 5 var)) 'out-of-scope) + (not (re-search-forward gdb-var-update-regexp-1 nil t)) + (not gdb-var-changed)) + (setq gdb-var-changed t)) + (setcar (nthcdr 5 var) nil)) + (goto-char (point-min)) (while (re-search-forward gdb-var-update-regexp nil t) - (catch 'var-found-1 - (let ((varnum (match-string 1))) - (dolist (var gdb-var-list) - (gdb-enqueue-input - (list - (concat "server interpreter mi \"-var-evaluate-expression " - varnum "\"\n") - `(lambda () (gdb-var-evaluate-expression-handler ,varnum t)))) - (throw 'var-found-1 nil))))) + (let ((varnum (match-string 1))) + (if (string-equal (match-string 2) "false") + (catch 'var-found + (dolist (var gdb-var-list) + (if (string-equal varnum (cadr var)) + (setcar (nthcdr 5 var) 'out-of-scope) + (throw 'var-found nil)))) + (gdb-enqueue-input + (list + (concat "server interpreter mi \"-var-evaluate-expression " + varnum "\"\n") + `(lambda () (gdb-var-evaluate-expression-handler ,varnum t))))))) (setq gdb-pending-triggers (delq 'gdb-var-update gdb-pending-triggers)) (when (and (boundp 'speedbar-frame) (frame-live-p speedbar-frame)) @@ -1217,8 +1227,7 @@ ;; FIXME: with GDB-6 on Darwin, this might very well work. ;; Only needed/used with speedbar/watch expressions. (when (and (boundp 'speedbar-frame) (frame-live-p speedbar-frame)) - (dolist (var gdb-var-list) - (setcar (nthcdr 5 var) nil)) + (setq gdb-var-changed t) ; force update (if (string-equal gdb-version "pre-6.4") (gdb-var-update) (gdb-var-update-1))))) @@ -3045,21 +3054,25 @@ (defun gdb-var-update-handler-1 () (goto-char (point-min)) + (dolist (var gdb-var-list) + (when (and (eq (car (nthcdr 5 var)) 'out-of-scope) + (not (re-search-forward gdb-var-update-regexp-1 nil t)) + (not gdb-var-changed)) + (setq gdb-var-changed t)) + (setcar (nthcdr 5 var) nil)) + (goto-char (point-min)) (while (re-search-forward gdb-var-update-regexp-1 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 - (if (string-equal (match-string 3) "false") - (setcar (nthcdr 5 var) 'out-of-scope) - (setcar (nthcdr 5 var) 'changed) - (setcar (nthcdr 4 var) - (read (match-string 2)))) - (setcar (nthcdr num gdb-var-list) var) - (throw 'var-found1 nil))) - (setq num (+ num 1)))))) + (dolist (var gdb-var-list) + (if (string-equal varnum (cadr var)) + (progn + (if (string-equal (match-string 3) "false") + (setcar (nthcdr 5 var) 'out-of-scope) + (setcar (nthcdr 5 var) 'changed) + (setcar (nthcdr 4 var) + (read (match-string 2)))) + (throw 'var-found1 nil)))))) (setq gdb-var-changed t)) (setq gdb-pending-triggers (delq 'gdb-var-update gdb-pending-triggers))