aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNick Roberts2009-09-18 02:00:59 +0000
committerNick Roberts2009-09-18 02:00:59 +0000
commit9bf3abe682b99d14fe9ccdd355f629384882dd4e (patch)
treea2a12d42d5a738fa9588c5eaa50c92a78428912a
parentccb4c30c6649c1f109dc7f85123d8f29391d117a (diff)
downloademacs-9bf3abe682b99d14fe9ccdd355f629384882dd4e.tar.gz
emacs-9bf3abe682b99d14fe9ccdd355f629384882dd4e.zip
(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.
-rw-r--r--lisp/progmodes/gdb-mi.el335
1 files changed, 192 insertions, 143 deletions
diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el
index dcf154da788..5c8dc7f304a 100644
--- a/lisp/progmodes/gdb-mi.el
+++ b/lisp/progmodes/gdb-mi.el
@@ -143,6 +143,8 @@ set to nil.
143 143
144May be manually changed by user with `gdb-select-frame'.") 144May be manually changed by user with `gdb-select-frame'.")
145 145
146(defvar gdb-frame-address nil "Identity of frame for watch expression.")
147
146;; Used to show overlay arrow in source buffer. All set in 148;; Used to show overlay arrow in source buffer. All set in
147;; gdb-get-main-selected-frame. Disassembly buffer should not use 149;; gdb-get-main-selected-frame. Disassembly buffer should not use
148;; these but rely on buffer-local thread information instead. 150;; these but rely on buffer-local thread information instead.
@@ -183,8 +185,9 @@ as returned from \"-break-list\" by `gdb-json-partial-output'
183(defvar gdb-current-language nil) 185(defvar gdb-current-language nil)
184(defvar gdb-var-list nil 186(defvar gdb-var-list nil
185 "List of variables in watch window. 187 "List of variables in watch window.
186Each element has the form (VARNUM EXPRESSION NUMCHILD TYPE VALUE STATUS) where 188Each element has the form (VARNUM EXPRESSION NUMCHILD TYPE VALUE STATUS HAS_MORE FP)
187STATUS is nil (unchanged), `changed' or `out-of-scope'.") 189where STATUS is nil (`unchanged'), `changed' or `out-of-scope', FP the frame
190address for root variables.")
188(defvar gdb-main-file nil "Source file from which program execution begins.") 191(defvar gdb-main-file nil "Source file from which program execution begins.")
189 192
190;; Overlay arrow markers 193;; Overlay arrow markers
@@ -390,7 +393,7 @@ contains fields of corresponding MI *stopped async record:
390 393
391Note that \"reason\" is only present in non-stop debugging mode. 394Note that \"reason\" is only present in non-stop debugging mode.
392 395
393`gdb-get-field' may be used to access the fields of response. 396`bindat-get-field' may be used to access the fields of response.
394 397
395Each function is called after the new current thread was selected 398Each function is called after the new current thread was selected
396and GDB buffers were updated in `gdb-stopped'." 399and GDB buffers were updated in `gdb-stopped'."
@@ -818,7 +821,8 @@ detailed description of this mode.
818 (progn 821 (progn
819 (message "This version of GDB doesn't support non-stop mode. Turning it off.") 822 (message "This version of GDB doesn't support non-stop mode. Turning it off.")
820 (setq gdb-non-stop nil)) 823 (setq gdb-non-stop nil))
821 (gdb-input (list "-gdb-set target-async 1" 'ignore)))) 824 (gdb-input (list "-gdb-set target-async 1" 'ignore))
825 (gdb-input (list "-enable-pretty-printing" 'ignore))))
822 826
823(defvar gdb-define-alist nil "Alist of #define directives for GUD tooltips.") 827(defvar gdb-define-alist nil "Alist of #define directives for GUD tooltips.")
824 828
@@ -1002,25 +1006,25 @@ With arg, enter name of variable to be watched in the minibuffer."
1002 1006
1003(defun gdb-var-create-handler (expr) 1007(defun gdb-var-create-handler (expr)
1004 (let* ((result (gdb-json-partial-output))) 1008 (let* ((result (gdb-json-partial-output)))
1005 (if (not (gdb-get-field result 'msg)) 1009 (if (not (bindat-get-field result 'msg))
1006 (let 1010 (let ((var
1007 ((var 1011 (list (bindat-get-field result 'name)
1008 (list 1012 (if (and (string-equal gdb-current-language "c")
1009 (gdb-get-field result 'name) 1013 gdb-use-colon-colon-notation gdb-selected-frame)
1010 (if (and (string-equal gdb-current-language "c") 1014 (setq expr (concat gdb-selected-frame "::" expr))
1011 gdb-use-colon-colon-notation gdb-selected-frame) 1015 expr)
1012 (setq expr (concat gdb-selected-frame "::" expr)) 1016 (bindat-get-field result 'numchild)
1013 expr) 1017 (bindat-get-field result 'type)
1014 (gdb-get-field result 'numchild) 1018 (bindat-get-field result 'value)
1015 (gdb-get-field result 'type) 1019 nil
1016 (gdb-get-field result 'value) 1020 (bindat-get-field result 'has_more)
1017 nil))) 1021 gdb-frame-address)))
1018 (push var gdb-var-list) 1022 (push var gdb-var-list)
1019 (speedbar 1) 1023 (speedbar 1)
1020 (unless (string-equal 1024 (unless (string-equal
1021 speedbar-initial-expansion-list-name "GUD") 1025 speedbar-initial-expansion-list-name "GUD")
1022 (speedbar-change-initial-expansion-list "GUD"))) 1026 (speedbar-change-initial-expansion-list "GUD")))
1023 (message-box "No symbol \"%s\" in current context." expr)))) 1027 (message-box "No symbol \"%s\" in current context." expr))))
1024 1028
1025(defun gdb-speedbar-update () 1029(defun gdb-speedbar-update ()
1026 (when (and (boundp 'speedbar-frame) (frame-live-p speedbar-frame) 1030 (when (and (boundp 'speedbar-frame) (frame-live-p speedbar-frame)
@@ -1055,20 +1059,24 @@ With arg, enter name of variable to be watched in the minibuffer."
1055 `(lambda () (gdb-var-list-children-handler ,varnum))))) 1059 `(lambda () (gdb-var-list-children-handler ,varnum)))))
1056 1060
1057(defun gdb-var-list-children-handler (varnum) 1061(defun gdb-var-list-children-handler (varnum)
1058 (let ((var-list nil) 1062 (let* ((var-list nil)
1059 (children (gdb-get-field (gdb-json-partial-output "child") 'children))) 1063 (output (bindat-get-field (gdb-json-partial-output "child")))
1064 (children (bindat-get-field output 'children)))
1060 (catch 'child-already-watched 1065 (catch 'child-already-watched
1061 (dolist (var gdb-var-list) 1066 (dolist (var gdb-var-list)
1062 (if (string-equal varnum (car var)) 1067 (if (string-equal varnum (car var))
1063 (progn 1068 (progn
1069 ;; With dynamic varobjs numchild may have increased.
1070 (setcar (nthcdr 2 var) (bindat-get-field output 'numchild))
1064 (push var var-list) 1071 (push var var-list)
1065 (dolist (child children) 1072 (dolist (child children)
1066 (let ((varchild (list (gdb-get-field child 'name) 1073 (let ((varchild (list (bindat-get-field child 'name)
1067 (gdb-get-field child 'exp) 1074 (bindat-get-field child 'exp)
1068 (gdb-get-field child 'numchild) 1075 (bindat-get-field child 'numchild)
1069 (gdb-get-field child 'type) 1076 (bindat-get-field child 'type)
1070 (gdb-get-field child 'value) 1077 (bindat-get-field child 'value)
1071 nil))) 1078 nil
1079 (bindat-get-field child 'has_more))))
1072 (if (assoc (car varchild) gdb-var-list) 1080 (if (assoc (car varchild) gdb-var-list)
1073 (throw 'child-already-watched nil)) 1081 (throw 'child-already-watched nil))
1074 (push varchild var-list)))) 1082 (push varchild var-list))))
@@ -1084,7 +1092,7 @@ With arg, enter name of variable to be watched in the minibuffer."
1084 (list (concat "-var-set-format " varnum " " format) 'ignore)) 1092 (list (concat "-var-set-format " varnum " " format) 'ignore))
1085 (gdb-var-update))) 1093 (gdb-var-update)))
1086 1094
1087(defun gdb-var-delete-1 (varnum) 1095(defun gdb-var-delete-1 (var varnum)
1088 (gdb-input 1096 (gdb-input
1089 (list (concat "-var-delete " varnum) 'ignore)) 1097 (list (concat "-var-delete " varnum) 'ignore))
1090 (setq gdb-var-list (delq var gdb-var-list)) 1098 (setq gdb-var-list (delq var gdb-var-list))
@@ -1101,7 +1109,7 @@ With arg, enter name of variable to be watched in the minibuffer."
1101 (varnum (car var))) 1109 (varnum (car var)))
1102 (if (string-match "\\." (car var)) 1110 (if (string-match "\\." (car var))
1103 (message-box "Can only delete a root expression") 1111 (message-box "Can only delete a root expression")
1104 (gdb-var-delete-1 varnum))))) 1112 (gdb-var-delete-1 var varnum)))))
1105 1113
1106(defun gdb-var-delete-children (varnum) 1114(defun gdb-var-delete-children (varnum)
1107 "Delete children of variable object at point from the speedbar." 1115 "Delete children of variable object at point from the speedbar."
@@ -1132,25 +1140,67 @@ With arg, enter name of variable to be watched in the minibuffer."
1132 (gdb-add-pending 'gdb-var-update)) 1140 (gdb-add-pending 'gdb-var-update))
1133 1141
1134(defun gdb-var-update-handler () 1142(defun gdb-var-update-handler ()
1135 (let ((changelist (gdb-get-field (gdb-json-partial-output) 'changelist))) 1143 (let ((changelist (bindat-get-field (gdb-json-partial-output) 'changelist)))
1136 (dolist (var gdb-var-list) 1144 (dolist (var gdb-var-list)
1137 (setcar (nthcdr 5 var) nil)) 1145 (setcar (nthcdr 5 var) nil))
1138 (dolist (change changelist) 1146 (let ((temp-var-list gdb-var-list))
1139 (let* ((varnum (gdb-get-field change 'name)) 1147 (dolist (change changelist)
1140 (var (assoc varnum gdb-var-list))) 1148 (let* ((varnum (bindat-get-field change 'name))
1141 (when var 1149 (var (assoc varnum gdb-var-list))
1142 (let ((scope (gdb-get-field change 'in_scope))) 1150 (new-num (bindat-get-field change 'new_num_children)))
1143 (cond ((string-equal scope "false") 1151 (when var
1144 (if gdb-delete-out-of-scope 1152 (let ((scope (bindat-get-field change 'in_scope)))
1145 (gdb-var-delete-1 varnum) 1153 (cond ((string-equal scope "false")
1146 (setcar (nthcdr 5 var) 'out-of-scope))) 1154 (if gdb-delete-out-of-scope
1147 ((string-equal scope "true") 1155 (gdb-var-delete-1 var varnum)
1148 (setcar (nthcdr 5 var) 'changed) 1156 (setcar (nthcdr 5 var) 'out-of-scope)))
1149 (setcar (nthcdr 4 var) 1157 ((string-equal scope "true")
1150 (gdb-get-field change 'value))) 1158 (setcar (nthcdr 6 var)
1151 ((string-equal scope "invalid") 1159 (bindat-get-field change 'has_more))
1152 (gdb-var-delete-1 varnum)))))))) 1160 (when (and (string-equal (nth 6 var) "0")
1153 (gdb-delete-pending 'gdb-var-update) 1161 (not new-num)
1162 (string-equal (nth 2 var) "0"))
1163 (setcar (nthcdr 4 var)
1164 (bindat-get-field change 'value))
1165 (setcar (nthcdr 5 var) 'changed)))
1166 ((string-equal scope "invalid")
1167 (gdb-var-delete-1 var varnum)))))
1168 (let ((var-list nil) var1
1169 (children (bindat-get-field change 'new_children)))
1170 (if new-num
1171 (progn
1172 (setq var1 (pop temp-var-list))
1173 (while var1
1174 (if (string-equal varnum (car var1))
1175 (let ((new (string-to-number new-num))
1176 (previous (string-to-number (nth 2 var1))))
1177 (setcar (nthcdr 2 var1) new-num)
1178 (push var1 var-list)
1179 (cond ((> new previous)
1180 ;; Add new children to list.
1181 (dotimes (dummy previous)
1182 (push (pop temp-var-list) var-list))
1183 (dolist (child children)
1184 (let ((varchild
1185 (list (bindat-get-field child 'name)
1186 (bindat-get-field child 'exp)
1187 (bindat-get-field child 'numchild)
1188 (bindat-get-field child 'type)
1189 (bindat-get-field child 'value)
1190 'changed
1191 (bindat-get-field child 'has_more))))
1192 (push varchild var-list))))
1193 ;; Remove deleted children from list.
1194 ((< new previous)
1195 (dotimes (dummy new)
1196 (push (pop temp-var-list) var-list))
1197 (dotimes (dummy (- previous new))
1198 (pop temp-var-list)))))
1199 (push var1 var-list))
1200 (setq var1 (pop temp-var-list)))
1201 (setq gdb-var-list (nreverse var-list)))))))))
1202 (setq gdb-pending-triggers
1203 (delq 'gdb-var-update gdb-pending-triggers))
1154 (gdb-speedbar-update)) 1204 (gdb-speedbar-update))
1155 1205
1156(defun gdb-speedbar-expand-node (text token indent) 1206(defun gdb-speedbar-expand-node (text token indent)
@@ -1221,7 +1271,7 @@ thread."
1221 1271
1222(defun gdb-current-buffer-frame () 1272(defun gdb-current-buffer-frame ()
1223 "Get current stack frame object for thread of current buffer." 1273 "Get current stack frame object for thread of current buffer."
1224 (gdb-get-field (gdb-current-buffer-thread) 'frame)) 1274 (bindat-get-field (gdb-current-buffer-thread) 'frame))
1225 1275
1226(defun gdb-buffer-type (buffer) 1276(defun gdb-buffer-type (buffer)
1227 "Get value of `gdb-buffer-type' for BUFFER." 1277 "Get value of `gdb-buffer-type' for BUFFER."
@@ -1670,7 +1720,7 @@ For all-stop mode, thread information is unavailable while target
1670is running." 1720is running."
1671 (let ((old-value gud-running)) 1721 (let ((old-value gud-running))
1672 (setq gud-running 1722 (setq gud-running
1673 (string= (gdb-get-field (gdb-current-buffer-thread) 'state) 1723 (string= (bindat-get-field (gdb-current-buffer-thread) 'state)
1674 "running")) 1724 "running"))
1675 ;; Set frame number to "0" when _current_ threads stops 1725 ;; Set frame number to "0" when _current_ threads stops
1676 (when (and (gdb-current-buffer-thread) 1726 (when (and (gdb-current-buffer-thread)
@@ -1799,7 +1849,7 @@ is running."
1799(defun gdb-thread-exited (output-field) 1849(defun gdb-thread-exited (output-field)
1800 "Handle =thread-exited async record: unset `gdb-thread-number' 1850 "Handle =thread-exited async record: unset `gdb-thread-number'
1801 if current thread exited and update threads list." 1851 if current thread exited and update threads list."
1802 (let* ((thread-id (gdb-get-field (gdb-json-string output-field) 'id))) 1852 (let* ((thread-id (bindat-get-field (gdb-json-string output-field) 'id)))
1803 (if (string= gdb-thread-number thread-id) 1853 (if (string= gdb-thread-number thread-id)
1804 (gdb-setq-thread-number nil)) 1854 (gdb-setq-thread-number nil))
1805 ;; When we continue current thread and it quickly exits, 1855 ;; When we continue current thread and it quickly exits,
@@ -1814,7 +1864,7 @@ is running."
1814 1864
1815Sets `gdb-thread-number' to new id." 1865Sets `gdb-thread-number' to new id."
1816 (let* ((result (gdb-json-string output-field)) 1866 (let* ((result (gdb-json-string output-field))
1817 (thread-id (gdb-get-field result 'id))) 1867 (thread-id (bindat-get-field result 'id)))
1818 (gdb-setq-thread-number thread-id) 1868 (gdb-setq-thread-number thread-id)
1819 ;; Typing `thread N` in GUD buffer makes GDB emit `^done` followed 1869 ;; Typing `thread N` in GUD buffer makes GDB emit `^done` followed
1820 ;; by `=thread-selected` notification. `^done` causes `gdb-update` 1870 ;; by `=thread-selected` notification. `^done` causes `gdb-update`
@@ -1827,7 +1877,7 @@ Sets `gdb-thread-number' to new id."
1827 (gdb-update)))) 1877 (gdb-update))))
1828 1878
1829(defun gdb-running (output-field) 1879(defun gdb-running (output-field)
1830 (let* ((thread-id (gdb-get-field (gdb-json-string output-field) 'thread-id))) 1880 (let* ((thread-id (bindat-get-field (gdb-json-string output-field) 'thread-id)))
1831 ;; We reset gdb-frame-number to nil if current thread has gone 1881 ;; We reset gdb-frame-number to nil if current thread has gone
1832 ;; running. This can't be done in gdb-thread-list-handler-custom 1882 ;; running. This can't be done in gdb-thread-list-handler-custom
1833 ;; because we need correct gdb-frame-number by the time 1883 ;; because we need correct gdb-frame-number by the time
@@ -1862,8 +1912,8 @@ Sets `gdb-thread-number' to new id."
1862current thread and update GDB buffers." 1912current thread and update GDB buffers."
1863 ;; Reason is available with target-async only 1913 ;; Reason is available with target-async only
1864 (let* ((result (gdb-json-string output-field)) 1914 (let* ((result (gdb-json-string output-field))
1865 (reason (gdb-get-field result 'reason)) 1915 (reason (bindat-get-field result 'reason))
1866 (thread-id (gdb-get-field result 'thread-id))) 1916 (thread-id (bindat-get-field result 'thread-id)))
1867 1917
1868 ;; -data-list-register-names needs to be issued for any stopped 1918 ;; -data-list-register-names needs to be issued for any stopped
1869 ;; thread 1919 ;; thread
@@ -1895,7 +1945,7 @@ current thread and update GDB buffers."
1895 ;; gdb-switch-when-another-stopped: 1945 ;; gdb-switch-when-another-stopped:
1896 (when (or gdb-switch-when-another-stopped 1946 (when (or gdb-switch-when-another-stopped
1897 (not (string= "stopped" 1947 (not (string= "stopped"
1898 (gdb-get-field (gdb-current-buffer-thread) 'state)))) 1948 (bindat-get-field (gdb-current-buffer-thread) 'state))))
1899 ;; Switch if current reason has been selected or we have no 1949 ;; Switch if current reason has been selected or we have no
1900 ;; reasons 1950 ;; reasons
1901 (if (or (eq gdb-switch-reasons t) 1951 (if (or (eq gdb-switch-reasons t)
@@ -2159,14 +2209,12 @@ calling `gdb-table-string'."
2159 (gdb-table-row-properties table)) 2209 (gdb-table-row-properties table))
2160 "\n"))) 2210 "\n")))
2161 2211
2162;; gdb-get-field goes deep, gdb-get-many-fields goes wide 2212;; bindat-get-field goes deep, gdb-get-many-fields goes wide
2163(defalias 'gdb-get-field 'bindat-get-field)
2164
2165(defun gdb-get-many-fields (struct &rest fields) 2213(defun gdb-get-many-fields (struct &rest fields)
2166 "Return a list of FIELDS values from STRUCT." 2214 "Return a list of FIELDS values from STRUCT."
2167 (let ((values)) 2215 (let ((values))
2168 (dolist (field fields values) 2216 (dolist (field fields values)
2169 (setq values (append values (list (gdb-get-field struct field))))))) 2217 (setq values (append values (list (bindat-get-field struct field)))))))
2170 2218
2171(defmacro def-gdb-auto-update-trigger (trigger-name gdb-command 2219(defmacro def-gdb-auto-update-trigger (trigger-name gdb-command
2172 handler-name 2220 handler-name
@@ -2259,7 +2307,7 @@ HANDLER-NAME handler uses customization of CUSTOM-DEFUN. See
2259 'gdb-invalidate-breakpoints) 2307 'gdb-invalidate-breakpoints)
2260 2308
2261(defun gdb-breakpoints-list-handler-custom () 2309(defun gdb-breakpoints-list-handler-custom ()
2262 (let ((breakpoints-list (gdb-get-field 2310 (let ((breakpoints-list (bindat-get-field
2263 (gdb-json-partial-output "bkpt" "script") 2311 (gdb-json-partial-output "bkpt" "script")
2264 'BreakpointTable 'body)) 2312 'BreakpointTable 'body))
2265 (table (make-gdb-table))) 2313 (table (make-gdb-table)))
@@ -2267,25 +2315,25 @@ HANDLER-NAME handler uses customization of CUSTOM-DEFUN. See
2267 (gdb-table-add-row table '("Num" "Type" "Disp" "Enb" "Addr" "Hits" "What")) 2315 (gdb-table-add-row table '("Num" "Type" "Disp" "Enb" "Addr" "Hits" "What"))
2268 (dolist (breakpoint breakpoints-list) 2316 (dolist (breakpoint breakpoints-list)
2269 (add-to-list 'gdb-breakpoints-list 2317 (add-to-list 'gdb-breakpoints-list
2270 (cons (gdb-get-field breakpoint 'number) 2318 (cons (bindat-get-field breakpoint 'number)
2271 breakpoint)) 2319 breakpoint))
2272 (let ((at (gdb-get-field breakpoint 'at)) 2320 (let ((at (bindat-get-field breakpoint 'at))
2273 (pending (gdb-get-field breakpoint 'pending)) 2321 (pending (bindat-get-field breakpoint 'pending))
2274 (func (gdb-get-field breakpoint 'func)) 2322 (func (bindat-get-field breakpoint 'func))
2275 (type (gdb-get-field breakpoint 'type))) 2323 (type (bindat-get-field breakpoint 'type)))
2276 (gdb-table-add-row table 2324 (gdb-table-add-row table
2277 (list 2325 (list
2278 (gdb-get-field breakpoint 'number) 2326 (bindat-get-field breakpoint 'number)
2279 type 2327 type
2280 (gdb-get-field breakpoint 'disp) 2328 (bindat-get-field breakpoint 'disp)
2281 (let ((flag (gdb-get-field breakpoint 'enabled))) 2329 (let ((flag (bindat-get-field breakpoint 'enabled)))
2282 (if (string-equal flag "y") 2330 (if (string-equal flag "y")
2283 (propertize "y" 'font-lock-face font-lock-warning-face) 2331 (propertize "y" 'font-lock-face font-lock-warning-face)
2284 (propertize "n" 'font-lock-face font-lock-comment-face))) 2332 (propertize "n" 'font-lock-face font-lock-comment-face)))
2285 (gdb-get-field breakpoint 'addr) 2333 (bindat-get-field breakpoint 'addr)
2286 (gdb-get-field breakpoint 'times) 2334 (bindat-get-field breakpoint 'times)
2287 (if (string-match ".*watchpoint" type) 2335 (if (string-match ".*watchpoint" type)
2288 (gdb-get-field breakpoint 'what) 2336 (bindat-get-field breakpoint 'what)
2289 (or pending at 2337 (or pending at
2290 (concat "in " 2338 (concat "in "
2291 (propertize func 'font-lock-face font-lock-function-name-face) 2339 (propertize func 'font-lock-face font-lock-function-name-face)
@@ -2310,11 +2358,11 @@ HANDLER-NAME handler uses customization of CUSTOM-DEFUN. See
2310 (dolist (breakpoint gdb-breakpoints-list) 2358 (dolist (breakpoint gdb-breakpoints-list)
2311 (let* ((breakpoint (cdr breakpoint)) ; gdb-breakpoints-list is 2359 (let* ((breakpoint (cdr breakpoint)) ; gdb-breakpoints-list is
2312 ; an associative list 2360 ; an associative list
2313 (line (gdb-get-field breakpoint 'line))) 2361 (line (bindat-get-field breakpoint 'line)))
2314 (when line 2362 (when line
2315 (let ((file (gdb-get-field breakpoint 'fullname)) 2363 (let ((file (bindat-get-field breakpoint 'fullname))
2316 (flag (gdb-get-field breakpoint 'enabled)) 2364 (flag (bindat-get-field breakpoint 'enabled))
2317 (bptno (gdb-get-field breakpoint 'number))) 2365 (bptno (bindat-get-field breakpoint 'number)))
2318 (unless (file-exists-p file) 2366 (unless (file-exists-p file)
2319 (setq file (cdr (assoc bptno gdb-location-alist)))) 2367 (setq file (cdr (assoc bptno gdb-location-alist))))
2320 (if (and file 2368 (if (and file
@@ -2576,7 +2624,7 @@ corresponding to the mode line clicked."
2576 'gdb-invalidate-threads) 2624 'gdb-invalidate-threads)
2577 2625
2578(defun gdb-thread-list-handler-custom () 2626(defun gdb-thread-list-handler-custom ()
2579 (let ((threads-list (gdb-get-field (gdb-json-partial-output) 'threads)) 2627 (let ((threads-list (bindat-get-field (gdb-json-partial-output) 'threads))
2580 (table (make-gdb-table)) 2628 (table (make-gdb-table))
2581 (marked-line nil)) 2629 (marked-line nil))
2582 (setq gdb-threads-list nil) 2630 (setq gdb-threads-list nil)
@@ -2585,9 +2633,9 @@ corresponding to the mode line clicked."
2585 (set-marker gdb-thread-position nil) 2633 (set-marker gdb-thread-position nil)
2586 2634
2587 (dolist (thread (reverse threads-list)) 2635 (dolist (thread (reverse threads-list))
2588 (let ((running (string-equal (gdb-get-field thread 'state) "running"))) 2636 (let ((running (string-equal (bindat-get-field thread 'state) "running")))
2589 (add-to-list 'gdb-threads-list 2637 (add-to-list 'gdb-threads-list
2590 (cons (gdb-get-field thread 'id) 2638 (cons (bindat-get-field thread 'id)
2591 thread)) 2639 thread))
2592 (if running 2640 (if running
2593 (incf gdb-running-threads-count) 2641 (incf gdb-running-threads-count)
@@ -2595,19 +2643,19 @@ corresponding to the mode line clicked."
2595 2643
2596 (gdb-table-add-row table 2644 (gdb-table-add-row table
2597 (list 2645 (list
2598 (gdb-get-field thread 'id) 2646 (bindat-get-field thread 'id)
2599 (concat 2647 (concat
2600 (if gdb-thread-buffer-verbose-names 2648 (if gdb-thread-buffer-verbose-names
2601 (concat (gdb-get-field thread 'target-id) " ") "") 2649 (concat (bindat-get-field thread 'target-id) " ") "")
2602 (gdb-get-field thread 'state) 2650 (bindat-get-field thread 'state)
2603 ;; Include frame information for stopped threads 2651 ;; Include frame information for stopped threads
2604 (if (not running) 2652 (if (not running)
2605 (concat 2653 (concat
2606 " in " (gdb-get-field thread 'frame 'func) 2654 " in " (bindat-get-field thread 'frame 'func)
2607 (if gdb-thread-buffer-arguments 2655 (if gdb-thread-buffer-arguments
2608 (concat 2656 (concat
2609 " (" 2657 " ("
2610 (let ((args (gdb-get-field thread 'frame 'args))) 2658 (let ((args (bindat-get-field thread 'frame 'args)))
2611 (mapconcat 2659 (mapconcat
2612 (lambda (arg) 2660 (lambda (arg)
2613 (apply 'format `("%s=%s" ,@(gdb-get-many-fields arg 'name 'value)))) 2661 (apply 'format `("%s=%s" ,@(gdb-get-many-fields arg 'name 'value))))
@@ -2615,16 +2663,16 @@ corresponding to the mode line clicked."
2615 ")") 2663 ")")
2616 "") 2664 "")
2617 (if gdb-thread-buffer-locations 2665 (if gdb-thread-buffer-locations
2618 (gdb-frame-location (gdb-get-field thread 'frame)) "") 2666 (gdb-frame-location (bindat-get-field thread 'frame)) "")
2619 (if gdb-thread-buffer-addresses 2667 (if gdb-thread-buffer-addresses
2620 (concat " at " (gdb-get-field thread 'frame 'addr)) "")) 2668 (concat " at " (bindat-get-field thread 'frame 'addr)) ""))
2621 ""))) 2669 "")))
2622 (list 2670 (list
2623 'gdb-thread thread 2671 'gdb-thread thread
2624 'mouse-face 'highlight 2672 'mouse-face 'highlight
2625 'help-echo "mouse-2, RET: select thread"))) 2673 'help-echo "mouse-2, RET: select thread")))
2626 (when (string-equal gdb-thread-number 2674 (when (string-equal gdb-thread-number
2627 (gdb-get-field thread 'id)) 2675 (bindat-get-field thread 'id))
2628 (setq marked-line (length gdb-threads-list)))) 2676 (setq marked-line (length gdb-threads-list))))
2629 (insert (gdb-table-string table " ")) 2677 (insert (gdb-table-string table " "))
2630 (when marked-line 2678 (when marked-line
@@ -2655,11 +2703,11 @@ be the value of 'gdb-thread property of the current line. If
2655 "Define a NAME which will call BUFFER-COMMAND with id of thread 2703 "Define a NAME which will call BUFFER-COMMAND with id of thread
2656on the current line." 2704on the current line."
2657 `(def-gdb-thread-buffer-command ,name 2705 `(def-gdb-thread-buffer-command ,name
2658 (,buffer-command (gdb-get-field thread 'id)) 2706 (,buffer-command (bindat-get-field thread 'id))
2659 ,doc)) 2707 ,doc))
2660 2708
2661(def-gdb-thread-buffer-command gdb-select-thread 2709(def-gdb-thread-buffer-command gdb-select-thread
2662 (let ((new-id (gdb-get-field thread 'id))) 2710 (let ((new-id (bindat-get-field thread 'id)))
2663 (gdb-setq-thread-number new-id) 2711 (gdb-setq-thread-number new-id)
2664 (gdb-input (list (concat "-thread-select " new-id) 'ignore)) 2712 (gdb-input (list (concat "-thread-select " new-id) 'ignore))
2665 (gdb-update)) 2713 (gdb-update))
@@ -2715,7 +2763,7 @@ current line.")
2715line." 2763line."
2716 `(def-gdb-thread-buffer-command ,name 2764 `(def-gdb-thread-buffer-command ,name
2717 (if gdb-non-stop 2765 (if gdb-non-stop
2718 (let ((gdb-thread-number (gdb-get-field thread 'id)) 2766 (let ((gdb-thread-number (bindat-get-field thread 'id))
2719 (gdb-gud-control-all-threads nil)) 2767 (gdb-gud-control-all-threads nil))
2720 (call-interactively #',gud-command)) 2768 (call-interactively #',gud-command))
2721 (error "Available in non-stop mode only, customize gdb-non-stop-setting.")) 2769 (error "Available in non-stop mode only, customize gdb-non-stop-setting."))
@@ -2810,16 +2858,16 @@ in `gdb-memory-format'."
2810 2858
2811(defun gdb-read-memory-custom () 2859(defun gdb-read-memory-custom ()
2812 (let* ((res (gdb-json-partial-output)) 2860 (let* ((res (gdb-json-partial-output))
2813 (err-msg (gdb-get-field res 'msg))) 2861 (err-msg (bindat-get-field res 'msg)))
2814 (if (not err-msg) 2862 (if (not err-msg)
2815 (let ((memory (gdb-get-field res 'memory))) 2863 (let ((memory (bindat-get-field res 'memory)))
2816 (setq gdb-memory-address (gdb-get-field res 'addr)) 2864 (setq gdb-memory-address (bindat-get-field res 'addr))
2817 (setq gdb-memory-next-page (gdb-get-field res 'next-page)) 2865 (setq gdb-memory-next-page (bindat-get-field res 'next-page))
2818 (setq gdb-memory-prev-page (gdb-get-field res 'prev-page)) 2866 (setq gdb-memory-prev-page (bindat-get-field res 'prev-page))
2819 (setq gdb-memory-last-address gdb-memory-address) 2867 (setq gdb-memory-last-address gdb-memory-address)
2820 (dolist (row memory) 2868 (dolist (row memory)
2821 (insert (concat (gdb-get-field row 'addr) ":")) 2869 (insert (concat (bindat-get-field row 'addr) ":"))
2822 (dolist (column (gdb-get-field row 'data)) 2870 (dolist (column (bindat-get-field row 'data))
2823 (insert (gdb-pad-string column 2871 (insert (gdb-pad-string column
2824 (+ 2 (gdb-memory-column-width 2872 (+ 2 (gdb-memory-column-width
2825 gdb-memory-unit 2873 gdb-memory-unit
@@ -3149,8 +3197,8 @@ DOC is an optional documentation string."
3149 3197
3150(def-gdb-auto-update-trigger gdb-invalidate-disassembly 3198(def-gdb-auto-update-trigger gdb-invalidate-disassembly
3151 (let* ((frame (gdb-current-buffer-frame)) 3199 (let* ((frame (gdb-current-buffer-frame))
3152 (file (gdb-get-field frame 'fullname)) 3200 (file (bindat-get-field frame 'fullname))
3153 (line (gdb-get-field frame 'line))) 3201 (line (bindat-get-field frame 'line)))
3154 (when file 3202 (when file
3155 (format "-data-disassemble -f %s -l %s -n -1 -- 0" file line))) 3203 (format "-data-disassemble -f %s -l %s -n -1 -- 0" file line)))
3156 gdb-disassembly-handler 3204 gdb-disassembly-handler
@@ -3206,18 +3254,18 @@ DOC is an optional documentation string."
3206 'gdb-invalidate-disassembly) 3254 'gdb-invalidate-disassembly)
3207 3255
3208(defun gdb-disassembly-handler-custom () 3256(defun gdb-disassembly-handler-custom ()
3209 (let* ((instructions (gdb-get-field (gdb-json-partial-output) 'asm_insns)) 3257 (let* ((instructions (bindat-get-field (gdb-json-partial-output) 'asm_insns))
3210 (address (gdb-get-field (gdb-current-buffer-frame) 'addr)) 3258 (address (bindat-get-field (gdb-current-buffer-frame) 'addr))
3211 (pos 1) 3259 (pos 1)
3212 (table (make-gdb-table)) 3260 (table (make-gdb-table))
3213 (marked-line nil)) 3261 (marked-line nil))
3214 (dolist (instr instructions) 3262 (dolist (instr instructions)
3215 (gdb-table-add-row table 3263 (gdb-table-add-row table
3216 (list 3264 (list
3217 (gdb-get-field instr 'address) 3265 (bindat-get-field instr 'address)
3218 (apply 'format `("<%s+%s>:" ,@(gdb-get-many-fields instr 'func-name 'offset))) 3266 (apply 'format `("<%s+%s>:" ,@(gdb-get-many-fields instr 'func-name 'offset)))
3219 (gdb-get-field instr 'inst))) 3267 (bindat-get-field instr 'inst)))
3220 (when (string-equal (gdb-get-field instr 'address) 3268 (when (string-equal (bindat-get-field instr 'address)
3221 address) 3269 address)
3222 (progn 3270 (progn
3223 (setq marked-line (length (gdb-table-rows table))) 3271 (setq marked-line (length (gdb-table-rows table)))
@@ -3235,15 +3283,15 @@ DOC is an optional documentation string."
3235 (setq mode-name 3283 (setq mode-name
3236 (gdb-current-context-mode-name 3284 (gdb-current-context-mode-name
3237 (concat "Disassembly: " 3285 (concat "Disassembly: "
3238 (gdb-get-field (gdb-current-buffer-frame) 'func)))))) 3286 (bindat-get-field (gdb-current-buffer-frame) 'func))))))
3239 3287
3240(defun gdb-disassembly-place-breakpoints () 3288(defun gdb-disassembly-place-breakpoints ()
3241 (gdb-remove-breakpoint-icons (point-min) (point-max)) 3289 (gdb-remove-breakpoint-icons (point-min) (point-max))
3242 (dolist (breakpoint gdb-breakpoints-list) 3290 (dolist (breakpoint gdb-breakpoints-list)
3243 (let* ((breakpoint (cdr breakpoint)) 3291 (let* ((breakpoint (cdr breakpoint))
3244 (bptno (gdb-get-field breakpoint 'number)) 3292 (bptno (bindat-get-field breakpoint 'number))
3245 (flag (gdb-get-field breakpoint 'enabled)) 3293 (flag (bindat-get-field breakpoint 'enabled))
3246 (address (gdb-get-field breakpoint 'addr))) 3294 (address (bindat-get-field breakpoint 'addr)))
3247 (save-excursion 3295 (save-excursion
3248 (goto-char (point-min)) 3296 (goto-char (point-min))
3249 (if (re-search-forward (concat "^" address) nil t) 3297 (if (re-search-forward (concat "^" address) nil t)
@@ -3275,10 +3323,10 @@ DOC is an optional documentation string."
3275 (let ((breakpoint (get-text-property (point) 'gdb-breakpoint))) 3323 (let ((breakpoint (get-text-property (point) 'gdb-breakpoint)))
3276 (if breakpoint 3324 (if breakpoint
3277 (gud-basic-call 3325 (gud-basic-call
3278 (concat (if (string-equal "y" (gdb-get-field breakpoint 'enabled)) 3326 (concat (if (string-equal "y" (bindat-get-field breakpoint 'enabled))
3279 "-break-disable " 3327 "-break-disable "
3280 "-break-enable ") 3328 "-break-enable ")
3281 (gdb-get-field breakpoint 'number))) 3329 (bindat-get-field breakpoint 'number)))
3282 (error "Not recognized as break/watchpoint line"))))) 3330 (error "Not recognized as break/watchpoint line")))))
3283 3331
3284(defun gdb-delete-breakpoint () 3332(defun gdb-delete-breakpoint ()
@@ -3288,7 +3336,7 @@ DOC is an optional documentation string."
3288 (beginning-of-line) 3336 (beginning-of-line)
3289 (let ((breakpoint (get-text-property (point) 'gdb-breakpoint))) 3337 (let ((breakpoint (get-text-property (point) 'gdb-breakpoint)))
3290 (if breakpoint 3338 (if breakpoint
3291 (gud-basic-call (concat "-break-delete " (gdb-get-field breakpoint 'number))) 3339 (gud-basic-call (concat "-break-delete " (bindat-get-field breakpoint 'number)))
3292 (error "Not recognized as break/watchpoint line"))))) 3340 (error "Not recognized as break/watchpoint line")))))
3293 3341
3294(defun gdb-goto-breakpoint (&optional event) 3342(defun gdb-goto-breakpoint (&optional event)
@@ -3303,9 +3351,9 @@ breakpoints buffer."
3303 (beginning-of-line) 3351 (beginning-of-line)
3304 (let ((breakpoint (get-text-property (point) 'gdb-breakpoint))) 3352 (let ((breakpoint (get-text-property (point) 'gdb-breakpoint)))
3305 (if breakpoint 3353 (if breakpoint
3306 (let ((bptno (gdb-get-field breakpoint 'number)) 3354 (let ((bptno (bindat-get-field breakpoint 'number))
3307 (file (gdb-get-field breakpoint 'fullname)) 3355 (file (bindat-get-field breakpoint 'fullname))
3308 (line (gdb-get-field breakpoint 'line))) 3356 (line (bindat-get-field breakpoint 'line)))
3309 (save-selected-window 3357 (save-selected-window
3310 (let* ((buffer (find-file-noselect 3358 (let* ((buffer (find-file-noselect
3311 (if (file-exists-p file) file 3359 (if (file-exists-p file) file
@@ -3338,28 +3386,28 @@ breakpoints buffer."
3338 3386
3339FRAME must have either \"file\" and \"line\" members or \"from\" 3387FRAME must have either \"file\" and \"line\" members or \"from\"
3340member." 3388member."
3341 (let ((file (gdb-get-field frame 'file)) 3389 (let ((file (bindat-get-field frame 'file))
3342 (line (gdb-get-field frame 'line)) 3390 (line (bindat-get-field frame 'line))
3343 (from (gdb-get-field frame 'from))) 3391 (from (bindat-get-field frame 'from)))
3344 (let ((res (or (and file line (concat file ":" line)) 3392 (let ((res (or (and file line (concat file ":" line))
3345 from))) 3393 from)))
3346 (if res (concat " of " res) "")))) 3394 (if res (concat " of " res) ""))))
3347 3395
3348(defun gdb-stack-list-frames-custom () 3396(defun gdb-stack-list-frames-custom ()
3349 (let ((stack (gdb-get-field (gdb-json-partial-output "frame") 'stack)) 3397 (let ((stack (bindat-get-field (gdb-json-partial-output "frame") 'stack))
3350 (table (make-gdb-table))) 3398 (table (make-gdb-table)))
3351 (set-marker gdb-stack-position nil) 3399 (set-marker gdb-stack-position nil)
3352 (dolist (frame stack) 3400 (dolist (frame stack)
3353 (gdb-table-add-row table 3401 (gdb-table-add-row table
3354 (list 3402 (list
3355 (gdb-get-field frame 'level) 3403 (bindat-get-field frame 'level)
3356 "in" 3404 "in"
3357 (concat 3405 (concat
3358 (gdb-get-field frame 'func) 3406 (bindat-get-field frame 'func)
3359 (if gdb-stack-buffer-locations 3407 (if gdb-stack-buffer-locations
3360 (gdb-frame-location frame) "") 3408 (gdb-frame-location frame) "")
3361 (if gdb-stack-buffer-addresses 3409 (if gdb-stack-buffer-addresses
3362 (concat " at " (gdb-get-field frame 'addr)) ""))) 3410 (concat " at " (bindat-get-field frame 'addr)) "")))
3363 `(mouse-face highlight 3411 `(mouse-face highlight
3364 help-echo "mouse-2, RET: Select frame" 3412 help-echo "mouse-2, RET: Select frame"
3365 gdb-frame ,frame))) 3413 gdb-frame ,frame)))
@@ -3421,7 +3469,7 @@ member."
3421 (let ((frame (get-text-property (point) 'gdb-frame))) 3469 (let ((frame (get-text-property (point) 'gdb-frame)))
3422 (if frame 3470 (if frame
3423 (if (gdb-buffer-shows-main-thread-p) 3471 (if (gdb-buffer-shows-main-thread-p)
3424 (let ((new-level (gdb-get-field frame 'level))) 3472 (let ((new-level (bindat-get-field frame 'level)))
3425 (setq gdb-frame-number new-level) 3473 (setq gdb-frame-number new-level)
3426 (gdb-input (list (concat "-stack-select-frame " new-level) 'ignore)) 3474 (gdb-input (list (concat "-stack-select-frame " new-level) 'ignore))
3427 (gdb-update)) 3475 (gdb-update))
@@ -3465,7 +3513,7 @@ member."
3465 (save-excursion 3513 (save-excursion
3466 (if event (posn-set-point (event-end event))) 3514 (if event (posn-set-point (event-end event)))
3467 (beginning-of-line) 3515 (beginning-of-line)
3468 (let* ((var (gdb-get-field 3516 (let* ((var (bindat-get-field
3469 (get-text-property (point) 'gdb-local-variable) 'name)) 3517 (get-text-property (point) 'gdb-local-variable) 'name))
3470 (value (read-string (format "New value (%s): " var)))) 3518 (value (read-string (format "New value (%s): " var))))
3471 (gud-basic-call 3519 (gud-basic-call
@@ -3474,12 +3522,12 @@ member."
3474;; Dont display values of arrays or structures. 3522;; Dont display values of arrays or structures.
3475;; These can be expanded using gud-watch. 3523;; These can be expanded using gud-watch.
3476(defun gdb-locals-handler-custom () 3524(defun gdb-locals-handler-custom ()
3477 (let ((locals-list (gdb-get-field (gdb-json-partial-output) 'locals)) 3525 (let ((locals-list (bindat-get-field (gdb-json-partial-output) 'locals))
3478 (table (make-gdb-table))) 3526 (table (make-gdb-table)))
3479 (dolist (local locals-list) 3527 (dolist (local locals-list)
3480 (let ((name (gdb-get-field local 'name)) 3528 (let ((name (bindat-get-field local 'name))
3481 (value (gdb-get-field local 'value)) 3529 (value (bindat-get-field local 'value))
3482 (type (gdb-get-field local 'type))) 3530 (type (bindat-get-field local 'type)))
3483 (if (or (not value) 3531 (if (or (not value)
3484 (string-match "\\0x" value)) 3532 (string-match "\\0x" value))
3485 (add-text-properties 0 (length name) 3533 (add-text-properties 0 (length name)
@@ -3502,7 +3550,7 @@ member."
3502 (insert (gdb-table-string table " ")) 3550 (insert (gdb-table-string table " "))
3503 (setq mode-name 3551 (setq mode-name
3504 (gdb-current-context-mode-name 3552 (gdb-current-context-mode-name
3505 (concat "Locals: " (gdb-get-field (gdb-current-buffer-frame) 'func)))))) 3553 (concat "Locals: " (bindat-get-field (gdb-current-buffer-frame) 'func))))))
3506 3554
3507(defvar gdb-locals-header 3555(defvar gdb-locals-header
3508 (list 3556 (list
@@ -3568,11 +3616,11 @@ member."
3568 3616
3569(defun gdb-registers-handler-custom () 3617(defun gdb-registers-handler-custom ()
3570 (when gdb-register-names 3618 (when gdb-register-names
3571 (let ((register-values (gdb-get-field (gdb-json-partial-output) 'register-values)) 3619 (let ((register-values (bindat-get-field (gdb-json-partial-output) 'register-values))
3572 (table (make-gdb-table))) 3620 (table (make-gdb-table)))
3573 (dolist (register register-values) 3621 (dolist (register register-values)
3574 (let* ((register-number (gdb-get-field register 'number)) 3622 (let* ((register-number (bindat-get-field register 'number))
3575 (value (gdb-get-field register 'value)) 3623 (value (bindat-get-field register 'value))
3576 (register-name (nth (string-to-number register-number) 3624 (register-name (nth (string-to-number register-number)
3577 gdb-register-names))) 3625 gdb-register-names)))
3578 (gdb-table-add-row 3626 (gdb-table-add-row
@@ -3595,7 +3643,7 @@ member."
3595 (save-excursion 3643 (save-excursion
3596 (if event (posn-set-point (event-end event))) 3644 (if event (posn-set-point (event-end event)))
3597 (beginning-of-line) 3645 (beginning-of-line)
3598 (let* ((var (gdb-get-field 3646 (let* ((var (bindat-get-field
3599 (get-text-property (point) 'gdb-register-name))) 3647 (get-text-property (point) 'gdb-register-name)))
3600 (value (read-string (format "New value (%s): " var)))) 3648 (value (read-string (format "New value (%s): " var))))
3601 (gud-basic-call 3649 (gud-basic-call
@@ -3663,14 +3711,14 @@ member."
3663(defun gdb-changed-registers-handler () 3711(defun gdb-changed-registers-handler ()
3664 (gdb-delete-pending 'gdb-get-changed-registers) 3712 (gdb-delete-pending 'gdb-get-changed-registers)
3665 (setq gdb-changed-registers nil) 3713 (setq gdb-changed-registers nil)
3666 (dolist (register-number (gdb-get-field (gdb-json-partial-output) 'changed-registers)) 3714 (dolist (register-number (bindat-get-field (gdb-json-partial-output) 'changed-registers))
3667 (push register-number gdb-changed-registers))) 3715 (push register-number gdb-changed-registers)))
3668 3716
3669(defun gdb-register-names-handler () 3717(defun gdb-register-names-handler ()
3670 ;; Don't use gdb-pending-triggers because this handler is called 3718 ;; Don't use gdb-pending-triggers because this handler is called
3671 ;; only once (in gdb-init-1) 3719 ;; only once (in gdb-init-1)
3672 (setq gdb-register-names nil) 3720 (setq gdb-register-names nil)
3673 (dolist (register-name (gdb-get-field (gdb-json-partial-output) 'register-names)) 3721 (dolist (register-name (bindat-get-field (gdb-json-partial-output) 'register-names))
3674 (push register-name gdb-register-names)) 3722 (push register-name gdb-register-names))
3675 (setq gdb-register-names (reverse gdb-register-names))) 3723 (setq gdb-register-names (reverse gdb-register-names)))
3676 3724
@@ -3702,12 +3750,13 @@ thread. Called from `gdb-update'."
3702 "Sets `gdb-selected-frame' and `gdb-selected-file' to show 3750 "Sets `gdb-selected-frame' and `gdb-selected-file' to show
3703overlay arrow in source buffer." 3751overlay arrow in source buffer."
3704 (gdb-delete-pending 'gdb-get-main-selected-frame) 3752 (gdb-delete-pending 'gdb-get-main-selected-frame)
3705 (let ((frame (gdb-get-field (gdb-json-partial-output) 'frame))) 3753 (let ((frame (bindat-get-field (gdb-json-partial-output) 'frame)))
3706 (when frame 3754 (when frame
3707 (setq gdb-selected-frame (gdb-get-field frame 'func)) 3755 (setq gdb-selected-frame (bindat-get-field frame 'func))
3708 (setq gdb-selected-file (gdb-get-field frame 'fullname)) 3756 (setq gdb-selected-file (bindat-get-field frame 'fullname))
3709 (setq gdb-frame-number (gdb-get-field frame 'level)) 3757 (setq gdb-frame-number (bindat-get-field frame 'level))
3710 (let ((line (gdb-get-field frame 'line))) 3758 (setq gdb-frame-address (bindat-get-field frame 'addr))
3759 (let ((line (bindat-get-field frame 'line)))
3711 (setq gdb-selected-line (or (and line (string-to-number line)) 3760 (setq gdb-selected-line (or (and line (string-to-number line))
3712 nil)) ; don't fail if line is nil 3761 nil)) ; don't fail if line is nil
3713 (when line ; obey the current file only if we have line info 3762 (when line ; obey the current file only if we have line info