summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Roberts <nickrob@snap.net.nz>2009-09-18 00:39:21 +0000
committerNick Roberts <nickrob@snap.net.nz>2009-09-18 00:39:21 +0000
commit97e3e926b5d82713c4ee47b3131a94a31c1fc111 (patch)
tree6d1c5717dd5c8ca54d1123e9b83ad79a00e51a43
parentb2ee9accab02bc98069d74ab3d1e9f8f53113bc3 (diff)
downloademacs-97e3e926b5d82713c4ee47b3131a94a31c1fc111.tar.gz
(gdb-var-list): Add an element for has_more field.
(gdb-var-create-handler, gdb-var-list-children-handler-1) (gdb-var-update-handler-1): Update correctly when elements are removed from STL collections.
-rw-r--r--lisp/progmodes/gdb-ui.el96
1 files changed, 54 insertions, 42 deletions
diff --git a/lisp/progmodes/gdb-ui.el b/lisp/progmodes/gdb-ui.el
index 85aae4c352b..2378d829407 100644
--- a/lisp/progmodes/gdb-ui.el
+++ b/lisp/progmodes/gdb-ui.el
@@ -128,7 +128,7 @@ Set to \"main\" at start if `gdb-show-main' is t.")
(defvar gdb-current-language nil)
(defvar gdb-var-list nil
"List of variables in watch window.
-Each element has the form (VARNUM EXPRESSION NUMCHILD TYPE VALUE STATUS FP)
+Each element has the form (VARNUM EXPRESSION NUMCHILD TYPE VALUE STATUS HAS_MORE FP)
where STATUS is nil (`unchanged'), `changed' or `out-of-scope', FP the frame
address for root variables.")
(defvar gdb-main-file nil "Source file from which program execution begins.")
@@ -851,21 +851,18 @@ With arg, enter name of variable to be watched in the minibuffer."
(defun gdb-var-create-handler (expr)
(let* ((result (gdb-json-partial-output)))
(if (not (bindat-get-field result 'msg))
- (let*
- ((has_more (bindat-get-field result 'has_more))
- (var
- (list
- (bindat-get-field result 'name)
- (if (and (string-equal gdb-current-language "c")
- gdb-use-colon-colon-notation gdb-selected-frame)
- (setq expr (concat gdb-selected-frame "::" expr))
- expr)
- ;; Fake child for dynamic varobjs.
- (if (string-equal (bindat-get-field result 'has_more) "1")
- "1" (bindat-get-field result 'numchild))
- (bindat-get-field result 'type)
- (bindat-get-field result 'value)
- nil)))
+ (let ((var
+ (list (bindat-get-field result 'name)
+ (if (and (string-equal gdb-current-language "c")
+ gdb-use-colon-colon-notation gdb-selected-frame)
+ (setq expr (concat gdb-selected-frame "::" expr))
+ expr)
+ (bindat-get-field result 'numchild)
+ (bindat-get-field result 'type)
+ (bindat-get-field result 'value)
+ nil
+ (bindat-get-field result 'has_more)
+ gdb-frame-address)))
(push var gdb-var-list)
(speedbar 1)
(unless (string-equal
@@ -3817,12 +3814,15 @@ from=\"\\(.*?\\)\"\\)")
`(lambda () (gdb-var-list-children-handler-1 ,varnum)))))
(defun gdb-var-list-children-handler-1 (varnum)
- (let ((var-list nil)
- (children (bindat-get-field (gdb-json-partial-output "child") 'children)))
+ (let* ((var-list nil)
+ (output (bindat-get-field (gdb-json-partial-output "child")))
+ (children (bindat-get-field output 'children)))
(catch 'child-already-watched
(dolist (var gdb-var-list)
(if (string-equal varnum (car var))
(progn
+ ;; With dynamic varobjs numchild may have increased.
+ (setcar (nthcdr 2 var) (bindat-get-field output 'numchild))
(push var var-list)
(dolist (child children)
(let ((varchild (list (bindat-get-field child 'name)
@@ -3830,7 +3830,8 @@ from=\"\\(.*?\\)\"\\)")
(bindat-get-field child 'numchild)
(bindat-get-field child 'type)
(bindat-get-field child 'value)
- nil)))
+ nil
+ (bindat-get-field child 'has_more))))
(if (assoc (car varchild) gdb-var-list)
(throw 'child-already-watched nil))
(push varchild var-list))))
@@ -3858,45 +3859,56 @@ from=\"\\(.*?\\)\"\\)")
(let ((temp-var-list gdb-var-list))
(dolist (change changelist)
(let* ((varnum (bindat-get-field change 'name))
- (var (assoc varnum gdb-var-list)))
+ (var (assoc varnum gdb-var-list))
+ (new-num (bindat-get-field change 'new_num_children)))
(when var
(let ((scope (bindat-get-field change 'in_scope)))
(cond ((string-equal scope "false")
(if gdb-delete-out-of-scope
(gdb-var-delete-1 var varnum)
(setcar (nthcdr 5 var) 'out-of-scope)))
- ((and (string-equal scope "true")
- (string-equal (nth 2 var) "0"))
- ;; Fake a child to create an expanable node.
- (if (string-equal (bindat-get-field change 'has_more) "1")
- (setcar (nthcdr 2 var) "1")
- (setcar (nthcdr 5 var) 'changed)
+ ((string-equal scope "true")
+ (setcar (nthcdr 6 var)
+ (bindat-get-field change 'has_more))
+ (when (and (string-equal (nth 6 var) "0")
+ (not new-num)
+ (string-equal (nth 2 var) "0"))
(setcar (nthcdr 4 var)
- (bindat-get-field change 'value))))
+ (bindat-get-field change 'value))
+ (setcar (nthcdr 5 var) 'changed)))
((string-equal scope "invalid")
(gdb-var-delete-1 var varnum)))))
(let ((var-list nil) var1
- (new (bindat-get-field change 'new_num_children))
(children (bindat-get-field change 'new_children)))
- (if new
- ;; Add new children to list.
+ (if new-num
(progn
(setq var1 (pop temp-var-list))
(while var1
(if (string-equal varnum (car var1))
- (progn
+ (let ((new (string-to-number new-num))
+ (previous (string-to-number (nth 2 var1))))
+ (setcar (nthcdr 2 var1) new-num)
(push var1 var-list)
- (dotimes (dummy (- (string-to-number new) (length children)))
- (progn
- (push (pop temp-var-list) var-list)))
- (dolist (child children)
- (let ((varchild (list (bindat-get-field child 'name)
- (bindat-get-field child 'exp)
- (bindat-get-field child 'numchild)
- (bindat-get-field child 'type)
- (bindat-get-field child 'value)
- 'changed)))
- (push varchild var-list))))
+ (cond ((> new previous)
+ ;; Add new children to list.
+ (dotimes (dummy previous)
+ (push (pop temp-var-list) var-list))
+ (dolist (child children)
+ (let ((varchild
+ (list (bindat-get-field child 'name)
+ (bindat-get-field child 'exp)
+ (bindat-get-field child 'numchild)
+ (bindat-get-field child 'type)
+ (bindat-get-field child 'value)
+ 'changed
+ (bindat-get-field child 'has_more))))
+ (push varchild var-list))))
+ ;; Remove deleted children from list.
+ ((< new previous)
+ (dotimes (dummy new)
+ (push (pop temp-var-list) var-list))
+ (dotimes (dummy (- previous new))
+ (pop temp-var-list)))))
(push var1 var-list))
(setq var1 (pop temp-var-list)))
(setq gdb-var-list (nreverse var-list)))))))))