Mercurial > emacs
diff lisp/progmodes/gdb-mi.el @ 105072:28bf710f9221
(gdb-frame-address): New variable.
(gdb-var-list): Add an element for has_more field.
(gdb-non-stop-handler): Enable pretty printing for STL containers.
(gdb-var-create-handler, gdb-var-list-children-handler-1)
(gdb-var-update-handler-1): Parse output of dynamic variable
objects (STL containers).
(gdb-var-delete-1): Pass var1 as an explicit second argument.
(gdb-get-field): Delete alias. Use bindat-get-field directly.
author | Nick Roberts <nickrob@snap.net.nz> |
---|---|
date | Fri, 18 Sep 2009 02:00:59 +0000 |
parents | 5e36746ef447 |
children | c8c485186991 |
line wrap: on
line diff
--- a/lisp/progmodes/gdb-mi.el Fri Sep 18 02:00:18 2009 +0000 +++ b/lisp/progmodes/gdb-mi.el Fri Sep 18 02:00:59 2009 +0000 @@ -143,6 +143,8 @@ May be manually changed by user with `gdb-select-frame'.") +(defvar gdb-frame-address nil "Identity of frame for watch expression.") + ;; Used to show overlay arrow in source buffer. All set in ;; gdb-get-main-selected-frame. Disassembly buffer should not use ;; these but rely on buffer-local thread information instead. @@ -183,8 +185,9 @@ (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) where -STATUS is nil (unchanged), `changed' or `out-of-scope'.") +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.") ;; Overlay arrow markers @@ -390,7 +393,7 @@ Note that \"reason\" is only present in non-stop debugging mode. -`gdb-get-field' may be used to access the fields of response. +`bindat-get-field' may be used to access the fields of response. Each function is called after the new current thread was selected and GDB buffers were updated in `gdb-stopped'." @@ -818,7 +821,8 @@ (progn (message "This version of GDB doesn't support non-stop mode. Turning it off.") (setq gdb-non-stop nil)) - (gdb-input (list "-gdb-set target-async 1" 'ignore)))) + (gdb-input (list "-gdb-set target-async 1" 'ignore)) + (gdb-input (list "-enable-pretty-printing" 'ignore)))) (defvar gdb-define-alist nil "Alist of #define directives for GUD tooltips.") @@ -1002,25 +1006,25 @@ (defun gdb-var-create-handler (expr) (let* ((result (gdb-json-partial-output))) - (if (not (gdb-get-field result 'msg)) - (let - ((var - (list - (gdb-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) - (gdb-get-field result 'numchild) - (gdb-get-field result 'type) - (gdb-get-field result 'value) - nil))) - (push var gdb-var-list) - (speedbar 1) - (unless (string-equal - speedbar-initial-expansion-list-name "GUD") - (speedbar-change-initial-expansion-list "GUD"))) - (message-box "No symbol \"%s\" in current context." expr)))) + (if (not (bindat-get-field result 'msg)) + (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 + speedbar-initial-expansion-list-name "GUD") + (speedbar-change-initial-expansion-list "GUD"))) + (message-box "No symbol \"%s\" in current context." expr)))) (defun gdb-speedbar-update () (when (and (boundp 'speedbar-frame) (frame-live-p speedbar-frame) @@ -1055,20 +1059,24 @@ `(lambda () (gdb-var-list-children-handler ,varnum))))) (defun gdb-var-list-children-handler (varnum) - (let ((var-list nil) - (children (gdb-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 (gdb-get-field child 'name) - (gdb-get-field child 'exp) - (gdb-get-field child 'numchild) - (gdb-get-field child 'type) - (gdb-get-field child 'value) - nil))) + (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) + nil + (bindat-get-field child 'has_more)))) (if (assoc (car varchild) gdb-var-list) (throw 'child-already-watched nil)) (push varchild var-list)))) @@ -1084,7 +1092,7 @@ (list (concat "-var-set-format " varnum " " format) 'ignore)) (gdb-var-update))) -(defun gdb-var-delete-1 (varnum) +(defun gdb-var-delete-1 (var varnum) (gdb-input (list (concat "-var-delete " varnum) 'ignore)) (setq gdb-var-list (delq var gdb-var-list)) @@ -1101,7 +1109,7 @@ (varnum (car var))) (if (string-match "\\." (car var)) (message-box "Can only delete a root expression") - (gdb-var-delete-1 varnum))))) + (gdb-var-delete-1 var varnum))))) (defun gdb-var-delete-children (varnum) "Delete children of variable object at point from the speedbar." @@ -1132,25 +1140,67 @@ (gdb-add-pending 'gdb-var-update)) (defun gdb-var-update-handler () - (let ((changelist (gdb-get-field (gdb-json-partial-output) 'changelist))) - (dolist (var gdb-var-list) - (setcar (nthcdr 5 var) nil)) - (dolist (change changelist) - (let* ((varnum (gdb-get-field change 'name)) - (var (assoc varnum gdb-var-list))) - (when var - (let ((scope (gdb-get-field change 'in_scope))) - (cond ((string-equal scope "false") - (if gdb-delete-out-of-scope - (gdb-var-delete-1 varnum) - (setcar (nthcdr 5 var) 'out-of-scope))) - ((string-equal scope "true") - (setcar (nthcdr 5 var) 'changed) - (setcar (nthcdr 4 var) - (gdb-get-field change 'value))) - ((string-equal scope "invalid") - (gdb-var-delete-1 varnum)))))))) - (gdb-delete-pending 'gdb-var-update) + (let ((changelist (bindat-get-field (gdb-json-partial-output) 'changelist))) + (dolist (var gdb-var-list) + (setcar (nthcdr 5 var) nil)) + (let ((temp-var-list gdb-var-list)) + (dolist (change changelist) + (let* ((varnum (bindat-get-field change 'name)) + (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))) + ((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)) + (setcar (nthcdr 5 var) 'changed))) + ((string-equal scope "invalid") + (gdb-var-delete-1 var varnum))))) + (let ((var-list nil) var1 + (children (bindat-get-field change 'new_children))) + (if new-num + (progn + (setq var1 (pop temp-var-list)) + (while var1 + (if (string-equal varnum (car var1)) + (let ((new (string-to-number new-num)) + (previous (string-to-number (nth 2 var1)))) + (setcar (nthcdr 2 var1) new-num) + (push var1 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))))))))) + (setq gdb-pending-triggers + (delq 'gdb-var-update gdb-pending-triggers)) (gdb-speedbar-update)) (defun gdb-speedbar-expand-node (text token indent) @@ -1221,7 +1271,7 @@ (defun gdb-current-buffer-frame () "Get current stack frame object for thread of current buffer." - (gdb-get-field (gdb-current-buffer-thread) 'frame)) + (bindat-get-field (gdb-current-buffer-thread) 'frame)) (defun gdb-buffer-type (buffer) "Get value of `gdb-buffer-type' for BUFFER." @@ -1670,7 +1720,7 @@ is running." (let ((old-value gud-running)) (setq gud-running - (string= (gdb-get-field (gdb-current-buffer-thread) 'state) + (string= (bindat-get-field (gdb-current-buffer-thread) 'state) "running")) ;; Set frame number to "0" when _current_ threads stops (when (and (gdb-current-buffer-thread) @@ -1799,7 +1849,7 @@ (defun gdb-thread-exited (output-field) "Handle =thread-exited async record: unset `gdb-thread-number' if current thread exited and update threads list." - (let* ((thread-id (gdb-get-field (gdb-json-string output-field) 'id))) + (let* ((thread-id (bindat-get-field (gdb-json-string output-field) 'id))) (if (string= gdb-thread-number thread-id) (gdb-setq-thread-number nil)) ;; When we continue current thread and it quickly exits, @@ -1814,7 +1864,7 @@ Sets `gdb-thread-number' to new id." (let* ((result (gdb-json-string output-field)) - (thread-id (gdb-get-field result 'id))) + (thread-id (bindat-get-field result 'id))) (gdb-setq-thread-number thread-id) ;; Typing `thread N` in GUD buffer makes GDB emit `^done` followed ;; by `=thread-selected` notification. `^done` causes `gdb-update` @@ -1827,7 +1877,7 @@ (gdb-update)))) (defun gdb-running (output-field) - (let* ((thread-id (gdb-get-field (gdb-json-string output-field) 'thread-id))) + (let* ((thread-id (bindat-get-field (gdb-json-string output-field) 'thread-id))) ;; We reset gdb-frame-number to nil if current thread has gone ;; running. This can't be done in gdb-thread-list-handler-custom ;; because we need correct gdb-frame-number by the time @@ -1862,8 +1912,8 @@ current thread and update GDB buffers." ;; Reason is available with target-async only (let* ((result (gdb-json-string output-field)) - (reason (gdb-get-field result 'reason)) - (thread-id (gdb-get-field result 'thread-id))) + (reason (bindat-get-field result 'reason)) + (thread-id (bindat-get-field result 'thread-id))) ;; -data-list-register-names needs to be issued for any stopped ;; thread @@ -1895,7 +1945,7 @@ ;; gdb-switch-when-another-stopped: (when (or gdb-switch-when-another-stopped (not (string= "stopped" - (gdb-get-field (gdb-current-buffer-thread) 'state)))) + (bindat-get-field (gdb-current-buffer-thread) 'state)))) ;; Switch if current reason has been selected or we have no ;; reasons (if (or (eq gdb-switch-reasons t) @@ -2159,14 +2209,12 @@ (gdb-table-row-properties table)) "\n"))) -;; gdb-get-field goes deep, gdb-get-many-fields goes wide -(defalias 'gdb-get-field 'bindat-get-field) - +;; bindat-get-field goes deep, gdb-get-many-fields goes wide (defun gdb-get-many-fields (struct &rest fields) "Return a list of FIELDS values from STRUCT." (let ((values)) (dolist (field fields values) - (setq values (append values (list (gdb-get-field struct field))))))) + (setq values (append values (list (bindat-get-field struct field))))))) (defmacro def-gdb-auto-update-trigger (trigger-name gdb-command handler-name @@ -2259,7 +2307,7 @@ 'gdb-invalidate-breakpoints) (defun gdb-breakpoints-list-handler-custom () - (let ((breakpoints-list (gdb-get-field + (let ((breakpoints-list (bindat-get-field (gdb-json-partial-output "bkpt" "script") 'BreakpointTable 'body)) (table (make-gdb-table))) @@ -2267,25 +2315,25 @@ (gdb-table-add-row table '("Num" "Type" "Disp" "Enb" "Addr" "Hits" "What")) (dolist (breakpoint breakpoints-list) (add-to-list 'gdb-breakpoints-list - (cons (gdb-get-field breakpoint 'number) + (cons (bindat-get-field breakpoint 'number) breakpoint)) - (let ((at (gdb-get-field breakpoint 'at)) - (pending (gdb-get-field breakpoint 'pending)) - (func (gdb-get-field breakpoint 'func)) - (type (gdb-get-field breakpoint 'type))) + (let ((at (bindat-get-field breakpoint 'at)) + (pending (bindat-get-field breakpoint 'pending)) + (func (bindat-get-field breakpoint 'func)) + (type (bindat-get-field breakpoint 'type))) (gdb-table-add-row table (list - (gdb-get-field breakpoint 'number) + (bindat-get-field breakpoint 'number) type - (gdb-get-field breakpoint 'disp) - (let ((flag (gdb-get-field breakpoint 'enabled))) + (bindat-get-field breakpoint 'disp) + (let ((flag (bindat-get-field breakpoint 'enabled))) (if (string-equal flag "y") (propertize "y" 'font-lock-face font-lock-warning-face) (propertize "n" 'font-lock-face font-lock-comment-face))) - (gdb-get-field breakpoint 'addr) - (gdb-get-field breakpoint 'times) + (bindat-get-field breakpoint 'addr) + (bindat-get-field breakpoint 'times) (if (string-match ".*watchpoint" type) - (gdb-get-field breakpoint 'what) + (bindat-get-field breakpoint 'what) (or pending at (concat "in " (propertize func 'font-lock-face font-lock-function-name-face) @@ -2310,11 +2358,11 @@ (dolist (breakpoint gdb-breakpoints-list) (let* ((breakpoint (cdr breakpoint)) ; gdb-breakpoints-list is ; an associative list - (line (gdb-get-field breakpoint 'line))) + (line (bindat-get-field breakpoint 'line))) (when line - (let ((file (gdb-get-field breakpoint 'fullname)) - (flag (gdb-get-field breakpoint 'enabled)) - (bptno (gdb-get-field breakpoint 'number))) + (let ((file (bindat-get-field breakpoint 'fullname)) + (flag (bindat-get-field breakpoint 'enabled)) + (bptno (bindat-get-field breakpoint 'number))) (unless (file-exists-p file) (setq file (cdr (assoc bptno gdb-location-alist)))) (if (and file @@ -2576,7 +2624,7 @@ 'gdb-invalidate-threads) (defun gdb-thread-list-handler-custom () - (let ((threads-list (gdb-get-field (gdb-json-partial-output) 'threads)) + (let ((threads-list (bindat-get-field (gdb-json-partial-output) 'threads)) (table (make-gdb-table)) (marked-line nil)) (setq gdb-threads-list nil) @@ -2585,9 +2633,9 @@ (set-marker gdb-thread-position nil) (dolist (thread (reverse threads-list)) - (let ((running (string-equal (gdb-get-field thread 'state) "running"))) + (let ((running (string-equal (bindat-get-field thread 'state) "running"))) (add-to-list 'gdb-threads-list - (cons (gdb-get-field thread 'id) + (cons (bindat-get-field thread 'id) thread)) (if running (incf gdb-running-threads-count) @@ -2595,19 +2643,19 @@ (gdb-table-add-row table (list - (gdb-get-field thread 'id) + (bindat-get-field thread 'id) (concat (if gdb-thread-buffer-verbose-names - (concat (gdb-get-field thread 'target-id) " ") "") - (gdb-get-field thread 'state) + (concat (bindat-get-field thread 'target-id) " ") "") + (bindat-get-field thread 'state) ;; Include frame information for stopped threads (if (not running) (concat - " in " (gdb-get-field thread 'frame 'func) + " in " (bindat-get-field thread 'frame 'func) (if gdb-thread-buffer-arguments (concat " (" - (let ((args (gdb-get-field thread 'frame 'args))) + (let ((args (bindat-get-field thread 'frame 'args))) (mapconcat (lambda (arg) (apply 'format `("%s=%s" ,@(gdb-get-many-fields arg 'name 'value)))) @@ -2615,16 +2663,16 @@ ")") "") (if gdb-thread-buffer-locations - (gdb-frame-location (gdb-get-field thread 'frame)) "") + (gdb-frame-location (bindat-get-field thread 'frame)) "") (if gdb-thread-buffer-addresses - (concat " at " (gdb-get-field thread 'frame 'addr)) "")) + (concat " at " (bindat-get-field thread 'frame 'addr)) "")) ""))) (list 'gdb-thread thread 'mouse-face 'highlight 'help-echo "mouse-2, RET: select thread"))) (when (string-equal gdb-thread-number - (gdb-get-field thread 'id)) + (bindat-get-field thread 'id)) (setq marked-line (length gdb-threads-list)))) (insert (gdb-table-string table " ")) (when marked-line @@ -2655,11 +2703,11 @@ "Define a NAME which will call BUFFER-COMMAND with id of thread on the current line." `(def-gdb-thread-buffer-command ,name - (,buffer-command (gdb-get-field thread 'id)) + (,buffer-command (bindat-get-field thread 'id)) ,doc)) (def-gdb-thread-buffer-command gdb-select-thread - (let ((new-id (gdb-get-field thread 'id))) + (let ((new-id (bindat-get-field thread 'id))) (gdb-setq-thread-number new-id) (gdb-input (list (concat "-thread-select " new-id) 'ignore)) (gdb-update)) @@ -2715,7 +2763,7 @@ line." `(def-gdb-thread-buffer-command ,name (if gdb-non-stop - (let ((gdb-thread-number (gdb-get-field thread 'id)) + (let ((gdb-thread-number (bindat-get-field thread 'id)) (gdb-gud-control-all-threads nil)) (call-interactively #',gud-command)) (error "Available in non-stop mode only, customize gdb-non-stop-setting.")) @@ -2810,16 +2858,16 @@ (defun gdb-read-memory-custom () (let* ((res (gdb-json-partial-output)) - (err-msg (gdb-get-field res 'msg))) + (err-msg (bindat-get-field res 'msg))) (if (not err-msg) - (let ((memory (gdb-get-field res 'memory))) - (setq gdb-memory-address (gdb-get-field res 'addr)) - (setq gdb-memory-next-page (gdb-get-field res 'next-page)) - (setq gdb-memory-prev-page (gdb-get-field res 'prev-page)) + (let ((memory (bindat-get-field res 'memory))) + (setq gdb-memory-address (bindat-get-field res 'addr)) + (setq gdb-memory-next-page (bindat-get-field res 'next-page)) + (setq gdb-memory-prev-page (bindat-get-field res 'prev-page)) (setq gdb-memory-last-address gdb-memory-address) (dolist (row memory) - (insert (concat (gdb-get-field row 'addr) ":")) - (dolist (column (gdb-get-field row 'data)) + (insert (concat (bindat-get-field row 'addr) ":")) + (dolist (column (bindat-get-field row 'data)) (insert (gdb-pad-string column (+ 2 (gdb-memory-column-width gdb-memory-unit @@ -3149,8 +3197,8 @@ (def-gdb-auto-update-trigger gdb-invalidate-disassembly (let* ((frame (gdb-current-buffer-frame)) - (file (gdb-get-field frame 'fullname)) - (line (gdb-get-field frame 'line))) + (file (bindat-get-field frame 'fullname)) + (line (bindat-get-field frame 'line))) (when file (format "-data-disassemble -f %s -l %s -n -1 -- 0" file line))) gdb-disassembly-handler @@ -3206,18 +3254,18 @@ 'gdb-invalidate-disassembly) (defun gdb-disassembly-handler-custom () - (let* ((instructions (gdb-get-field (gdb-json-partial-output) 'asm_insns)) - (address (gdb-get-field (gdb-current-buffer-frame) 'addr)) + (let* ((instructions (bindat-get-field (gdb-json-partial-output) 'asm_insns)) + (address (bindat-get-field (gdb-current-buffer-frame) 'addr)) (pos 1) (table (make-gdb-table)) (marked-line nil)) (dolist (instr instructions) (gdb-table-add-row table (list - (gdb-get-field instr 'address) + (bindat-get-field instr 'address) (apply 'format `("<%s+%s>:" ,@(gdb-get-many-fields instr 'func-name 'offset))) - (gdb-get-field instr 'inst))) - (when (string-equal (gdb-get-field instr 'address) + (bindat-get-field instr 'inst))) + (when (string-equal (bindat-get-field instr 'address) address) (progn (setq marked-line (length (gdb-table-rows table))) @@ -3235,15 +3283,15 @@ (setq mode-name (gdb-current-context-mode-name (concat "Disassembly: " - (gdb-get-field (gdb-current-buffer-frame) 'func)))))) + (bindat-get-field (gdb-current-buffer-frame) 'func)))))) (defun gdb-disassembly-place-breakpoints () (gdb-remove-breakpoint-icons (point-min) (point-max)) (dolist (breakpoint gdb-breakpoints-list) (let* ((breakpoint (cdr breakpoint)) - (bptno (gdb-get-field breakpoint 'number)) - (flag (gdb-get-field breakpoint 'enabled)) - (address (gdb-get-field breakpoint 'addr))) + (bptno (bindat-get-field breakpoint 'number)) + (flag (bindat-get-field breakpoint 'enabled)) + (address (bindat-get-field breakpoint 'addr))) (save-excursion (goto-char (point-min)) (if (re-search-forward (concat "^" address) nil t) @@ -3275,10 +3323,10 @@ (let ((breakpoint (get-text-property (point) 'gdb-breakpoint))) (if breakpoint (gud-basic-call - (concat (if (string-equal "y" (gdb-get-field breakpoint 'enabled)) + (concat (if (string-equal "y" (bindat-get-field breakpoint 'enabled)) "-break-disable " "-break-enable ") - (gdb-get-field breakpoint 'number))) + (bindat-get-field breakpoint 'number))) (error "Not recognized as break/watchpoint line"))))) (defun gdb-delete-breakpoint () @@ -3288,7 +3336,7 @@ (beginning-of-line) (let ((breakpoint (get-text-property (point) 'gdb-breakpoint))) (if breakpoint - (gud-basic-call (concat "-break-delete " (gdb-get-field breakpoint 'number))) + (gud-basic-call (concat "-break-delete " (bindat-get-field breakpoint 'number))) (error "Not recognized as break/watchpoint line"))))) (defun gdb-goto-breakpoint (&optional event) @@ -3303,9 +3351,9 @@ (beginning-of-line) (let ((breakpoint (get-text-property (point) 'gdb-breakpoint))) (if breakpoint - (let ((bptno (gdb-get-field breakpoint 'number)) - (file (gdb-get-field breakpoint 'fullname)) - (line (gdb-get-field breakpoint 'line))) + (let ((bptno (bindat-get-field breakpoint 'number)) + (file (bindat-get-field breakpoint 'fullname)) + (line (bindat-get-field breakpoint 'line))) (save-selected-window (let* ((buffer (find-file-noselect (if (file-exists-p file) file @@ -3338,28 +3386,28 @@ FRAME must have either \"file\" and \"line\" members or \"from\" member." - (let ((file (gdb-get-field frame 'file)) - (line (gdb-get-field frame 'line)) - (from (gdb-get-field frame 'from))) + (let ((file (bindat-get-field frame 'file)) + (line (bindat-get-field frame 'line)) + (from (bindat-get-field frame 'from))) (let ((res (or (and file line (concat file ":" line)) from))) (if res (concat " of " res) "")))) (defun gdb-stack-list-frames-custom () - (let ((stack (gdb-get-field (gdb-json-partial-output "frame") 'stack)) + (let ((stack (bindat-get-field (gdb-json-partial-output "frame") 'stack)) (table (make-gdb-table))) (set-marker gdb-stack-position nil) (dolist (frame stack) (gdb-table-add-row table (list - (gdb-get-field frame 'level) + (bindat-get-field frame 'level) "in" (concat - (gdb-get-field frame 'func) + (bindat-get-field frame 'func) (if gdb-stack-buffer-locations (gdb-frame-location frame) "") (if gdb-stack-buffer-addresses - (concat " at " (gdb-get-field frame 'addr)) ""))) + (concat " at " (bindat-get-field frame 'addr)) ""))) `(mouse-face highlight help-echo "mouse-2, RET: Select frame" gdb-frame ,frame))) @@ -3421,7 +3469,7 @@ (let ((frame (get-text-property (point) 'gdb-frame))) (if frame (if (gdb-buffer-shows-main-thread-p) - (let ((new-level (gdb-get-field frame 'level))) + (let ((new-level (bindat-get-field frame 'level))) (setq gdb-frame-number new-level) (gdb-input (list (concat "-stack-select-frame " new-level) 'ignore)) (gdb-update)) @@ -3465,7 +3513,7 @@ (save-excursion (if event (posn-set-point (event-end event))) (beginning-of-line) - (let* ((var (gdb-get-field + (let* ((var (bindat-get-field (get-text-property (point) 'gdb-local-variable) 'name)) (value (read-string (format "New value (%s): " var)))) (gud-basic-call @@ -3474,12 +3522,12 @@ ;; Dont display values of arrays or structures. ;; These can be expanded using gud-watch. (defun gdb-locals-handler-custom () - (let ((locals-list (gdb-get-field (gdb-json-partial-output) 'locals)) + (let ((locals-list (bindat-get-field (gdb-json-partial-output) 'locals)) (table (make-gdb-table))) (dolist (local locals-list) - (let ((name (gdb-get-field local 'name)) - (value (gdb-get-field local 'value)) - (type (gdb-get-field local 'type))) + (let ((name (bindat-get-field local 'name)) + (value (bindat-get-field local 'value)) + (type (bindat-get-field local 'type))) (if (or (not value) (string-match "\\0x" value)) (add-text-properties 0 (length name) @@ -3502,7 +3550,7 @@ (insert (gdb-table-string table " ")) (setq mode-name (gdb-current-context-mode-name - (concat "Locals: " (gdb-get-field (gdb-current-buffer-frame) 'func)))))) + (concat "Locals: " (bindat-get-field (gdb-current-buffer-frame) 'func)))))) (defvar gdb-locals-header (list @@ -3568,11 +3616,11 @@ (defun gdb-registers-handler-custom () (when gdb-register-names - (let ((register-values (gdb-get-field (gdb-json-partial-output) 'register-values)) + (let ((register-values (bindat-get-field (gdb-json-partial-output) 'register-values)) (table (make-gdb-table))) (dolist (register register-values) - (let* ((register-number (gdb-get-field register 'number)) - (value (gdb-get-field register 'value)) + (let* ((register-number (bindat-get-field register 'number)) + (value (bindat-get-field register 'value)) (register-name (nth (string-to-number register-number) gdb-register-names))) (gdb-table-add-row @@ -3595,7 +3643,7 @@ (save-excursion (if event (posn-set-point (event-end event))) (beginning-of-line) - (let* ((var (gdb-get-field + (let* ((var (bindat-get-field (get-text-property (point) 'gdb-register-name))) (value (read-string (format "New value (%s): " var)))) (gud-basic-call @@ -3663,14 +3711,14 @@ (defun gdb-changed-registers-handler () (gdb-delete-pending 'gdb-get-changed-registers) (setq gdb-changed-registers nil) - (dolist (register-number (gdb-get-field (gdb-json-partial-output) 'changed-registers)) + (dolist (register-number (bindat-get-field (gdb-json-partial-output) 'changed-registers)) (push register-number gdb-changed-registers))) (defun gdb-register-names-handler () ;; Don't use gdb-pending-triggers because this handler is called ;; only once (in gdb-init-1) (setq gdb-register-names nil) - (dolist (register-name (gdb-get-field (gdb-json-partial-output) 'register-names)) + (dolist (register-name (bindat-get-field (gdb-json-partial-output) 'register-names)) (push register-name gdb-register-names)) (setq gdb-register-names (reverse gdb-register-names))) @@ -3702,12 +3750,13 @@ "Sets `gdb-selected-frame' and `gdb-selected-file' to show overlay arrow in source buffer." (gdb-delete-pending 'gdb-get-main-selected-frame) - (let ((frame (gdb-get-field (gdb-json-partial-output) 'frame))) + (let ((frame (bindat-get-field (gdb-json-partial-output) 'frame))) (when frame - (setq gdb-selected-frame (gdb-get-field frame 'func)) - (setq gdb-selected-file (gdb-get-field frame 'fullname)) - (setq gdb-frame-number (gdb-get-field frame 'level)) - (let ((line (gdb-get-field frame 'line))) + (setq gdb-selected-frame (bindat-get-field frame 'func)) + (setq gdb-selected-file (bindat-get-field frame 'fullname)) + (setq gdb-frame-number (bindat-get-field frame 'level)) + (setq gdb-frame-address (bindat-get-field frame 'addr)) + (let ((line (bindat-get-field frame 'line))) (setq gdb-selected-line (or (and line (string-to-number line)) nil)) ; don't fail if line is nil (when line ; obey the current file only if we have line info