Mercurial > emacs
comparison lisp/gdb-ui.el @ 48515:3216cd45d6d2
Major re-organisation. Simplify legacy gdba code to allow only one gdb process.
author | Nick Roberts <nickrob@snap.net.nz> |
---|---|
date | Sat, 23 Nov 2002 14:04:38 +0000 |
parents | 8fdedd7dca85 |
children | 4934b8352621 |
comparison
equal
deleted
inserted
replaced
48514:f2d41568620b | 48515:3216cd45d6d2 |
---|---|
35 "If t, using gdba, start gdb with ancillary buffers visible. | 35 "If t, using gdba, start gdb with ancillary buffers visible. |
36 Use `toggle-gdb-windows' to change this value during a gdb session" | 36 Use `toggle-gdb-windows' to change this value during a gdb session" |
37 :type 'boolean | 37 :type 'boolean |
38 :group 'gud) | 38 :group 'gud) |
39 | 39 |
40 (defvar gdb-main-file nil "Source file from which program execution begins.") | |
41 (defvar gdb-cdir nil "Compilation directory.") | |
42 (defvar gdb-main-or-pc nil "Initialisation for Assembler buffer.") | 40 (defvar gdb-main-or-pc nil "Initialisation for Assembler buffer.") |
43 (defvar gdb-prev-main-or-pc nil) | |
44 (defvar gdb-current-address nil) | 41 (defvar gdb-current-address nil) |
45 (defvar gdb-current-frame nil) | |
46 (defvar gdb-display-in-progress nil) | 42 (defvar gdb-display-in-progress nil) |
47 (defvar gdb-dive nil) | 43 (defvar gdb-dive nil) |
48 (defvar gdb-first-time nil) | 44 (defvar gdb-first-time nil) |
49 (defvar breakpoint-enabled-icon | 45 (defvar gdb-proc nil "The process associated with gdb.") |
50 "Icon for enabled breakpoint in display margin") | 46 |
51 (defvar breakpoint-disabled-icon | 47 ;;;###autoload |
52 "Icon for disabled breakpoint in display margin") | |
53 (defvar gdb-nesting-level) | |
54 (defvar gdb-expression-buffer-name) | |
55 (defvar gdb-expression) | |
56 (defvar gdb-point) | |
57 (defvar gdb-annotation-arg) | |
58 (defvar gdb-array-start) | |
59 (defvar gdb-array-stop) | |
60 (defvar gdb-display-number) | |
61 (defvar gdb-dive-display-number) | |
62 (defvar gdb-dive-map nil) | |
63 (defvar gdb-display-string) | |
64 (defvar gdb-values) | |
65 (defvar gdb-array-size) | |
66 (defvar gdb-array-slice-map nil) | |
67 (defvar gdb-buffer-instance nil) | |
68 (defvar gdb-source-window nil) | |
69 (defvar gdb-target-name "--unknown--" | |
70 "The apparent name of the program being debugged in a gud buffer.") | |
71 | |
72 (defun gdba (command-line) | 48 (defun gdba (command-line) |
73 "Run gdb on program FILE in buffer *gdb-FILE*. | 49 "Run gdb on program FILE in buffer *gdb-FILE*. |
74 The directory containing FILE becomes the initial working directory | 50 The directory containing FILE becomes the initial working directory |
75 and source-file directory for your debugger. | 51 and source-file directory for your debugger. |
76 | 52 |
123 (gdba-common-init command-line nil | 99 (gdba-common-init command-line nil |
124 'gdba-marker-filter 'gud-gdb-find-file) | 100 'gdba-marker-filter 'gud-gdb-find-file) |
125 | 101 |
126 (set (make-local-variable 'gud-minor-mode) 'gdba) | 102 (set (make-local-variable 'gud-minor-mode) 'gdba) |
127 | 103 |
128 ; (gud-def gud-break "break %f:%l" "\C-b" "Set breakpoint at current line.") | |
129 (gud-def gud-tbreak "tbreak %f:%l" "\C-t" "Set breakpoint at current line.") | 104 (gud-def gud-tbreak "tbreak %f:%l" "\C-t" "Set breakpoint at current line.") |
130 ; (gud-def gud-remove "clear %f:%l" "\C-d" "Remove breakpoint at current line") | |
131 (gud-def gud-run "run" nil "Run the program.") | 105 (gud-def gud-run "run" nil "Run the program.") |
132 (gud-def gud-stepi "stepi %p" "\C-i" "Step one instruction with display.") | 106 (gud-def gud-stepi "stepi %p" "\C-i" "Step one instruction with display.") |
133 (gud-def gud-step "step %p" "\C-s" "Step one source line with display.") | 107 (gud-def gud-step "step %p" "\C-s" "Step one source line with display.") |
134 (gud-def gud-next "next %p" "\C-n" "Step one line (skip functions).") | 108 (gud-def gud-next "next %p" "\C-n" "Step one line (skip functions).") |
135 (gud-def gud-finish "finish" "\C-f" "Finish executing current function.") | 109 (gud-def gud-finish "finish" "\C-f" "Finish executing current function.") |
156 (setq gdb-display-in-progress nil) | 130 (setq gdb-display-in-progress nil) |
157 (setq gdb-dive nil) | 131 (setq gdb-dive nil) |
158 (setq gud-last-last-frame nil) | 132 (setq gud-last-last-frame nil) |
159 | 133 |
160 (run-hooks 'gdb-mode-hook) | 134 (run-hooks 'gdb-mode-hook) |
161 (let ((instance | 135 (setq gdb-proc (get-buffer-process (current-buffer))) |
162 (make-gdb-instance (get-buffer-process (current-buffer))))) | 136 (gdb-make-instance) |
163 (if gdb-first-time (gdb-clear-inferior-io instance)) | 137 (if gdb-first-time (gdb-clear-inferior-io)) |
164 | 138 |
165 ; find source file and compilation directory here | 139 ; find source file and compilation directory here |
166 (gdb-instance-enqueue-idle-input instance (list "server list\n" | 140 (gdb-instance-enqueue-idle-input (list "server list\n" |
167 '(lambda () nil))) | 141 '(lambda () nil))) |
168 (gdb-instance-enqueue-idle-input instance (list "server info source\n" | 142 (gdb-instance-enqueue-idle-input (list "server info source\n" |
169 '(lambda () (gdb-source-info)))))) | 143 '(lambda () (gdb-source-info))))) |
170 | 144 |
171 (defun gud-break (arg) | 145 (defun gud-break (arg) |
172 "Set breakpoint at current line or address." | 146 "Set breakpoint at current line or address." |
173 (interactive "p") | 147 (interactive "p") |
174 (if (not (string-equal mode-name "Assembler")) | 148 (if (not (string-equal mode-name "Assembler")) |
194 "Display (possibly dereferenced) C expression at point." | 168 "Display (possibly dereferenced) C expression at point." |
195 (interactive) | 169 (interactive) |
196 (save-excursion | 170 (save-excursion |
197 (let ((expr (gud-find-c-expr))) | 171 (let ((expr (gud-find-c-expr))) |
198 (gdb-instance-enqueue-idle-input | 172 (gdb-instance-enqueue-idle-input |
199 gdb-buffer-instance | |
200 (list (concat "server whatis " expr "\n") | 173 (list (concat "server whatis " expr "\n") |
201 `(lambda () (gud-display1 ,expr))))))) | 174 `(lambda () (gud-display1 ,expr))))))) |
202 | 175 |
203 (defun gud-display1 (expr) | 176 (defun gud-display1 (expr) |
204 (goto-char (point-min)) | 177 (goto-char (point-min)) |
205 (if (re-search-forward "\*" nil t) | 178 (if (re-search-forward "\*" nil t) |
206 (gdb-instance-enqueue-idle-input | 179 (gdb-instance-enqueue-idle-input |
207 gdb-buffer-instance | |
208 (list (concat "server display* " expr "\n") | 180 (list (concat "server display* " expr "\n") |
209 '(lambda () nil))) | 181 '(lambda () nil))) |
210 ;else | 182 ;else |
211 (gdb-instance-enqueue-idle-input | 183 (gdb-instance-enqueue-idle-input |
212 gdb-buffer-instance | |
213 (list (concat "server display " expr "\n") | 184 (list (concat "server display " expr "\n") |
214 '(lambda () nil))))) | 185 '(lambda () nil))))) |
215 | 186 |
216 | 187 |
217 ;; The completion process filter is installed temporarily to slurp the | 188 ;; The completion process filter is installed temporarily to slurp the |
218 ;; output of GDB up to the next prompt and build the completion list. | 189 ;; output of GDB up to the next prompt and build the completion list. |
219 ;; It must also handle annotations. | 190 ;; It must also handle annotations. |
220 (defun gdba-complete-filter (string) | 191 (defun gdba-complete-filter (string) |
221 (gdb-output-burst gdb-buffer-instance string) | 192 (gdb-output-burst string) |
222 (while (string-match "\n\032\032\\(.*\\)\n" string) | 193 (while (string-match "\n\032\032\\(.*\\)\n" string) |
223 (setq string (concat (substring string 0 (match-beginning 0)) | 194 (setq string (concat (substring string 0 (match-beginning 0)) |
224 (substring string (match-end 0))))) | 195 (substring string (match-end 0))))) |
225 (setq string (concat gud-gdb-complete-string string)) | 196 (setq string (concat gud-gdb-complete-string string)) |
226 (while (string-match "\n" string) | 197 (while (string-match "\n" string) |
234 string) | 205 string) |
235 (progn | 206 (progn |
236 (setq gud-gdb-complete-string string) | 207 (setq gud-gdb-complete-string string) |
237 ""))) | 208 ""))) |
238 | 209 |
210 (defvar gdb-target-name "--unknown--" | |
211 "The apparent name of the program being debugged in a gud buffer.") | |
239 | 212 |
240 (defun gdba-common-init (command-line massage-args marker-filter &optional find-file) | 213 (defun gdba-common-init (command-line massage-args marker-filter &optional find-file) |
241 | 214 |
242 (let* ((words (split-string command-line)) | 215 (let* ((words (split-string command-line)) |
243 (program (car words)) | 216 (program (car words)) |
287 (let ((w args)) | 260 (let ((w args)) |
288 (while (and w (not (eq (car w) t))) | 261 (while (and w (not (eq (car w) t))) |
289 (setq w (cdr w))) | 262 (setq w (cdr w))) |
290 (if w | 263 (if w |
291 (setcar w file))) | 264 (setcar w file))) |
292 (let ((old-instance gdb-buffer-instance)) | 265 (apply 'make-comint (concat "gdb-" filepart) program nil args) |
293 (apply 'make-comint (concat "gdb-" filepart) program nil args) | 266 (gud-mode) |
294 (gud-mode) | |
295 (make-variable-buffer-local 'old-gdb-buffer-instance) | |
296 (setq old-gdb-buffer-instance old-instance)) | |
297 (setq gdb-target-name filepart)) | 267 (setq gdb-target-name filepart)) |
298 (make-local-variable 'gud-marker-filter) | 268 (make-local-variable 'gud-marker-filter) |
299 (setq gud-marker-filter marker-filter) | 269 (setq gud-marker-filter marker-filter) |
300 (if find-file (set (make-local-variable 'gud-find-file) find-file)) | 270 (if find-file (set (make-local-variable 'gud-find-file) find-file)) |
301 | 271 |
312 | 282 |
313 ;; | 283 ;; |
314 ;; gdb-instance objects | 284 ;; gdb-instance objects |
315 ;; | 285 ;; |
316 | 286 |
317 (defun make-gdb-instance (proc) | 287 (defvar gdb-instance-variables '() |
318 "Create a gdb instance object from a gdb process." | 288 "A list of variables that are local to the GUD buffer associated |
319 (let ((instance (cons 'gdb-instance proc))) | 289 with a gdb instance.") |
320 (with-current-buffer (process-buffer proc) | |
321 (setq gdb-buffer-instance instance) | |
322 (progn | |
323 (mapc 'make-local-variable gdb-instance-variables) | |
324 (setq gdb-buffer-type 'gdba) | |
325 ;; If we're taking over the buffer of another process, | |
326 ;; take over it's ancillary buffers as well. | |
327 ;; | |
328 (let ((dead old-gdb-buffer-instance)) | |
329 (dolist (b (buffer-list)) | |
330 (set-buffer b) | |
331 (if (eq dead gdb-buffer-instance) | |
332 (setq gdb-buffer-instance instance)))))) | |
333 instance)) | |
334 | |
335 (defun gdb-instance-process (inst) (cdr inst)) | |
336 | 290 |
337 ;;; The list of instance variables is built up by the expansions of | 291 ;;; The list of instance variables is built up by the expansions of |
338 ;;; DEF-GDB-VARIABLE | 292 ;;; DEF-GDB-VARIABLE |
339 ;;; | 293 ;;; |
340 (defvar gdb-instance-variables '() | |
341 "A list of variables that are local to the GUD buffer associated | |
342 with a gdb instance.") | |
343 | 294 |
344 (defmacro def-gdb-variable (name accessor setter &optional default doc) | 295 (defmacro def-gdb-variable (name accessor setter &optional default doc) |
345 `(progn | 296 `(progn |
346 (defvar ,name ,default ,(or doc "undocumented")) | 297 (defvar ,name ,default ,doc) |
347 (if (not (memq ',name gdb-instance-variables)) | 298 (if (not (memq ',name gdb-instance-variables)) |
348 (setq gdb-instance-variables | 299 (push ',name gdb-instance-variables)) |
349 (cons ',name gdb-instance-variables))) | |
350 ,(and accessor | 300 ,(and accessor |
351 `(defun ,accessor (instance) | 301 `(defun ,accessor () |
352 (let | 302 (let ((buffer (gdb-get-instance-buffer 'gdba))) |
353 ((buffer (gdb-get-instance-buffer instance 'gdba))) | 303 (and buffer (save-excursion |
354 (and buffer | 304 (set-buffer buffer) |
355 (save-excursion | 305 ,name))))) |
356 (set-buffer buffer) | |
357 ,name))))) | |
358 ,(and setter | 306 ,(and setter |
359 `(defun ,setter (instance val) | 307 `(defun ,setter (val) |
360 (let | 308 (let ((buffer (gdb-get-instance-buffer 'gdba))) |
361 ((buffer (gdb-get-instance-buffer instance 'gdba))) | 309 (and buffer (save-excursion |
362 (and buffer | 310 (set-buffer buffer) |
363 (save-excursion | 311 (setq ,name val)))))))) |
364 (set-buffer buffer) | |
365 (setq ,name val)))))))) | |
366 | 312 |
367 (defmacro def-gdb-var (root-symbol &optional default doc) | 313 (defmacro def-gdb-var (root-symbol &optional default doc) |
368 (let* ((root (symbol-name root-symbol)) | 314 (let* ((root (symbol-name root-symbol)) |
369 (accessor (intern (concat "gdb-instance-" root))) | 315 (accessor (intern (concat "gdb-instance-" root))) |
370 (setter (intern (concat "set-gdb-instance-" root))) | 316 (setter (intern (concat "set-gdb-instance-" root))) |
371 (var-name (intern (concat "gdb-" root)))) | 317 (var-name (intern (concat "gdb-" root)))) |
372 `(def-gdb-variable | 318 `(def-gdb-variable |
373 ,var-name ,accessor ,setter | 319 ,var-name ,accessor ,setter |
374 ,default ,doc))) | 320 ,default ,doc))) |
375 | |
376 (def-gdb-var buffer-instance nil | |
377 "In an instance buffer, the buffer's instance.") | |
378 | 321 |
379 (def-gdb-var buffer-type nil | 322 (def-gdb-var buffer-type nil |
380 "One of the symbols bound in gdb-instance-buffer-rules") | 323 "One of the symbols bound in gdb-instance-buffer-rules") |
381 | 324 |
382 (def-gdb-var burst "" | 325 (def-gdb-var burst "" |
416 | 359 |
417 (def-gdb-var pending-triggers '() | 360 (def-gdb-var pending-triggers '() |
418 "A list of trigger functions that have run later than their output | 361 "A list of trigger functions that have run later than their output |
419 handlers.") | 362 handlers.") |
420 | 363 |
421 (defun in-gdb-instance-context (instance form) | 364 (defun in-gdb-instance-context (form) |
422 "Funcall FORM in the GUD buffer of INSTANCE." | 365 "Funcall FORM in the GUD buffer." |
423 (save-excursion | 366 (save-excursion |
424 (set-buffer (gdb-get-instance-buffer instance 'gdba)) | 367 (set-buffer (gdb-get-instance-buffer 'gdba)) |
425 (funcall form))) | 368 (funcall form))) |
426 | 369 |
427 ;; end of instance vars | 370 ;; end of instance vars |
428 | 371 |
429 ;; | 372 (defun gdb-make-instance () |
430 ;; finding instances | 373 "Create a gdb instance object from a gdb process." |
431 ;; | 374 (with-current-buffer (process-buffer gdb-proc) |
432 | 375 (progn |
433 (defun gdb-proc->instance (proc) | 376 (mapc 'make-local-variable gdb-instance-variables) |
434 (save-excursion | 377 (setq gdb-buffer-type 'gdba)))) |
435 (set-buffer (process-buffer proc)) | 378 |
436 gdb-buffer-instance)) | 379 (defun gdb-instance-target-string () |
437 | |
438 (defun gdb-mru-instance-buffer () | |
439 "Return the most recently used (non-auxiliary) GUD buffer." | |
440 (save-excursion | |
441 (gdb-goto-first-gdb-instance (buffer-list)))) | |
442 | |
443 (defun gdb-goto-first-gdb-instance (blist) | |
444 "Use gdb-mru-instance-buffer -- not this." | |
445 (and blist | |
446 (progn | |
447 (set-buffer (car blist)) | |
448 (or (and gdb-buffer-instance | |
449 (eq gdb-buffer-type 'gdba) | |
450 (car blist)) | |
451 (gdb-goto-first-gdb-instance (cdr blist)))))) | |
452 | |
453 (defun buffer-gdb-instance (buf) | |
454 (save-excursion | |
455 (set-buffer buf) | |
456 gdb-buffer-instance)) | |
457 | |
458 (defun gdb-needed-default-instance () | |
459 "Return the most recently used gdb instance or signal an error." | |
460 (let ((buffer (gdb-mru-instance-buffer))) | |
461 (or (and buffer (buffer-gdb-instance buffer)) | |
462 (error "No instance of gdb found")))) | |
463 | |
464 (defun gdb-instance-target-string (instance) | |
465 "The apparent name of the program being debugged by a gdb instance. | 380 "The apparent name of the program being debugged by a gdb instance. |
466 For sure this the root string used in smashing together the gdb | 381 For sure this the root string used in smashing together the gdb |
467 buffer's name, even if that doesn't happen to be the name of a | 382 buffer's name, even if that doesn't happen to be the name of a |
468 program." | 383 program." |
469 (in-gdb-instance-context | 384 (in-gdb-instance-context |
470 instance | |
471 (function (lambda () gdb-target-name)))) | 385 (function (lambda () gdb-target-name)))) |
472 | |
473 | 386 |
474 | 387 |
475 ;; | 388 ;; |
476 ;; Instance Buffers. | 389 ;; Instance Buffers. |
477 ;; | 390 ;; |
485 ;; is constructed specially. | 398 ;; is constructed specially. |
486 ;; | 399 ;; |
487 ;; Others are constructed by gdb-get-create-instance-buffer and | 400 ;; Others are constructed by gdb-get-create-instance-buffer and |
488 ;; named according to the rules set forth in the gdb-instance-buffer-rules-assoc | 401 ;; named according to the rules set forth in the gdb-instance-buffer-rules-assoc |
489 | 402 |
490 (defun gdb-get-instance-buffer (instance key) | 403 (defvar gdb-instance-buffer-rules-assoc '()) |
491 "Return the instance buffer for INSTANCE tagged with type KEY. | 404 |
405 (defun gdb-get-instance-buffer (key) | |
406 "Return the instance buffer tagged with type KEY. | |
492 The key should be one of the cars in `gdb-instance-buffer-rules-assoc'." | 407 The key should be one of the cars in `gdb-instance-buffer-rules-assoc'." |
493 (save-excursion | 408 (save-excursion |
494 (gdb-look-for-tagged-buffer instance key (buffer-list)))) | 409 (gdb-look-for-tagged-buffer key (buffer-list)))) |
495 | 410 |
496 (defun gdb-get-create-instance-buffer (instance key) | 411 (defun gdb-get-create-instance-buffer (key) |
497 "Create a new gdb instance buffer of the type specified by KEY. | 412 "Create a new gdb instance buffer of the type specified by KEY. |
498 The key should be one of the cars in `gdb-instance-buffer-rules-assoc'." | 413 The key should be one of the cars in `gdb-instance-buffer-rules-assoc'." |
499 (or (gdb-get-instance-buffer instance key) | 414 (or (gdb-get-instance-buffer key) |
500 (let* ((rules (assoc key gdb-instance-buffer-rules-assoc)) | 415 (let* ((rules (assoc key gdb-instance-buffer-rules-assoc)) |
501 (name (funcall (gdb-rules-name-maker rules) instance)) | 416 (name (funcall (gdb-rules-name-maker rules))) |
502 (new (get-buffer-create name))) | 417 (new (get-buffer-create name))) |
503 (save-excursion | 418 (save-excursion |
504 (set-buffer new) | 419 (set-buffer new) |
505 (make-variable-buffer-local 'gdb-buffer-type) | 420 (make-variable-buffer-local 'gdb-buffer-type) |
506 (setq gdb-buffer-type key) | 421 (setq gdb-buffer-type key) |
507 (make-variable-buffer-local 'gdb-buffer-instance) | |
508 (setq gdb-buffer-instance instance) | |
509 (if (cdr (cdr rules)) | 422 (if (cdr (cdr rules)) |
510 (funcall (car (cdr (cdr rules))))) | 423 (funcall (car (cdr (cdr rules))))) |
511 new)))) | 424 new)))) |
512 | 425 |
513 (defun gdb-rules-name-maker (rules) (car (cdr rules))) | 426 (defun gdb-rules-name-maker (rules) (car (cdr rules))) |
514 | 427 |
515 (defun gdb-look-for-tagged-buffer (instance key bufs) | 428 (defun gdb-look-for-tagged-buffer (key bufs) |
516 (let ((retval nil)) | 429 (let ((retval nil)) |
517 (while (and (not retval) bufs) | 430 (while (and (not retval) bufs) |
518 (set-buffer (car bufs)) | 431 (set-buffer (car bufs)) |
519 (if (and (eq gdb-buffer-instance instance) | 432 (if (eq gdb-buffer-type key) |
520 (eq gdb-buffer-type key)) | |
521 (setq retval (car bufs))) | 433 (setq retval (car bufs))) |
522 (setq bufs (cdr bufs))) | 434 (setq bufs (cdr bufs))) |
523 retval)) | 435 retval)) |
524 | 436 |
525 (defun gdb-instance-buffer-p (buf) | |
526 (save-excursion | |
527 (set-buffer buf) | |
528 (and gdb-buffer-type | |
529 (not (eq gdb-buffer-type 'gdba))))) | |
530 | |
531 ;; | 437 ;; |
532 ;; This assoc maps buffer type symbols to rules. Each rule is a list of | 438 ;; This assoc maps buffer type symbols to rules. Each rule is a list of |
533 ;; at least one and possible more functions. The functions have these | 439 ;; at least one and possible more functions. The functions have these |
534 ;; roles in defining a buffer type: | 440 ;; roles in defining a buffer type: |
535 ;; | 441 ;; |
538 ;; The remaining function(s) are optional: | 444 ;; The remaining function(s) are optional: |
539 ;; | 445 ;; |
540 ;; MODE - called in new new buffer with no arguments, should establish | 446 ;; MODE - called in new new buffer with no arguments, should establish |
541 ;; the proper mode for the buffer. | 447 ;; the proper mode for the buffer. |
542 ;; | 448 ;; |
543 | |
544 (defvar gdb-instance-buffer-rules-assoc '()) | |
545 | 449 |
546 (defun gdb-set-instance-buffer-rules (buffer-type &rest rules) | 450 (defun gdb-set-instance-buffer-rules (buffer-type &rest rules) |
547 (let ((binding (assoc buffer-type gdb-instance-buffer-rules-assoc))) | 451 (let ((binding (assoc buffer-type gdb-instance-buffer-rules-assoc))) |
548 (if binding | 452 (if binding |
549 (setcdr binding rules) | 453 (setcdr binding rules) |
562 ;; | 466 ;; |
563 | 467 |
564 (gdb-set-instance-buffer-rules 'gdb-partial-output-buffer | 468 (gdb-set-instance-buffer-rules 'gdb-partial-output-buffer |
565 'gdb-partial-output-name) | 469 'gdb-partial-output-name) |
566 | 470 |
567 (defun gdb-partial-output-name (instance) | 471 (defun gdb-partial-output-name () |
568 (concat "*partial-output-" | 472 (concat "*partial-output-" |
569 (gdb-instance-target-string instance) | 473 (gdb-instance-target-string) |
570 "*")) | 474 "*")) |
571 | 475 |
572 | 476 |
573 (gdb-set-instance-buffer-rules 'gdb-inferior-io | 477 (gdb-set-instance-buffer-rules 'gdb-inferior-io |
574 'gdb-inferior-io-name | 478 'gdb-inferior-io-name |
575 'gdb-inferior-io-mode) | 479 'gdb-inferior-io-mode) |
576 | 480 |
577 (defun gdb-inferior-io-name (instance) | 481 (defun gdb-inferior-io-name () |
578 (concat "*input/output of " | 482 (concat "*input/output of " |
579 (gdb-instance-target-string instance) | 483 (gdb-instance-target-string) |
580 "*")) | 484 "*")) |
581 | 485 |
582 (defvar gdb-inferior-io-mode-map (copy-keymap comint-mode-map)) | 486 (defvar gdb-inferior-io-mode-map (copy-keymap comint-mode-map)) |
583 (define-key comint-mode-map "\C-c\C-c" 'gdb-inferior-io-interrupt) | 487 (define-key comint-mode-map "\C-c\C-c" 'gdb-inferior-io-interrupt) |
584 (define-key comint-mode-map "\C-c\C-z" 'gdb-inferior-io-stop) | 488 (define-key comint-mode-map "\C-c\C-z" 'gdb-inferior-io-stop) |
601 (setq comint-input-sender 'gdb-inferior-io-sender)) | 505 (setq comint-input-sender 'gdb-inferior-io-sender)) |
602 | 506 |
603 (defun gdb-inferior-io-sender (proc string) | 507 (defun gdb-inferior-io-sender (proc string) |
604 (save-excursion | 508 (save-excursion |
605 (set-buffer (process-buffer proc)) | 509 (set-buffer (process-buffer proc)) |
606 (let ((instance gdb-buffer-instance)) | 510 (set-buffer (gdb-get-instance-buffer 'gdba)) |
607 (set-buffer (gdb-get-instance-buffer instance 'gdba)) | |
608 (let ((gdb-proc (get-buffer-process (current-buffer)))) | |
609 (process-send-string gdb-proc string) | 511 (process-send-string gdb-proc string) |
610 (process-send-string gdb-proc "\n"))))) | 512 (process-send-string gdb-proc "\n"))) |
611 | 513 |
612 (defun gdb-inferior-io-interrupt (instance) | 514 (defun gdb-inferior-io-interrupt () |
613 "Interrupt the program being debugged." | 515 "Interrupt the program being debugged." |
614 (interactive (list (gdb-needed-default-instance))) | 516 (interactive (list gdb-proc)) |
615 (interrupt-process | 517 (interrupt-process |
616 (get-buffer-process (gdb-get-instance-buffer instance 'gdba)) comint-ptyp)) | 518 (get-buffer-process (gdb-get-instance-buffer 'gdba)) comint-ptyp)) |
617 | 519 |
618 (defun gdb-inferior-io-quit (instance) | 520 (defun gdb-inferior-io-quit () |
619 "Send quit signal to the program being debugged." | 521 "Send quit signal to the program being debugged." |
620 (interactive (list (gdb-needed-default-instance))) | 522 (interactive (list gdb-proc)) |
621 (quit-process | 523 (quit-process |
622 (get-buffer-process (gdb-get-instance-buffer instance 'gdba)) comint-ptyp)) | 524 (get-buffer-process (gdb-get-instance-buffer 'gdba)) comint-ptyp)) |
623 | 525 |
624 (defun gdb-inferior-io-stop (instance) | 526 (defun gdb-inferior-io-stop () |
625 "Stop the program being debugged." | 527 "Stop the program being debugged." |
626 (interactive (list (gdb-needed-default-instance))) | 528 (interactive (list gdb-proc)) |
627 (stop-process | 529 (stop-process |
628 (get-buffer-process (gdb-get-instance-buffer instance 'gdba)) comint-ptyp)) | 530 (get-buffer-process (gdb-get-instance-buffer 'gdba)) comint-ptyp)) |
629 | 531 |
630 (defun gdb-inferior-io-eof (instance) | 532 (defun gdb-inferior-io-eof () |
631 "Send end-of-file to the program being debugged." | 533 "Send end-of-file to the program being debugged." |
632 (interactive (list (gdb-needed-default-instance))) | 534 (interactive (list gdb-proc)) |
633 (process-send-eof | 535 (process-send-eof |
634 (get-buffer-process (gdb-get-instance-buffer instance 'gdba)))) | 536 (get-buffer-process (gdb-get-instance-buffer 'gdba)))) |
635 | 537 |
636 | 538 |
637 ;; | 539 ;; |
638 ;; gdb communications | 540 ;; gdb communications |
639 ;; | 541 ;; |
660 ;; | 562 ;; |
661 | 563 |
662 (defun gdb-send (proc string) | 564 (defun gdb-send (proc string) |
663 "A comint send filter for gdb. | 565 "A comint send filter for gdb. |
664 This filter may simply queue output for a later time." | 566 This filter may simply queue output for a later time." |
665 (let ((instance (gdb-proc->instance proc))) | 567 (gdb-instance-enqueue-input (concat string "\n"))) |
666 (gdb-instance-enqueue-input instance (concat string "\n")))) | |
667 | 568 |
668 ;; Note: Stuff enqueued here will be sent to the next prompt, even if it | 569 ;; Note: Stuff enqueued here will be sent to the next prompt, even if it |
669 ;; is a query, or other non-top-level prompt. To guarantee stuff will get | 570 ;; is a query, or other non-top-level prompt. To guarantee stuff will get |
670 ;; sent to the top-level prompt, currently it must be put in the idle queue. | 571 ;; sent to the top-level prompt, currently it must be put in the idle queue. |
671 ;; ^^^^^^^^^ | 572 ;; ^^^^^^^^^ |
672 ;; [This should encourage gdb extensions that invoke gdb commands to let | 573 ;; [This should encourage gdb extensions that invoke gdb commands to let |
673 ;; the user go first; it is not a bug. -t] | 574 ;; the user go first; it is not a bug. -t] |
674 ;; | 575 ;; |
675 | 576 |
676 (defun gdb-instance-enqueue-input (instance item) | 577 (defun gdb-instance-enqueue-input (item) |
677 (if (gdb-instance-prompting instance) | 578 (if (gdb-instance-prompting) |
678 (progn | 579 (progn |
679 (gdb-send-item instance item) | 580 (gdb-send-item item) |
680 (set-gdb-instance-prompting instance nil)) | 581 (set-gdb-instance-prompting nil)) |
681 (set-gdb-instance-input-queue | 582 (set-gdb-instance-input-queue |
682 instance | 583 (cons item (gdb-instance-input-queue))))) |
683 (cons item (gdb-instance-input-queue instance))))) | 584 |
684 | 585 (defun gdb-instance-dequeue-input () |
685 (defun gdb-instance-dequeue-input (instance) | 586 (let ((queue (gdb-instance-input-queue))) |
686 (let ((queue (gdb-instance-input-queue instance))) | |
687 (and queue | 587 (and queue |
688 (if (not (cdr queue)) | 588 (if (not (cdr queue)) |
689 (let ((answer (car queue))) | 589 (let ((answer (car queue))) |
690 (set-gdb-instance-input-queue instance '()) | 590 (set-gdb-instance-input-queue '()) |
691 answer) | 591 answer) |
692 (gdb-take-last-elt queue))))) | 592 (gdb-take-last-elt queue))))) |
693 | 593 |
694 (defun gdb-instance-enqueue-idle-input (instance item) | 594 (defun gdb-instance-enqueue-idle-input (item) |
695 (if (and (gdb-instance-prompting instance) | 595 (if (and (gdb-instance-prompting) |
696 (not (gdb-instance-input-queue instance))) | 596 (not (gdb-instance-input-queue))) |
697 (progn | 597 (progn |
698 (gdb-send-item instance item) | 598 (gdb-send-item item) |
699 (set-gdb-instance-prompting instance nil)) | 599 (set-gdb-instance-prompting nil)) |
700 (set-gdb-instance-idle-input-queue | 600 (set-gdb-instance-idle-input-queue |
701 instance | 601 (cons item (gdb-instance-idle-input-queue))))) |
702 (cons item (gdb-instance-idle-input-queue instance))))) | 602 |
703 | 603 (defun gdb-instance-dequeue-idle-input () |
704 (defun gdb-instance-dequeue-idle-input (instance) | 604 (let ((queue (gdb-instance-idle-input-queue))) |
705 (let ((queue (gdb-instance-idle-input-queue instance))) | |
706 (and queue | 605 (and queue |
707 (if (not (cdr queue)) | 606 (if (not (cdr queue)) |
708 (let ((answer (car queue))) | 607 (let ((answer (car queue))) |
709 (set-gdb-instance-idle-input-queue instance '()) | 608 (set-gdb-instance-idle-input-queue '()) |
710 answer) | 609 answer) |
711 (gdb-take-last-elt queue))))) | 610 (gdb-take-last-elt queue))))) |
712 | 611 |
713 ; Don't use this in general. | 612 ; Don't use this in general. |
714 (defun gdb-take-last-elt (l) | 613 (defun gdb-take-last-elt (l) |
741 :group 'gud) | 640 :group 'gud) |
742 | 641 |
743 (defun gdba-marker-filter (string) | 642 (defun gdba-marker-filter (string) |
744 "A gud marker filter for gdb." | 643 "A gud marker filter for gdb." |
745 ;; Bogons don't tell us the process except through scoping crud. | 644 ;; Bogons don't tell us the process except through scoping crud. |
746 (let ((instance (gdb-proc->instance proc))) | 645 (gdb-output-burst string)) |
747 (gdb-output-burst instance string))) | |
748 | 646 |
749 (defvar gdb-annotation-rules | 647 (defvar gdb-annotation-rules |
750 '(("frames-invalid" gdb-invalidate-frame-and-assembler) | 648 '(("frames-invalid" gdb-invalidate-frame-and-assembler) |
751 ("breakpoints-invalid" gdb-invalidate-breakpoints-and-assembler) | 649 ("breakpoints-invalid" gdb-invalidate-breakpoints-and-assembler) |
752 ("pre-prompt" gdb-pre-prompt) | 650 ("pre-prompt" gdb-pre-prompt) |
773 ; ("elt" gdb-elt) | 671 ; ("elt" gdb-elt) |
774 ("field-begin" gdb-field-begin) | 672 ("field-begin" gdb-field-begin) |
775 ("field-end" gdb-field-end) | 673 ("field-end" gdb-field-end) |
776 ) "An assoc mapping annotation tags to functions which process them.") | 674 ) "An assoc mapping annotation tags to functions which process them.") |
777 | 675 |
778 (defun gdb-ignore-annotation (instance args) | 676 (defun gdb-ignore-annotation (args) |
779 nil) | 677 nil) |
780 | 678 |
781 (defconst gdb-source-spec-regexp | 679 (defconst gdb-source-spec-regexp |
782 "\\(.*\\):\\([0-9]*\\):[0-9]*:[a-z]*:\\(0x[a-f0-9]*\\)") | 680 "\\(.*\\):\\([0-9]*\\):[0-9]*:[a-z]*:\\(0x[a-f0-9]*\\)") |
783 | 681 |
784 ;; Do not use this except as an annotation handler." | 682 ;; Do not use this except as an annotation handler." |
785 (defun gdb-source (instance args) | 683 (defun gdb-source (args) |
786 (string-match gdb-source-spec-regexp args) | 684 (string-match gdb-source-spec-regexp args) |
787 ;; Extract the frame position from the marker. | 685 ;; Extract the frame position from the marker. |
788 (setq gud-last-frame | 686 (setq gud-last-frame |
789 (cons | 687 (cons |
790 (substring args (match-beginning 1) (match-end 1)) | 688 (substring args (match-beginning 1) (match-end 1)) |
793 (match-end 2))))) | 691 (match-end 2))))) |
794 (setq gdb-current-address (substring args (match-beginning 3) | 692 (setq gdb-current-address (substring args (match-beginning 3) |
795 (match-end 3))) | 693 (match-end 3))) |
796 (setq gdb-main-or-pc gdb-current-address) | 694 (setq gdb-main-or-pc gdb-current-address) |
797 ;update with new frame for machine code if necessary | 695 ;update with new frame for machine code if necessary |
798 (gdb-invalidate-assembler instance)) | 696 (gdb-invalidate-assembler)) |
799 | 697 |
800 ;; An annotation handler for `prompt'. | 698 ;; An annotation handler for `prompt'. |
801 ;; This sends the next command (if any) to gdb. | 699 ;; This sends the next command (if any) to gdb. |
802 (defun gdb-prompt (instance ignored) | 700 (defun gdb-prompt (ignored) |
803 (let ((sink (gdb-instance-output-sink instance))) | 701 (let ((sink (gdb-instance-output-sink))) |
804 (cond | 702 (cond |
805 ((eq sink 'user) t) | 703 ((eq sink 'user) t) |
806 ((eq sink 'post-emacs) | 704 ((eq sink 'post-emacs) |
807 (set-gdb-instance-output-sink instance 'user)) | 705 (set-gdb-instance-output-sink 'user)) |
808 (t | 706 (t |
809 (set-gdb-instance-output-sink instance 'user) | 707 (set-gdb-instance-output-sink 'user) |
810 (error "Phase error in gdb-prompt (got %s)" sink)))) | 708 (error "Phase error in gdb-prompt (got %s)" sink)))) |
811 (let ((highest (gdb-instance-dequeue-input instance))) | 709 (let ((highest (gdb-instance-dequeue-input))) |
812 (if highest | 710 (if highest |
813 (gdb-send-item instance highest) | 711 (gdb-send-item highest) |
814 (let ((lowest (gdb-instance-dequeue-idle-input instance))) | 712 (let ((lowest (gdb-instance-dequeue-idle-input))) |
815 (if lowest | 713 (if lowest |
816 (gdb-send-item instance lowest) | 714 (gdb-send-item lowest) |
817 (progn | 715 (progn |
818 (set-gdb-instance-prompting instance t) | 716 (set-gdb-instance-prompting t) |
819 (gud-display-frame))))))) | 717 (gud-display-frame))))))) |
820 | 718 |
821 ;; An annotation handler for non-top-level prompts. | 719 ;; An annotation handler for non-top-level prompts. |
822 (defun gdb-subprompt (instance ignored) | 720 (defun gdb-subprompt (ignored) |
823 (let ((highest (gdb-instance-dequeue-input instance))) | 721 (let ((highest (gdb-instance-dequeue-input))) |
824 (if highest | 722 (if highest |
825 (gdb-send-item instance highest) | 723 (gdb-send-item highest) |
826 (set-gdb-instance-prompting instance t)))) | 724 (set-gdb-instance-prompting t)))) |
827 | 725 |
828 (defun gdb-send-item (instance item) | 726 (defun gdb-send-item (item) |
829 (set-gdb-instance-current-item instance item) | 727 (set-gdb-instance-current-item item) |
830 (if (stringp item) | 728 (if (stringp item) |
831 (progn | 729 (progn |
832 (set-gdb-instance-output-sink instance 'user) | 730 (set-gdb-instance-output-sink 'user) |
833 (process-send-string (gdb-instance-process instance) | 731 (process-send-string gdb-proc item)) |
834 item)) | |
835 (progn | 732 (progn |
836 (gdb-clear-partial-output instance) | 733 (gdb-clear-partial-output) |
837 (set-gdb-instance-output-sink instance 'pre-emacs) | 734 (set-gdb-instance-output-sink 'pre-emacs) |
838 (process-send-string (gdb-instance-process instance) | 735 (process-send-string gdb-proc (car item))))) |
839 (car item))))) | |
840 | 736 |
841 ;; An annotation handler for `pre-prompt'. | 737 ;; An annotation handler for `pre-prompt'. |
842 ;; This terminates the collection of output from a previous | 738 ;; This terminates the collection of output from a previous |
843 ;; command if that happens to be in effect. | 739 ;; command if that happens to be in effect. |
844 (defun gdb-pre-prompt (instance ignored) | 740 (defun gdb-pre-prompt (ignored) |
845 (let ((sink (gdb-instance-output-sink instance))) | 741 (let ((sink (gdb-instance-output-sink))) |
846 (cond | 742 (cond |
847 ((eq sink 'user) t) | 743 ((eq sink 'user) t) |
848 ((eq sink 'emacs) | 744 ((eq sink 'emacs) |
849 (set-gdb-instance-output-sink instance 'post-emacs) | 745 (set-gdb-instance-output-sink 'post-emacs) |
850 (let ((handler | 746 (let ((handler |
851 (car (cdr (gdb-instance-current-item instance))))) | 747 (car (cdr (gdb-instance-current-item))))) |
852 (save-excursion | 748 (save-excursion |
853 (set-buffer (gdb-get-create-instance-buffer | 749 (set-buffer (gdb-get-create-instance-buffer |
854 instance 'gdb-partial-output-buffer)) | 750 'gdb-partial-output-buffer)) |
855 (funcall handler)))) | 751 (funcall handler)))) |
856 (t | 752 (t |
857 (set-gdb-instance-output-sink instance 'user) | 753 (set-gdb-instance-output-sink 'user) |
858 (error "Output sink phase error 1"))))) | 754 (error "Output sink phase error 1"))))) |
859 | 755 |
860 ;; An annotation handler for `starting'. This says that I/O for the subprocess | 756 ;; An annotation handler for `starting'. This says that I/O for the subprocess |
861 ;; is now the program being debugged, not GDB. | 757 ;; is now the program being debugged, not GDB. |
862 (defun gdb-starting (instance ignored) | 758 (defun gdb-starting (ignored) |
863 (let ((sink (gdb-instance-output-sink instance))) | 759 (let ((sink (gdb-instance-output-sink))) |
864 (cond | 760 (cond |
865 ((eq sink 'user) | 761 ((eq sink 'user) |
866 (set-gdb-instance-output-sink instance 'inferior)) | 762 (set-gdb-instance-output-sink 'inferior)) |
867 (t (error "Unexpected `starting' annotation"))))) | 763 (t (error "Unexpected `starting' annotation"))))) |
868 | 764 |
869 ;; An annotation handler for `exited' and other annotations which say that | 765 ;; An annotation handler for `exited' and other annotations which say that |
870 ;; I/O for the subprocess is now GDB, not the program being debugged. | 766 ;; I/O for the subprocess is now GDB, not the program being debugged. |
871 (defun gdb-stopping (instance ignored) | 767 (defun gdb-stopping (ignored) |
872 (let ((sink (gdb-instance-output-sink instance))) | 768 (let ((sink (gdb-instance-output-sink))) |
873 (cond | 769 (cond |
874 ((eq sink 'inferior) | 770 ((eq sink 'inferior) |
875 (set-gdb-instance-output-sink instance 'user)) | 771 (set-gdb-instance-output-sink 'user)) |
876 (t (error "Unexpected stopping annotation"))))) | 772 (t (error "Unexpected stopping annotation"))))) |
877 | 773 |
878 ;; An annotation handler for `stopped'. It is just like gdb-stopping, except | 774 ;; An annotation handler for `stopped'. It is just like gdb-stopping, except |
879 ;; that if we already set the output sink to 'user in gdb-stopping, that is | 775 ;; that if we already set the output sink to 'user in gdb-stopping, that is |
880 ;; fine. | 776 ;; fine. |
881 (defun gdb-stopped (instance ignored) | 777 (defun gdb-stopped (ignored) |
882 (let ((sink (gdb-instance-output-sink instance))) | 778 (let ((sink (gdb-instance-output-sink))) |
883 (cond | 779 (cond |
884 ((eq sink 'inferior) | 780 ((eq sink 'inferior) |
885 (set-gdb-instance-output-sink instance 'user)) | 781 (set-gdb-instance-output-sink 'user)) |
886 ((eq sink 'user) t) | 782 ((eq sink 'user) t) |
887 (t (error "Unexpected stopped annotation"))))) | 783 (t (error "Unexpected stopped annotation"))))) |
888 | 784 |
889 (defun gdb-frame-begin (instance ignored) | 785 (defun gdb-frame-begin (ignored) |
890 (let ((sink (gdb-instance-output-sink instance))) | 786 (let ((sink (gdb-instance-output-sink))) |
891 (cond | 787 (cond |
892 ((eq sink 'inferior) | 788 ((eq sink 'inferior) |
893 (set-gdb-instance-output-sink instance 'user)) | 789 (set-gdb-instance-output-sink 'user)) |
894 ((eq sink 'user) t) | 790 ((eq sink 'user) t) |
895 ((eq sink 'emacs) t) | 791 ((eq sink 'emacs) t) |
896 (t (error "Unexpected frame-begin annotation (%S)" sink))))) | 792 (t (error "Unexpected frame-begin annotation (%S)" sink))))) |
897 | 793 |
898 ;; An annotation handler for `post-prompt'. | 794 ;; An annotation handler for `post-prompt'. |
899 ;; This begins the collection of output from the current | 795 ;; This begins the collection of output from the current |
900 ;; command if that happens to be appropriate." | 796 ;; command if that happens to be appropriate." |
901 (defun gdb-post-prompt (instance ignored) | 797 (defun gdb-post-prompt (ignored) |
902 (if (not (gdb-instance-pending-triggers instance)) | 798 (if (not (gdb-instance-pending-triggers)) |
903 (progn | 799 (progn |
904 (gdb-invalidate-registers instance ignored) | 800 (gdb-invalidate-registers ignored) |
905 (gdb-invalidate-locals instance ignored) | 801 (gdb-invalidate-locals ignored) |
906 (gdb-invalidate-display instance ignored))) | 802 (gdb-invalidate-display ignored))) |
907 (let ((sink (gdb-instance-output-sink instance))) | 803 (let ((sink (gdb-instance-output-sink))) |
908 (cond | 804 (cond |
909 ((eq sink 'user) t) | 805 ((eq sink 'user) t) |
910 ((eq sink 'pre-emacs) | 806 ((eq sink 'pre-emacs) |
911 (set-gdb-instance-output-sink instance 'emacs)) | 807 (set-gdb-instance-output-sink 'emacs)) |
912 | 808 |
913 (t | 809 (t |
914 (set-gdb-instance-output-sink instance 'user) | 810 (set-gdb-instance-output-sink 'user) |
915 (error "Output sink phase error 3"))))) | 811 (error "Output sink phase error 3"))))) |
916 | 812 |
917 ;; If we get an error whilst evaluating one of the expressions | 813 ;; If we get an error whilst evaluating one of the expressions |
918 ;; we won't get the display-end annotation. Set the sink back to | 814 ;; we won't get the display-end annotation. Set the sink back to |
919 ;; user to make sure that the error message is seen | 815 ;; user to make sure that the error message is seen |
920 | 816 |
921 (defun gdb-error-begin (instance ignored) | 817 (defun gdb-error-begin (ignored) |
922 (set-gdb-instance-output-sink instance 'user)) | 818 (set-gdb-instance-output-sink 'user)) |
923 | 819 |
924 (defun gdb-display-begin (instance ignored) | 820 (defun gdb-display-begin (ignored) |
925 (if (gdb-get-instance-buffer instance 'gdb-display-buffer) | 821 (if (gdb-get-instance-buffer 'gdb-display-buffer) |
926 (progn | 822 (progn |
927 (set-gdb-instance-output-sink instance 'emacs) | 823 (set-gdb-instance-output-sink 'emacs) |
928 (gdb-clear-partial-output instance) | 824 (gdb-clear-partial-output) |
929 (setq gdb-display-in-progress t)) | 825 (setq gdb-display-in-progress t)) |
930 (set-gdb-instance-output-sink instance 'user))) | 826 (set-gdb-instance-output-sink 'user))) |
931 | 827 |
932 (defun gdb-display-number-end (instance ignored) | 828 (defvar gdb-expression-buffer-name) |
933 (set-buffer (gdb-get-instance-buffer | 829 (defvar gdb-display-number) |
934 instance 'gdb-partial-output-buffer)) | 830 (defvar gdb-dive-display-number) |
831 | |
832 (defun gdb-display-number-end (ignored) | |
833 (set-buffer (gdb-get-instance-buffer 'gdb-partial-output-buffer)) | |
935 (setq gdb-display-number (buffer-string)) | 834 (setq gdb-display-number (buffer-string)) |
936 (setq gdb-expression-buffer-name | 835 (setq gdb-expression-buffer-name |
937 (concat "*display " gdb-display-number "*")) | 836 (concat "*display " gdb-display-number "*")) |
938 (save-excursion | 837 (save-excursion |
939 (if (progn | 838 (if (progn |
960 (gdb-expressions-mode) | 859 (gdb-expressions-mode) |
961 (make-frame '((height . 20) (width . 40) | 860 (make-frame '((height . 20) (width . 40) |
962 (tool-bar-lines . nil) | 861 (tool-bar-lines . nil) |
963 (menu-bar-lines . nil) | 862 (menu-bar-lines . nil) |
964 (minibuffer . nil)))))))))) | 863 (minibuffer . nil)))))))))) |
965 (set-buffer (gdb-get-instance-buffer | 864 (set-buffer (gdb-get-instance-buffer 'gdb-partial-output-buffer)) |
966 instance 'gdb-partial-output-buffer)) | |
967 (setq gdb-dive nil)) | 865 (setq gdb-dive nil)) |
968 | 866 |
969 (defun gdb-display-end (instance ignored) | 867 (defvar gdb-current-frame nil) |
970 (set-buffer (gdb-get-instance-buffer instance 'gdb-partial-output-buffer)) | 868 (defvar gdb-nesting-level) |
869 (defvar gdb-expression) | |
870 (defvar gdb-point) | |
871 (defvar gdb-annotation-arg) | |
872 | |
873 (defun gdb-display-end (ignored) | |
874 (set-buffer (gdb-get-instance-buffer 'gdb-partial-output-buffer)) | |
971 (goto-char (point-min)) | 875 (goto-char (point-min)) |
972 (search-forward ": ") | 876 (search-forward ": ") |
973 (looking-at "\\(.*?\\) =") | 877 (looking-at "\\(.*?\\) =") |
974 (let ((char "") | 878 (let ((char "") |
975 (gdb-temp-value (buffer-substring (match-beginning 1) | 879 (gdb-temp-value (buffer-substring (match-beginning 1) |
994 (progn | 898 (progn |
995 (save-excursion | 899 (save-excursion |
996 (set-buffer gdb-expression-buffer-name) | 900 (set-buffer gdb-expression-buffer-name) |
997 (setq buffer-read-only nil) | 901 (setq buffer-read-only nil) |
998 (delete-region (point-min) (point-max)) | 902 (delete-region (point-min) (point-max)) |
999 (insert-buffer (gdb-get-instance-buffer | 903 (insert-buffer (gdb-get-instance-buffer 'gdb-partial-output-buffer)) |
1000 instance 'gdb-partial-output-buffer)) | |
1001 (setq buffer-read-only t))) | 904 (setq buffer-read-only t))) |
1002 ; else | 905 ; else |
1003 ; display expression name... | 906 ; display expression name... |
1004 (goto-char (point-min)) | 907 (goto-char (point-min)) |
1005 (let ((start (progn (point))) | 908 (let ((start (progn (point))) |
1007 (save-excursion | 910 (save-excursion |
1008 (set-buffer gdb-expression-buffer-name) | 911 (set-buffer gdb-expression-buffer-name) |
1009 (setq buffer-read-only nil) | 912 (setq buffer-read-only nil) |
1010 (delete-region (point-min) (point-max)) | 913 (delete-region (point-min) (point-max)) |
1011 (insert-buffer-substring (gdb-get-instance-buffer | 914 (insert-buffer-substring (gdb-get-instance-buffer |
1012 gdb-buffer-instance | |
1013 'gdb-partial-output-buffer) | 915 'gdb-partial-output-buffer) |
1014 start end) | 916 start end) |
1015 (insert "\n"))) | 917 (insert "\n"))) |
1016 | 918 |
1017 (goto-char (point-min)) | 919 (goto-char (point-min)) |
1035 (setq buffer-read-only nil) | 937 (setq buffer-read-only nil) |
1036 (goto-char (point-max)) | 938 (goto-char (point-max)) |
1037 (insert "\n") | 939 (insert "\n") |
1038 (insert-text-button "[back]" 'type 'gdb-display-back) | 940 (insert-text-button "[back]" 'type 'gdb-display-back) |
1039 (setq buffer-read-only t)))) | 941 (setq buffer-read-only t)))) |
1040 (gdb-clear-partial-output instance) | 942 (gdb-clear-partial-output) |
1041 (set-gdb-instance-output-sink instance 'user) | 943 (set-gdb-instance-output-sink 'user) |
1042 (setq gdb-display-in-progress nil)) | 944 (setq gdb-display-in-progress nil)) |
1043 | 945 |
1044 (define-button-type 'gdb-display-back | 946 (define-button-type 'gdb-display-back |
1045 'help-echo (purecopy "mouse-2, RET: go back to previous display buffer") | 947 'help-echo (purecopy "mouse-2, RET: go back to previous display buffer") |
1046 'action (lambda (button) (gdb-display-go-back))) | 948 'action (lambda (button) (gdb-display-go-back))) |
1047 | 949 |
1048 (defun gdb-display-go-back () | 950 (defun gdb-display-go-back () |
1049 ; delete display so they don't accumulate and delete buffer | 951 ; delete display so they don't accumulate and delete buffer |
1050 (let ((number gdb-display-number)) | 952 (let ((number gdb-display-number)) |
1051 (gdb-instance-enqueue-idle-input | 953 (gdb-instance-enqueue-idle-input |
1052 gdb-buffer-instance | |
1053 (list (concat "server delete display " number "\n") | 954 (list (concat "server delete display " number "\n") |
1054 '(lambda () nil))) | 955 '(lambda () nil))) |
1055 (switch-to-buffer (concat "*display " gdb-dive-display-number "*")) | 956 (switch-to-buffer (concat "*display " gdb-dive-display-number "*")) |
1056 (kill-buffer (get-buffer (concat "*display " number "*"))))) | 957 (kill-buffer (get-buffer (concat "*display " number "*"))))) |
1057 | 958 |
1058 ; prefix annotations with ## and process whole output in one chunk | 959 ; prefix annotations with ## and process whole output in one chunk |
1059 ; in gdb-partial-output-buffer (to allow recursion). | 960 ; in gdb-partial-output-buffer (to allow recursion). |
1060 | 961 |
1061 ; array-section flags are just removed again but after counting. They | 962 ; array-section flags are just removed again but after counting. They |
1062 ; might also be useful for arrays of structures and structures with arrays. | 963 ; might also be useful for arrays of structures and structures with arrays. |
1063 (defun gdb-array-section-begin (instance args) | 964 (defun gdb-array-section-begin (args) |
1064 (if gdb-display-in-progress | 965 (if gdb-display-in-progress |
1065 (progn | 966 (progn |
1066 (save-excursion | 967 (save-excursion |
1067 (set-buffer (gdb-get-instance-buffer | 968 (set-buffer (gdb-get-instance-buffer 'gdb-partial-output-buffer)) |
1068 instance 'gdb-partial-output-buffer)) | |
1069 (goto-char (point-max)) | 969 (goto-char (point-max)) |
1070 (insert (concat "\n##array-section-begin " args "\n")))))) | 970 (insert (concat "\n##array-section-begin " args "\n")))))) |
1071 | 971 |
1072 (defun gdb-array-section-end (instance ignored) | 972 (defun gdb-array-section-end (ignored) |
1073 (if gdb-display-in-progress | 973 (if gdb-display-in-progress |
1074 (progn | 974 (progn |
1075 (save-excursion | 975 (save-excursion |
1076 (set-buffer (gdb-get-instance-buffer | 976 (set-buffer (gdb-get-instance-buffer 'gdb-partial-output-buffer)) |
1077 instance 'gdb-partial-output-buffer)) | |
1078 (goto-char (point-max)) | 977 (goto-char (point-max)) |
1079 (insert "\n##array-section-end\n"))))) | 978 (insert "\n##array-section-end\n"))))) |
1080 | 979 |
1081 (defun gdb-field-begin (instance args) | 980 (defun gdb-field-begin (args) |
1082 (if gdb-display-in-progress | 981 (if gdb-display-in-progress |
1083 (progn | 982 (progn |
1084 (save-excursion | 983 (save-excursion |
1085 (set-buffer (gdb-get-instance-buffer | 984 (set-buffer (gdb-get-instance-buffer 'gdb-partial-output-buffer)) |
1086 instance 'gdb-partial-output-buffer)) | |
1087 (goto-char (point-max)) | 985 (goto-char (point-max)) |
1088 (insert (concat "\n##field-begin " args "\n")))))) | 986 (insert (concat "\n##field-begin " args "\n")))))) |
1089 | 987 |
1090 (defun gdb-field-end (instance ignored) | 988 (defun gdb-field-end (ignored) |
1091 (if gdb-display-in-progress | 989 (if gdb-display-in-progress |
1092 (progn | 990 (progn |
1093 (save-excursion | 991 (save-excursion |
1094 (set-buffer (gdb-get-instance-buffer | 992 (set-buffer (gdb-get-instance-buffer 'gdb-partial-output-buffer)) |
1095 instance 'gdb-partial-output-buffer)) | |
1096 (goto-char (point-max)) | 993 (goto-char (point-max)) |
1097 (insert "\n##field-end\n"))))) | 994 (insert "\n##field-end\n"))))) |
1098 | 995 |
1099 (defun gdb-elt (instance ignored) | 996 (defun gdb-elt (ignored) |
1100 (if gdb-display-in-progress | 997 (if gdb-display-in-progress |
1101 (progn | 998 (progn |
1102 (goto-char (point-max)) | 999 (goto-char (point-max)) |
1103 (insert "\n##elt\n")))) | 1000 (insert "\n##elt\n")))) |
1104 | 1001 |
1121 ; get rid of ##field-end and `,' or `}' | 1018 ; get rid of ##field-end and `,' or `}' |
1122 (gdb-delete-line) | 1019 (gdb-delete-line) |
1123 (gdb-delete-line) | 1020 (gdb-delete-line) |
1124 (setq gdb-nesting-level (- gdb-nesting-level 1))) | 1021 (setq gdb-nesting-level (- gdb-nesting-level 1))) |
1125 | 1022 |
1023 (defvar gdb-dive-map nil) | |
1024 | |
1025 (setq gdb-dive-map (make-keymap)) | |
1026 (define-key gdb-dive-map [mouse-2] 'gdb-dive) | |
1027 (define-key gdb-dive-map [S-mouse-2] 'gdb-dive-new-frame) | |
1028 | |
1029 (defun gdb-dive (event) | |
1030 "Dive into structure." | |
1031 (interactive "e") | |
1032 (setq gdb-dive t) | |
1033 (gdb-dive-new-frame event)) | |
1034 | |
1035 (defun gdb-dive-new-frame (event) | |
1036 "Dive into structure and display in a new frame." | |
1037 (interactive "e") | |
1038 (save-excursion | |
1039 (mouse-set-point event) | |
1040 (let ((point (point)) (gdb-full-expression gdb-expression) | |
1041 (end (progn (end-of-line) (point))) | |
1042 (gdb-part-expression "") (gdb-last-field nil) (gdb-display-char nil)) | |
1043 (beginning-of-line) | |
1044 (if (looking-at "\*") (setq gdb-display-char "*")) | |
1045 (re-search-forward "\\(\\S-+\\) = " end t) | |
1046 (setq gdb-last-field (buffer-substring-no-properties | |
1047 (match-beginning 1) | |
1048 (match-end 1))) | |
1049 (goto-char (match-beginning 1)) | |
1050 (let ((last-column (current-column))) | |
1051 (while (re-search-backward "\\s-\\(\\S-+\\) = {" nil t) | |
1052 (goto-char (match-beginning 1)) | |
1053 (if (and (< (current-column) last-column) | |
1054 (> (count-lines 1 (point)) 1)) | |
1055 (progn | |
1056 (setq gdb-part-expression | |
1057 (concat "." (buffer-substring-no-properties | |
1058 (match-beginning 1) | |
1059 (match-end 1)) gdb-part-expression)) | |
1060 (setq last-column (current-column)))))) | |
1061 ; * not needed for components of a pointer to a structure in gdb | |
1062 (if (string-equal "*" (substring gdb-full-expression 0 1)) | |
1063 (setq gdb-full-expression (substring gdb-full-expression 1 nil))) | |
1064 (setq gdb-full-expression | |
1065 (concat gdb-full-expression gdb-part-expression "." gdb-last-field)) | |
1066 (gdb-instance-enqueue-idle-input (list | |
1067 (concat "server display" gdb-display-char | |
1068 " " gdb-full-expression "\n") | |
1069 '(lambda () nil)))))) | |
1070 | |
1126 (defun gdb-insert-field () | 1071 (defun gdb-insert-field () |
1127 (let ((start (progn (point))) | 1072 (let ((start (progn (point))) |
1128 (end (progn (next-line) (point))) | 1073 (end (progn (next-line) (point))) |
1129 (num 0)) | 1074 (num 0)) |
1130 (save-excursion | 1075 (save-excursion |
1133 (if (string-equal gdb-annotation-arg "\*") (insert "\*")) | 1078 (if (string-equal gdb-annotation-arg "\*") (insert "\*")) |
1134 (while (<= num gdb-nesting-level) | 1079 (while (<= num gdb-nesting-level) |
1135 (insert "\t") | 1080 (insert "\t") |
1136 (setq num (+ num 1))) | 1081 (setq num (+ num 1))) |
1137 (insert-buffer-substring (gdb-get-instance-buffer | 1082 (insert-buffer-substring (gdb-get-instance-buffer |
1138 gdb-buffer-instance | |
1139 'gdb-partial-output-buffer) | 1083 'gdb-partial-output-buffer) |
1140 start end) | 1084 start end) |
1141 (put-text-property (- (point) (- end start)) (- (point) 1) | 1085 (put-text-property (- (point) (- end start)) (- (point) 1) |
1142 'mouse-face 'highlight) | 1086 'mouse-face 'highlight) |
1143 (put-text-property (- (point) (- end start)) (- (point) 1) | 1087 (put-text-property (- (point) (- end start)) (- (point) 1) |
1144 'local-map gdb-dive-map) | 1088 'local-map gdb-dive-map) |
1145 (setq buffer-read-only t)) | 1089 (setq buffer-read-only t)) |
1146 (delete-region start end))) | 1090 (delete-region start end))) |
1091 | |
1092 (defvar gdb-values) | |
1147 | 1093 |
1148 (defun gdb-array-format () | 1094 (defun gdb-array-format () |
1149 (while (re-search-forward "##" nil t) | 1095 (while (re-search-forward "##" nil t) |
1150 ; keep making recursive calls... | 1096 ; keep making recursive calls... |
1151 (if (looking-at "array-section-begin") | 1097 (if (looking-at "array-section-begin") |
1167 (gdb-array-format1)))) | 1113 (gdb-array-format1)))) |
1168 ;else get rid of ##array-section-end etc | 1114 ;else get rid of ##array-section-end etc |
1169 (gdb-delete-line) | 1115 (gdb-delete-line) |
1170 (setq gdb-nesting-level (- gdb-nesting-level 1)) | 1116 (setq gdb-nesting-level (- gdb-nesting-level 1)) |
1171 (gdb-array-format))))) | 1117 (gdb-array-format))))) |
1118 | |
1119 (defvar gdb-array-start) | |
1120 (defvar gdb-array-stop) | |
1121 | |
1122 (defvar gdb-array-slice-map nil) | |
1123 (setq gdb-array-slice-map (make-keymap)) | |
1124 (define-key gdb-array-slice-map [mouse-2] 'gdb-array-slice) | |
1125 | |
1126 (defun gdb-array-slice (event) | |
1127 "Select an array slice to display." | |
1128 (interactive "e") | |
1129 (mouse-set-point event) | |
1130 (save-excursion | |
1131 (let ((n -1) (stop 0) (start 0) (point (point))) | |
1132 (beginning-of-line) | |
1133 (while (search-forward "[" point t) | |
1134 (setq n (+ n 1))) | |
1135 (setq start (string-to-int (read-string "Start index: "))) | |
1136 (aset gdb-array-start n start) | |
1137 (setq stop (string-to-int (read-string "Stop index: "))) | |
1138 (aset gdb-array-stop n stop))) | |
1139 (gdb-array-format1)) | |
1140 | |
1141 (defvar gdb-display-string) | |
1142 (defvar gdb-array-size) | |
1172 | 1143 |
1173 (defun gdb-array-format1 () | 1144 (defun gdb-array-format1 () |
1174 (setq gdb-display-string "") | 1145 (setq gdb-display-string "") |
1175 (setq buffer-read-only nil) | 1146 (setq buffer-read-only nil) |
1176 (delete-region (point-min) (point-max)) | 1147 (delete-region (point-min) (point-max)) |
1245 (setq num (+ num 1))) | 1216 (setq num (+ num 1))) |
1246 (insert | 1217 (insert |
1247 (concat "\n Slice : " array-slice "\n\nIndex\tValues\n\n")))) | 1218 (concat "\n Slice : " array-slice "\n\nIndex\tValues\n\n")))) |
1248 (setq buffer-read-only t)) | 1219 (setq buffer-read-only t)) |
1249 | 1220 |
1250 (setq gdb-dive-map (make-keymap)) | |
1251 (define-key gdb-dive-map [mouse-2] 'gdb-dive) | |
1252 (define-key gdb-dive-map [S-mouse-2] 'gdb-dive-new-frame) | |
1253 | |
1254 (defun gdb-dive (event) | |
1255 "Dive into structure." | |
1256 (interactive "e") | |
1257 (setq gdb-dive t) | |
1258 (gdb-dive-new-frame event)) | |
1259 | |
1260 (defun gdb-dive-new-frame (event) | |
1261 "Dive into structure and display in a new frame." | |
1262 (interactive "e") | |
1263 (save-excursion | |
1264 (mouse-set-point event) | |
1265 (let ((point (point)) (gdb-full-expression gdb-expression) | |
1266 (end (progn (end-of-line) (point))) | |
1267 (gdb-part-expression "") (gdb-last-field nil) (gdb-display-char nil)) | |
1268 (beginning-of-line) | |
1269 (if (looking-at "\*") (setq gdb-display-char "*")) | |
1270 (re-search-forward "\\(\\S-+\\) = " end t) | |
1271 (setq gdb-last-field (buffer-substring-no-properties | |
1272 (match-beginning 1) | |
1273 (match-end 1))) | |
1274 (goto-char (match-beginning 1)) | |
1275 (let ((last-column (current-column))) | |
1276 (while (re-search-backward "\\s-\\(\\S-+\\) = {" nil t) | |
1277 (goto-char (match-beginning 1)) | |
1278 (if (and (< (current-column) last-column) | |
1279 (> (count-lines 1 (point)) 1)) | |
1280 (progn | |
1281 (setq gdb-part-expression | |
1282 (concat "." (buffer-substring-no-properties | |
1283 (match-beginning 1) | |
1284 (match-end 1)) gdb-part-expression)) | |
1285 (setq last-column (current-column)))))) | |
1286 ; * not needed for components of a pointer to a structure in gdb | |
1287 (if (string-equal "*" (substring gdb-full-expression 0 1)) | |
1288 (setq gdb-full-expression (substring gdb-full-expression 1 nil))) | |
1289 (setq gdb-full-expression | |
1290 (concat gdb-full-expression gdb-part-expression "." gdb-last-field)) | |
1291 (gdb-instance-enqueue-idle-input gdb-buffer-instance | |
1292 (list | |
1293 (concat "server display" gdb-display-char | |
1294 " " gdb-full-expression "\n") | |
1295 '(lambda () nil)))))) | |
1296 | |
1297 ;; Handle a burst of output from a gdb instance. | 1221 ;; Handle a burst of output from a gdb instance. |
1298 ;; This function is (indirectly) used as a gud-marker-filter. | 1222 ;; This function is (indirectly) used as a gud-marker-filter. |
1299 ;; It must return output (if any) to be insterted in the gdb | 1223 ;; It must return output (if any) to be insterted in the gdb |
1300 ;; buffer. | 1224 ;; buffer. |
1301 | 1225 |
1302 (defun gdb-output-burst (instance string) | 1226 (defun gdb-output-burst (string) |
1303 "Handle a burst of output from a gdb instance. | 1227 "Handle a burst of output from a gdb instance. |
1304 This function is (indirectly) used as a gud-marker-filter. | 1228 This function is (indirectly) used as a gud-marker-filter. |
1305 It must return output (if any) to be insterted in the gdb | 1229 It must return output (if any) to be insterted in the gdb |
1306 buffer." | 1230 buffer." |
1307 | 1231 |
1308 (save-match-data | 1232 (save-match-data |
1309 (let ( | 1233 (let ( |
1310 ;; Recall the left over burst from last time | 1234 ;; Recall the left over burst from last time |
1311 (burst (concat (gdb-instance-burst instance) string)) | 1235 (burst (concat (gdb-instance-burst) string)) |
1312 ;; Start accumulating output for the GUD buffer | 1236 ;; Start accumulating output for the GUD buffer |
1313 (output "")) | 1237 (output "")) |
1314 | 1238 |
1315 ;; Process all the complete markers in this chunk. | 1239 ;; Process all the complete markers in this chunk. |
1316 | 1240 |
1321 | 1245 |
1322 ;; Stuff prior to the match is just ordinary output. | 1246 ;; Stuff prior to the match is just ordinary output. |
1323 ;; It is either concatenated to OUTPUT or directed | 1247 ;; It is either concatenated to OUTPUT or directed |
1324 ;; elsewhere. | 1248 ;; elsewhere. |
1325 (setq output | 1249 (setq output |
1326 (gdb-concat-output | 1250 (gdb-concat-output output |
1327 instance | |
1328 output | |
1329 (substring burst 0 (match-beginning 0)))) | 1251 (substring burst 0 (match-beginning 0)))) |
1330 | 1252 |
1331 ;; Take that stuff off the burst. | 1253 ;; Take that stuff off the burst. |
1332 (setq burst (substring burst (match-end 0))) | 1254 (setq burst (substring burst (match-end 0))) |
1333 | 1255 |
1342 (annotation-rule (assoc annotation-type | 1264 (annotation-rule (assoc annotation-type |
1343 gdb-annotation-rules))) | 1265 gdb-annotation-rules))) |
1344 ;; Call the handler for this annotation. | 1266 ;; Call the handler for this annotation. |
1345 (if annotation-rule | 1267 (if annotation-rule |
1346 (funcall (car (cdr annotation-rule)) | 1268 (funcall (car (cdr annotation-rule)) |
1347 instance | |
1348 annotation-arguments) | 1269 annotation-arguments) |
1349 ;; Else the annotation is not recognized. Ignore it silently, | 1270 ;; Else the annotation is not recognized. Ignore it silently, |
1350 ;; so that GDB can add new annotations without causing | 1271 ;; so that GDB can add new annotations without causing |
1351 ;; us to blow up. | 1272 ;; us to blow up. |
1352 )))) | 1273 )))) |
1357 (if (string-match "\n\\'\\|\n\032\\'\\|\n\032\032.*\\'" | 1278 (if (string-match "\n\\'\\|\n\032\\'\\|\n\032\032.*\\'" |
1358 burst) | 1279 burst) |
1359 (progn | 1280 (progn |
1360 ;; Everything before the potential marker start can be output. | 1281 ;; Everything before the potential marker start can be output. |
1361 (setq output | 1282 (setq output |
1362 (gdb-concat-output | 1283 (gdb-concat-output output |
1363 instance | |
1364 output | |
1365 (substring burst 0 (match-beginning 0)))) | 1284 (substring burst 0 (match-beginning 0)))) |
1366 | 1285 |
1367 ;; Everything after, we save, to combine with later input. | 1286 ;; Everything after, we save, to combine with later input. |
1368 (setq burst (substring burst (match-beginning 0)))) | 1287 (setq burst (substring burst (match-beginning 0)))) |
1369 | 1288 |
1370 ;; In case we know the burst contains no partial annotations: | 1289 ;; In case we know the burst contains no partial annotations: |
1371 (progn | 1290 (progn |
1372 (setq output (gdb-concat-output instance output burst)) | 1291 (setq output (gdb-concat-output output burst)) |
1373 (setq burst ""))) | 1292 (setq burst ""))) |
1374 | 1293 |
1375 ;; Save the remaining burst for the next call to this function. | 1294 ;; Save the remaining burst for the next call to this function. |
1376 (set-gdb-instance-burst instance burst) | 1295 (set-gdb-instance-burst burst) |
1377 output))) | 1296 output))) |
1378 | 1297 |
1379 (defun gdb-concat-output (instance so-far new) | 1298 (defun gdb-concat-output (so-far new) |
1380 (let ((sink (gdb-instance-output-sink instance))) | 1299 (let ((sink (gdb-instance-output-sink ))) |
1381 (cond | 1300 (cond |
1382 ((eq sink 'user) (concat so-far new)) | 1301 ((eq sink 'user) (concat so-far new)) |
1383 ((or (eq sink 'pre-emacs) (eq sink 'post-emacs)) so-far) | 1302 ((or (eq sink 'pre-emacs) (eq sink 'post-emacs)) so-far) |
1384 ((eq sink 'emacs) | 1303 ((eq sink 'emacs) |
1385 (gdb-append-to-partial-output instance new) | 1304 (gdb-append-to-partial-output new) |
1386 so-far) | 1305 so-far) |
1387 ((eq sink 'inferior) | 1306 ((eq sink 'inferior) |
1388 (gdb-append-to-inferior-io instance new) | 1307 (gdb-append-to-inferior-io new) |
1389 so-far) | 1308 so-far) |
1390 (t (error "Bogon output sink %S" sink))))) | 1309 (t (error "Bogon output sink %S" sink))))) |
1391 | 1310 |
1392 (defun gdb-append-to-partial-output (instance string) | 1311 (defun gdb-append-to-partial-output (string) |
1393 (save-excursion | 1312 (save-excursion |
1394 (set-buffer | 1313 (set-buffer |
1395 (gdb-get-create-instance-buffer | 1314 (gdb-get-create-instance-buffer 'gdb-partial-output-buffer)) |
1396 instance 'gdb-partial-output-buffer)) | |
1397 (goto-char (point-max)) | 1315 (goto-char (point-max)) |
1398 (insert string))) | 1316 (insert string))) |
1399 | 1317 |
1400 (defun gdb-clear-partial-output (instance) | 1318 (defun gdb-clear-partial-output () |
1401 (save-excursion | 1319 (save-excursion |
1402 (set-buffer | 1320 (set-buffer |
1403 (gdb-get-create-instance-buffer | 1321 (gdb-get-create-instance-buffer 'gdb-partial-output-buffer)) |
1404 instance 'gdb-partial-output-buffer)) | |
1405 (delete-region (point-min) (point-max)))) | 1322 (delete-region (point-min) (point-max)))) |
1406 | 1323 |
1407 (defun gdb-append-to-inferior-io (instance string) | 1324 (defun gdb-append-to-inferior-io (string) |
1408 (save-excursion | 1325 (save-excursion |
1409 (set-buffer | 1326 (set-buffer |
1410 (gdb-get-create-instance-buffer | 1327 (gdb-get-create-instance-buffer 'gdb-inferior-io)) |
1411 instance 'gdb-inferior-io)) | |
1412 (goto-char (point-max)) | 1328 (goto-char (point-max)) |
1413 (insert-before-markers string)) | 1329 (insert-before-markers string)) |
1414 (gdb-display-buffer | 1330 (gdb-display-buffer |
1415 (gdb-get-create-instance-buffer instance | 1331 (gdb-get-create-instance-buffer 'gdb-inferior-io))) |
1416 'gdb-inferior-io))) | 1332 |
1417 | 1333 (defun gdb-clear-inferior-io () |
1418 (defun gdb-clear-inferior-io (instance) | |
1419 (save-excursion | 1334 (save-excursion |
1420 (set-buffer | 1335 (set-buffer |
1421 (gdb-get-create-instance-buffer | 1336 (gdb-get-create-instance-buffer 'gdb-inferior-io)) |
1422 instance 'gdb-inferior-io)) | |
1423 (delete-region (point-min) (point-max)))) | 1337 (delete-region (point-min) (point-max)))) |
1424 | 1338 |
1425 | 1339 |
1426 | 1340 |
1427 ;; One trick is to have a command who's output is always available in | 1341 ;; One trick is to have a command who's output is always available in |
1431 ;; There are two aspects to this: gdb has to tell us when the output | 1345 ;; There are two aspects to this: gdb has to tell us when the output |
1432 ;; for that command might have changed, and we have to be able to run | 1346 ;; for that command might have changed, and we have to be able to run |
1433 ;; the command behind the user's back. | 1347 ;; the command behind the user's back. |
1434 ;; | 1348 ;; |
1435 ;; The idle input queue and the output phasing associated with | 1349 ;; The idle input queue and the output phasing associated with |
1436 ;; the instance variable `(gdb-instance-output-sink instance)' help | 1350 ;; the instance variable `(gdb-instance-output-sink)' help |
1437 ;; us to run commands behind the user's back. | 1351 ;; us to run commands behind the user's back. |
1438 ;; | 1352 ;; |
1439 ;; Below is the code for specificly managing buffers of output from one | 1353 ;; Below is the code for specificly managing buffers of output from one |
1440 ;; command. | 1354 ;; command. |
1441 ;; | 1355 ;; |
1448 ;; | 1362 ;; |
1449 ;; NAME is the function name. DEMAND-PREDICATE tests if output is really needed. | 1363 ;; NAME is the function name. DEMAND-PREDICATE tests if output is really needed. |
1450 ;; GDB-COMMAND is a string of such. OUTPUT-HANDLER is the function bound to the | 1364 ;; GDB-COMMAND is a string of such. OUTPUT-HANDLER is the function bound to the |
1451 ;; input in the input queue (see comment about ``gdb communications'' above). | 1365 ;; input in the input queue (see comment about ``gdb communications'' above). |
1452 (defmacro def-gdb-auto-update-trigger (name demand-predicate gdb-command output-handler) | 1366 (defmacro def-gdb-auto-update-trigger (name demand-predicate gdb-command output-handler) |
1453 `(defun ,name (instance &optional ignored) | 1367 `(defun ,name (&optional ignored) |
1454 (if (and (,demand-predicate instance) | 1368 (if (and (,demand-predicate) |
1455 (not (member ',name | 1369 (not (member ',name |
1456 (gdb-instance-pending-triggers instance)))) | 1370 (gdb-instance-pending-triggers)))) |
1457 (progn | 1371 (progn |
1458 (gdb-instance-enqueue-idle-input | 1372 (gdb-instance-enqueue-idle-input |
1459 instance | |
1460 (list ,gdb-command ',output-handler)) | 1373 (list ,gdb-command ',output-handler)) |
1461 (set-gdb-instance-pending-triggers | 1374 (set-gdb-instance-pending-triggers |
1462 instance | |
1463 (cons ',name | 1375 (cons ',name |
1464 (gdb-instance-pending-triggers instance))))))) | 1376 (gdb-instance-pending-triggers))))))) |
1465 | 1377 |
1466 (defmacro def-gdb-auto-update-handler (name trigger buf-key custom-defun) | 1378 (defmacro def-gdb-auto-update-handler (name trigger buf-key custom-defun) |
1467 `(defun ,name () | 1379 `(defun ,name () |
1468 (set-gdb-instance-pending-triggers | 1380 (set-gdb-instance-pending-triggers |
1469 instance | |
1470 (delq ',trigger | 1381 (delq ',trigger |
1471 (gdb-instance-pending-triggers instance))) | 1382 (gdb-instance-pending-triggers))) |
1472 (let ((buf (gdb-get-instance-buffer instance | 1383 (let ((buf (gdb-get-instance-buffer ',buf-key))) |
1473 ',buf-key))) | |
1474 (and buf | 1384 (and buf |
1475 (save-excursion | 1385 (save-excursion |
1476 (set-buffer buf) | 1386 (set-buffer buf) |
1477 (let ((p (point)) | 1387 (let ((p (point)) |
1478 (buffer-read-only nil)) | 1388 (buffer-read-only nil)) |
1479 (delete-region (point-min) (point-max)) | 1389 (delete-region (point-min) (point-max)) |
1480 (insert-buffer (gdb-get-create-instance-buffer | 1390 (insert-buffer (gdb-get-create-instance-buffer |
1481 instance | |
1482 'gdb-partial-output-buffer)) | 1391 'gdb-partial-output-buffer)) |
1483 (goto-char p))))) | 1392 (goto-char p))))) |
1484 ; put customisation here | 1393 ; put customisation here |
1485 (,custom-defun))) | 1394 (,custom-defun))) |
1486 | 1395 |
1487 (defmacro def-gdb-auto-updated-buffer | 1396 (defmacro def-gdb-auto-updated-buffer |
1488 (buffer-key trigger-name gdb-command output-handler-name custom-defun) | 1397 (buffer-key trigger-name gdb-command output-handler-name custom-defun) |
1489 `(progn | 1398 `(progn |
1490 (def-gdb-auto-update-trigger ,trigger-name | 1399 (def-gdb-auto-update-trigger ,trigger-name |
1491 ;; The demand predicate: | 1400 ;; The demand predicate: |
1492 (lambda (instance) | 1401 (lambda () |
1493 (gdb-get-instance-buffer instance ',buffer-key)) | 1402 (gdb-get-instance-buffer ',buffer-key)) |
1494 ,gdb-command | 1403 ,gdb-command |
1495 ,output-handler-name) | 1404 ,output-handler-name) |
1496 (def-gdb-auto-update-handler ,output-handler-name | 1405 (def-gdb-auto-update-handler ,output-handler-name |
1497 ,trigger-name ,buffer-key ,custom-defun))) | 1406 ,trigger-name ,buffer-key ,custom-defun))) |
1498 | 1407 |
1523 ;; from the command above. That function will copy the output into | 1432 ;; from the command above. That function will copy the output into |
1524 ;; the appropriately typed buffer. That function will be called: | 1433 ;; the appropriately typed buffer. That function will be called: |
1525 gdb-info-breakpoints-handler | 1434 gdb-info-breakpoints-handler |
1526 ;; buffer specific functions | 1435 ;; buffer specific functions |
1527 gdb-info-breakpoints-custom) | 1436 gdb-info-breakpoints-custom) |
1437 | |
1438 (defvar gdb-cdir nil "Compilation directory.") | |
1439 (defvar breakpoint-enabled-icon | |
1440 "Icon for enabled breakpoint in display margin") | |
1441 (defvar breakpoint-disabled-icon | |
1442 "Icon for disabled breakpoint in display margin") | |
1528 | 1443 |
1529 ;-put breakpoint icons in relevant margins (even those set in the GUD buffer) | 1444 ;-put breakpoint icons in relevant margins (even those set in the GUD buffer) |
1530 (defun gdb-info-breakpoints-custom () | 1445 (defun gdb-info-breakpoints-custom () |
1531 (let ((flag)(address)) | 1446 (let ((flag)(address)) |
1532 | 1447 |
1541 (remove-images (point-min) (point-max)) | 1456 (remove-images (point-min) (point-max)) |
1542 (remove-strings (point-min) (point-max)))) | 1457 (remove-strings (point-min) (point-max)))) |
1543 (setq buffers (cdr buffers))))) | 1458 (setq buffers (cdr buffers))))) |
1544 | 1459 |
1545 (save-excursion | 1460 (save-excursion |
1546 (set-buffer (gdb-get-instance-buffer instance 'gdb-breakpoints-buffer)) | 1461 (set-buffer (gdb-get-instance-buffer 'gdb-breakpoints-buffer)) |
1547 (save-excursion | 1462 (save-excursion |
1548 (goto-char (point-min)) | 1463 (goto-char (point-min)) |
1549 (while (< (point) (- (point-max) 1)) | 1464 (while (< (point) (- (point-max) 1)) |
1550 (forward-line 1) | 1465 (forward-line 1) |
1551 (if (looking-at "[^\t].*breakpoint") | 1466 (if (looking-at "[^\t].*breakpoint") |
1568 (with-current-buffer (current-buffer) | 1483 (with-current-buffer (current-buffer) |
1569 (progn | 1484 (progn |
1570 (set (make-local-variable 'gud-minor-mode) 'gdba) | 1485 (set (make-local-variable 'gud-minor-mode) 'gdba) |
1571 (set (make-local-variable 'tool-bar-map) | 1486 (set (make-local-variable 'tool-bar-map) |
1572 gud-tool-bar-map) | 1487 gud-tool-bar-map) |
1573 (set (make-variable-buffer-local 'left-margin-width) 2) | 1488 (setq left-margin-width 2) |
1574 (if (get-buffer-window (current-buffer)) | 1489 (if (get-buffer-window (current-buffer)) |
1575 (set-window-margins (get-buffer-window | 1490 (set-window-margins (get-buffer-window |
1576 (current-buffer)) | 1491 (current-buffer)) |
1577 left-margin-width | 1492 left-margin-width |
1578 right-margin-width)))) | 1493 right-margin-width)))) |
1597 'left-margin) | 1512 'left-margin) |
1598 (put-string "b" (point) "disabled" | 1513 (put-string "b" (point) "disabled" |
1599 'left-margin))))))))) | 1514 'left-margin))))))))) |
1600 (end-of-line)))))) | 1515 (end-of-line)))))) |
1601 | 1516 |
1602 (defun gdb-breakpoints-buffer-name (instance) | 1517 (defun gdb-breakpoints-buffer-name () |
1603 (save-excursion | 1518 (save-excursion |
1604 (set-buffer (process-buffer (gdb-instance-process instance))) | 1519 (set-buffer (process-buffer gdb-proc)) |
1605 (concat "*breakpoints of " (gdb-instance-target-string instance) "*"))) | 1520 (concat "*breakpoints of " (gdb-instance-target-string) "*"))) |
1606 | 1521 |
1607 (defun gdb-display-breakpoints-buffer (instance) | 1522 (defun gdb-display-breakpoints-buffer () |
1608 (interactive (list (gdb-needed-default-instance))) | 1523 (interactive (list gdb-proc)) |
1609 (gdb-display-buffer | 1524 (gdb-display-buffer |
1610 (gdb-get-create-instance-buffer instance | 1525 (gdb-get-create-instance-buffer 'gdb-breakpoints-buffer))) |
1611 'gdb-breakpoints-buffer))) | 1526 |
1612 | 1527 (defun gdb-frame-breakpoints-buffer () |
1613 (defun gdb-frame-breakpoints-buffer (instance) | 1528 (interactive (list gdb-proc)) |
1614 (interactive (list (gdb-needed-default-instance))) | |
1615 (switch-to-buffer-other-frame | 1529 (switch-to-buffer-other-frame |
1616 (gdb-get-create-instance-buffer instance | 1530 (gdb-get-create-instance-buffer 'gdb-breakpoints-buffer))) |
1617 'gdb-breakpoints-buffer))) | |
1618 | 1531 |
1619 (defvar gdb-breakpoints-mode-map nil) | 1532 (defvar gdb-breakpoints-mode-map nil) |
1620 (setq gdb-breakpoints-mode-map (make-keymap)) | 1533 (setq gdb-breakpoints-mode-map (make-keymap)) |
1621 (suppress-keymap gdb-breakpoints-mode-map) | 1534 (suppress-keymap gdb-breakpoints-mode-map) |
1622 | 1535 |
1641 (setq mode-name "Breakpoints") | 1554 (setq mode-name "Breakpoints") |
1642 (use-local-map gdb-breakpoints-mode-map) | 1555 (use-local-map gdb-breakpoints-mode-map) |
1643 (set (make-local-variable 'gud-minor-mode) 'gdba) | 1556 (set (make-local-variable 'gud-minor-mode) 'gdba) |
1644 (set (make-local-variable 'tool-bar-map) gud-tool-bar-map) | 1557 (set (make-local-variable 'tool-bar-map) gud-tool-bar-map) |
1645 (setq buffer-read-only t) | 1558 (setq buffer-read-only t) |
1646 (gdb-invalidate-breakpoints gdb-buffer-instance)) | 1559 (gdb-invalidate-breakpoints)) |
1647 | 1560 |
1648 (defun gdb-toggle-bp-this-line () | 1561 (defun gdb-toggle-bp-this-line () |
1649 (interactive) | 1562 (interactive) |
1650 (save-excursion | 1563 (save-excursion |
1651 (beginning-of-line 1) | 1564 (beginning-of-line 1) |
1652 (if (not (looking-at "\\([0-9]+\\).*point\\s-*\\S-*\\s-*\\(.\\)")) | 1565 (if (not (looking-at "\\([0-9]+\\).*point\\s-*\\S-*\\s-*\\(.\\)")) |
1653 (error "Not recognized as break/watchpoint line") | 1566 (error "Not recognized as break/watchpoint line") |
1654 (gdb-instance-enqueue-idle-input | 1567 (gdb-instance-enqueue-idle-input |
1655 gdb-buffer-instance | |
1656 (list | 1568 (list |
1657 (concat | 1569 (concat |
1658 (if (eq ?y (char-after (match-beginning 2))) | 1570 (if (eq ?y (char-after (match-beginning 2))) |
1659 "server disable " | 1571 "server disable " |
1660 "server enable ") | 1572 "server enable ") |
1667 (interactive) | 1579 (interactive) |
1668 (beginning-of-line 1) | 1580 (beginning-of-line 1) |
1669 (if (not (looking-at "\\([0-9]+\\).*point\\s-*\\S-*\\s-*\\(.\\)")) | 1581 (if (not (looking-at "\\([0-9]+\\).*point\\s-*\\S-*\\s-*\\(.\\)")) |
1670 (error "Not recognized as break/watchpoint line") | 1582 (error "Not recognized as break/watchpoint line") |
1671 (gdb-instance-enqueue-idle-input | 1583 (gdb-instance-enqueue-idle-input |
1672 gdb-buffer-instance | |
1673 (list | 1584 (list |
1674 (concat | 1585 (concat |
1675 "server delete " | 1586 "server delete " |
1676 (buffer-substring (match-beginning 0) | 1587 (buffer-substring (match-beginning 0) |
1677 (match-end 1)) | 1588 (match-end 1)) |
1678 "\n") | 1589 "\n") |
1679 '(lambda () nil))))) | 1590 '(lambda () nil))))) |
1591 | |
1592 (defvar gdb-source-window nil) | |
1680 | 1593 |
1681 (defun gdb-goto-bp-this-line () | 1594 (defun gdb-goto-bp-this-line () |
1682 "Display the file at the breakpoint specified." | 1595 "Display the file at the breakpoint specified." |
1683 (interactive) | 1596 (interactive) |
1684 (save-excursion | 1597 (save-excursion |
1713 gdb-info-frames-handler | 1626 gdb-info-frames-handler |
1714 gdb-info-frames-custom) | 1627 gdb-info-frames-custom) |
1715 | 1628 |
1716 (defun gdb-info-frames-custom () | 1629 (defun gdb-info-frames-custom () |
1717 (save-excursion | 1630 (save-excursion |
1718 (set-buffer (gdb-get-instance-buffer instance 'gdb-stack-buffer)) | 1631 (set-buffer (gdb-get-instance-buffer 'gdb-stack-buffer)) |
1719 (let ((buffer-read-only nil)) | 1632 (let ((buffer-read-only nil)) |
1720 (goto-char (point-min)) | 1633 (goto-char (point-min)) |
1721 (looking-at "\\S-*\\s-*\\(\\S-*\\)") | 1634 (looking-at "\\S-*\\s-*\\(\\S-*\\)") |
1722 (setq gdb-current-frame (buffer-substring (match-beginning 1) (match-end 1))) | 1635 (setq gdb-current-frame (buffer-substring (match-beginning 1) (match-end 1))) |
1723 (while (< (point) (point-max)) | 1636 (while (< (point) (point-max)) |
1724 (put-text-property (progn (beginning-of-line) (point)) | 1637 (put-text-property (progn (beginning-of-line) (point)) |
1725 (progn (end-of-line) (point)) | 1638 (progn (end-of-line) (point)) |
1726 'mouse-face 'highlight) | 1639 'mouse-face 'highlight) |
1727 (forward-line 1))))) | 1640 (forward-line 1))))) |
1728 | 1641 |
1729 (defun gdb-stack-buffer-name (instance) | 1642 (defun gdb-stack-buffer-name () |
1730 (save-excursion | 1643 (save-excursion |
1731 (set-buffer (process-buffer (gdb-instance-process instance))) | 1644 (set-buffer (process-buffer gdb-proc)) |
1732 (concat "*stack frames of " | 1645 (concat "*stack frames of " |
1733 (gdb-instance-target-string instance) "*"))) | 1646 (gdb-instance-target-string) "*"))) |
1734 | 1647 |
1735 (defun gdb-display-stack-buffer (instance) | 1648 (defun gdb-display-stack-buffer () |
1736 (interactive (list (gdb-needed-default-instance))) | 1649 (interactive (list gdb-proc)) |
1737 (gdb-display-buffer | 1650 (gdb-display-buffer |
1738 (gdb-get-create-instance-buffer instance | 1651 (gdb-get-create-instance-buffer 'gdb-stack-buffer))) |
1739 'gdb-stack-buffer))) | 1652 |
1740 | 1653 (defun gdb-frame-stack-buffer () |
1741 (defun gdb-frame-stack-buffer (instance) | 1654 (interactive (list gdb-proc)) |
1742 (interactive (list (gdb-needed-default-instance))) | |
1743 (switch-to-buffer-other-frame | 1655 (switch-to-buffer-other-frame |
1744 (gdb-get-create-instance-buffer instance | 1656 (gdb-get-create-instance-buffer 'gdb-stack-buffer))) |
1745 'gdb-stack-buffer))) | |
1746 | 1657 |
1747 (defvar gdb-frames-mode-map nil) | 1658 (defvar gdb-frames-mode-map nil) |
1748 (setq gdb-frames-mode-map (make-keymap)) | 1659 (setq gdb-frames-mode-map (make-keymap)) |
1749 (suppress-keymap gdb-frames-mode-map) | 1660 (suppress-keymap gdb-frames-mode-map) |
1750 (define-key gdb-frames-mode-map [mouse-2] | 1661 (define-key gdb-frames-mode-map [mouse-2] |
1758 (setq mode-name "Frames") | 1669 (setq mode-name "Frames") |
1759 (set (make-local-variable 'gud-minor-mode) 'gdba) | 1670 (set (make-local-variable 'gud-minor-mode) 'gdba) |
1760 (set (make-local-variable 'tool-bar-map) gud-tool-bar-map) | 1671 (set (make-local-variable 'tool-bar-map) gud-tool-bar-map) |
1761 (setq buffer-read-only t) | 1672 (setq buffer-read-only t) |
1762 (use-local-map gdb-frames-mode-map) | 1673 (use-local-map gdb-frames-mode-map) |
1763 (gdb-invalidate-frames gdb-buffer-instance)) | 1674 (gdb-invalidate-frames)) |
1764 | 1675 |
1765 (defun gdb-get-frame-number () | 1676 (defun gdb-get-frame-number () |
1766 (save-excursion | 1677 (save-excursion |
1767 (let* ((pos (re-search-backward "^#\\([0-9]*\\)" nil t)) | 1678 (let* ((pos (re-search-backward "^#\\([0-9]*\\)" nil t)) |
1768 (n (or (and pos | 1679 (n (or (and pos |
1781 (save-excursion | 1692 (save-excursion |
1782 (goto-char (posn-point (event-end e))) | 1693 (goto-char (posn-point (event-end e))) |
1783 (setq selection (gdb-get-frame-number)))) | 1694 (setq selection (gdb-get-frame-number)))) |
1784 (select-window (posn-window (event-end e))) | 1695 (select-window (posn-window (event-end e))) |
1785 (save-excursion | 1696 (save-excursion |
1786 (set-buffer (gdb-get-instance-buffer (gdb-needed-default-instance) 'gdba)) | 1697 (set-buffer (gdb-get-instance-buffer 'gdba)) |
1787 (gdb-instance-enqueue-idle-input | 1698 (gdb-instance-enqueue-idle-input |
1788 gdb-buffer-instance | |
1789 (list | 1699 (list |
1790 (concat (gud-format-command "server frame %p" selection) | 1700 (concat (gud-format-command "server frame %p" selection) |
1791 "\n") | 1701 "\n") |
1792 '(lambda () nil))) | 1702 '(lambda () nil))) |
1793 (gud-display-frame)))) | 1703 (gud-display-frame)))) |
1821 (setq mode-name "Registers") | 1731 (setq mode-name "Registers") |
1822 (set (make-local-variable 'gud-minor-mode) 'gdba) | 1732 (set (make-local-variable 'gud-minor-mode) 'gdba) |
1823 (set (make-local-variable 'tool-bar-map) gud-tool-bar-map) | 1733 (set (make-local-variable 'tool-bar-map) gud-tool-bar-map) |
1824 (setq buffer-read-only t) | 1734 (setq buffer-read-only t) |
1825 (use-local-map gdb-registers-mode-map) | 1735 (use-local-map gdb-registers-mode-map) |
1826 (gdb-invalidate-registers gdb-buffer-instance)) | 1736 (gdb-invalidate-registers)) |
1827 | 1737 |
1828 (defun gdb-registers-buffer-name (instance) | 1738 (defun gdb-registers-buffer-name () |
1829 (save-excursion | 1739 (save-excursion |
1830 (set-buffer (process-buffer (gdb-instance-process instance))) | 1740 (set-buffer (process-buffer gdb-proc)) |
1831 (concat "*registers of " (gdb-instance-target-string instance) "*"))) | 1741 (concat "*registers of " (gdb-instance-target-string) "*"))) |
1832 | 1742 |
1833 (defun gdb-display-registers-buffer (instance) | 1743 (defun gdb-display-registers-buffer () |
1834 (interactive (list (gdb-needed-default-instance))) | 1744 (interactive (list gdb-proc)) |
1835 (gdb-display-buffer | 1745 (gdb-display-buffer |
1836 (gdb-get-create-instance-buffer instance | 1746 (gdb-get-create-instance-buffer 'gdb-registers-buffer))) |
1837 'gdb-registers-buffer))) | 1747 |
1838 | 1748 (defun gdb-frame-registers-buffer () |
1839 (defun gdb-frame-registers-buffer (instance) | 1749 (interactive (list gdb-proc)) |
1840 (interactive (list (gdb-needed-default-instance))) | |
1841 (switch-to-buffer-other-frame | 1750 (switch-to-buffer-other-frame |
1842 (gdb-get-create-instance-buffer instance | 1751 (gdb-get-create-instance-buffer 'gdb-registers-buffer))) |
1843 'gdb-registers-buffer))) | |
1844 | 1752 |
1845 ;; | 1753 ;; |
1846 ;; Locals buffers | 1754 ;; Locals buffers |
1847 ;; | 1755 ;; |
1848 | 1756 |
1853 gdb-info-locals-custom) | 1761 gdb-info-locals-custom) |
1854 | 1762 |
1855 | 1763 |
1856 ;Abbreviate for arrays and structures. These can be expanded using gud-display | 1764 ;Abbreviate for arrays and structures. These can be expanded using gud-display |
1857 (defun gdb-info-locals-handler nil | 1765 (defun gdb-info-locals-handler nil |
1858 (set-gdb-instance-pending-triggers | 1766 (set-gdb-instance-pending-triggers (delq (quote gdb-invalidate-locals) |
1859 instance (delq (quote gdb-invalidate-locals) | 1767 (gdb-instance-pending-triggers))) |
1860 (gdb-instance-pending-triggers instance))) | 1768 (let ((buf (gdb-get-instance-buffer (quote gdb-partial-output-buffer)))) |
1861 (let ((buf (gdb-get-instance-buffer instance | |
1862 (quote gdb-partial-output-buffer)))) | |
1863 (save-excursion | 1769 (save-excursion |
1864 (set-buffer buf) | 1770 (set-buffer buf) |
1865 (goto-char (point-min)) | 1771 (goto-char (point-min)) |
1866 (replace-regexp "^ .*\n" "") | 1772 (replace-regexp "^ .*\n" "") |
1867 (goto-char (point-min)) | 1773 (goto-char (point-min)) |
1868 (replace-regexp "{[-0-9, {}\]*\n" "(array);\n"))) | 1774 (replace-regexp "{[-0-9, {}\]*\n" "(array);\n"))) |
1869 (goto-char (point-min)) | 1775 (goto-char (point-min)) |
1870 (replace-regexp "{.*=.*\n" "(structure);\n") | 1776 (replace-regexp "{.*=.*\n" "(structure);\n") |
1871 (let ((buf (gdb-get-instance-buffer instance (quote gdb-locals-buffer)))) | 1777 (let ((buf (gdb-get-instance-buffer (quote gdb-locals-buffer)))) |
1872 (and buf (save-excursion | 1778 (and buf (save-excursion |
1873 (set-buffer buf) | 1779 (set-buffer buf) |
1874 (let ((p (point)) | 1780 (let ((p (point)) |
1875 (buffer-read-only nil)) | 1781 (buffer-read-only nil)) |
1876 (delete-region (point-min) (point-max)) | 1782 (delete-region (point-min) (point-max)) |
1877 (insert-buffer (gdb-get-create-instance-buffer | 1783 (insert-buffer (gdb-get-create-instance-buffer |
1878 instance | |
1879 (quote gdb-partial-output-buffer))) | 1784 (quote gdb-partial-output-buffer))) |
1880 (goto-char p))))) | 1785 (goto-char p))))) |
1881 (run-hooks (quote gdb-info-locals-hook))) | 1786 (run-hooks (quote gdb-info-locals-hook))) |
1882 | 1787 |
1883 (defun gdb-info-locals-custom () | 1788 (defun gdb-info-locals-custom () |
1899 (setq mode-name "Locals") | 1804 (setq mode-name "Locals") |
1900 (set (make-local-variable 'gud-minor-mode) 'gdba) | 1805 (set (make-local-variable 'gud-minor-mode) 'gdba) |
1901 (set (make-local-variable 'tool-bar-map) gud-tool-bar-map) | 1806 (set (make-local-variable 'tool-bar-map) gud-tool-bar-map) |
1902 (setq buffer-read-only t) | 1807 (setq buffer-read-only t) |
1903 (use-local-map gdb-locals-mode-map) | 1808 (use-local-map gdb-locals-mode-map) |
1904 (gdb-invalidate-locals gdb-buffer-instance)) | 1809 (gdb-invalidate-locals)) |
1905 | 1810 |
1906 (defun gdb-locals-buffer-name (instance) | 1811 (defun gdb-locals-buffer-name () |
1907 (save-excursion | 1812 (save-excursion |
1908 (set-buffer (process-buffer (gdb-instance-process instance))) | 1813 (set-buffer (process-buffer gdb-proc)) |
1909 (concat "*locals of " (gdb-instance-target-string instance) "*"))) | 1814 (concat "*locals of " (gdb-instance-target-string) "*"))) |
1910 | 1815 |
1911 (defun gdb-display-locals-buffer (instance) | 1816 (defun gdb-display-locals-buffer () |
1912 (interactive (list (gdb-needed-default-instance))) | 1817 (interactive (list gdb-proc)) |
1913 (gdb-display-buffer | 1818 (gdb-display-buffer |
1914 (gdb-get-create-instance-buffer instance | 1819 (gdb-get-create-instance-buffer 'gdb-locals-buffer))) |
1915 'gdb-locals-buffer))) | 1820 |
1916 | 1821 (defun gdb-frame-locals-buffer () |
1917 (defun gdb-frame-locals-buffer (instance) | 1822 (interactive (list gdb-proc)) |
1918 (interactive (list (gdb-needed-default-instance))) | |
1919 (switch-to-buffer-other-frame | 1823 (switch-to-buffer-other-frame |
1920 (gdb-get-create-instance-buffer instance | 1824 (gdb-get-create-instance-buffer 'gdb-locals-buffer))) |
1921 'gdb-locals-buffer))) | |
1922 ;; | 1825 ;; |
1923 ;; Display expression buffers (just allow one to start with) | 1826 ;; Display expression buffers (just allow one to start with) |
1924 ;; | 1827 ;; |
1925 (gdb-set-instance-buffer-rules 'gdb-display-buffer | 1828 (gdb-set-instance-buffer-rules 'gdb-display-buffer |
1926 'gdb-display-buffer-name | 1829 'gdb-display-buffer-name |
1972 (setq mode-name "Display") | 1875 (setq mode-name "Display") |
1973 (set (make-local-variable 'gud-minor-mode) 'gdba) | 1876 (set (make-local-variable 'gud-minor-mode) 'gdba) |
1974 (set (make-local-variable 'tool-bar-map) gud-tool-bar-map) | 1877 (set (make-local-variable 'tool-bar-map) gud-tool-bar-map) |
1975 (setq buffer-read-only t) | 1878 (setq buffer-read-only t) |
1976 (use-local-map gdb-display-mode-map) | 1879 (use-local-map gdb-display-mode-map) |
1977 (gdb-invalidate-display gdb-buffer-instance)) | 1880 (gdb-invalidate-display)) |
1978 | 1881 |
1979 (defun gdb-display-buffer-name (instance) | 1882 (defun gdb-display-buffer-name () |
1980 (save-excursion | 1883 (save-excursion |
1981 (set-buffer (process-buffer (gdb-instance-process instance))) | 1884 (set-buffer (process-buffer gdb-proc)) |
1982 (concat "*Displayed expressions of " (gdb-instance-target-string instance) "*"))) | 1885 (concat "*Displayed expressions of " (gdb-instance-target-string) "*"))) |
1983 | 1886 |
1984 (defun gdb-display-display-buffer (instance) | 1887 (defun gdb-display-display-buffer () |
1985 (interactive (list (gdb-needed-default-instance))) | 1888 (interactive (list gdb-proc)) |
1986 (gdb-display-buffer | 1889 (gdb-display-buffer |
1987 (gdb-get-create-instance-buffer instance | 1890 (gdb-get-create-instance-buffer 'gdb-display-buffer))) |
1988 'gdb-display-buffer))) | 1891 |
1989 | 1892 (defun gdb-frame-display-buffer () |
1990 (defun gdb-frame-display-buffer (instance) | 1893 (interactive (list gdb-proc)) |
1991 (interactive (list (gdb-needed-default-instance))) | |
1992 (switch-to-buffer-other-frame | 1894 (switch-to-buffer-other-frame |
1993 (gdb-get-create-instance-buffer instance | 1895 (gdb-get-create-instance-buffer 'gdb-display-buffer))) |
1994 'gdb-display-buffer))) | |
1995 | 1896 |
1996 (defun gdb-toggle-disp-this-line () | 1897 (defun gdb-toggle-disp-this-line () |
1997 (interactive) | 1898 (interactive) |
1998 (save-excursion | 1899 (save-excursion |
1999 (beginning-of-line 1) | 1900 (beginning-of-line 1) |
2000 (if (not (looking-at "\\([0-9]+\\): \\([ny]\\)")) | 1901 (if (not (looking-at "\\([0-9]+\\): \\([ny]\\)")) |
2001 (error "No expression on this line") | 1902 (error "No expression on this line") |
2002 (gdb-instance-enqueue-idle-input | 1903 (gdb-instance-enqueue-idle-input |
2003 gdb-buffer-instance | |
2004 (list | 1904 (list |
2005 (concat | 1905 (concat |
2006 (if (eq ?y (char-after (match-beginning 2))) | 1906 (if (eq ?y (char-after (match-beginning 2))) |
2007 "server disable display " | 1907 "server disable display " |
2008 "server enable display ") | 1908 "server enable display ") |
2013 | 1913 |
2014 (defun gdb-delete-disp-this-line () | 1914 (defun gdb-delete-disp-this-line () |
2015 (interactive) | 1915 (interactive) |
2016 (save-excursion | 1916 (save-excursion |
2017 (set-buffer | 1917 (set-buffer |
2018 (gdb-get-instance-buffer gdb-buffer-instance 'gdb-display-buffer)) | 1918 (gdb-get-instance-buffer 'gdb-display-buffer)) |
2019 (beginning-of-line 1) | 1919 (beginning-of-line 1) |
2020 (if (not (looking-at "\\([0-9]+\\): \\([ny]\\)")) | 1920 (if (not (looking-at "\\([0-9]+\\): \\([ny]\\)")) |
2021 (error "No expression on this line") | 1921 (error "No expression on this line") |
2022 (let ((number (buffer-substring (match-beginning 0) | 1922 (let ((number (buffer-substring (match-beginning 0) |
2023 (match-end 1)))) | 1923 (match-end 1)))) |
2024 (gdb-instance-enqueue-idle-input | 1924 (gdb-instance-enqueue-idle-input |
2025 gdb-buffer-instance | |
2026 (list (concat "server delete display " number "\n") | 1925 (list (concat "server delete display " number "\n") |
2027 '(lambda () nil))) | 1926 '(lambda () nil))) |
2028 (if (not (display-graphic-p)) | 1927 (if (not (display-graphic-p)) |
2029 (kill-buffer (get-buffer (concat "*display " number "*"))) | 1928 (kill-buffer (get-buffer (concat "*display " number "*"))) |
2030 ;else | 1929 ;else |
2079 (setq buffer-read-only t)) | 1978 (setq buffer-read-only t)) |
2080 | 1979 |
2081 | 1980 |
2082 ;;;; Window management | 1981 ;;;; Window management |
2083 | 1982 |
2084 ;;; FIXME: This should only return true for buffers in the current instance | 1983 ;;; FIXME: This should only return true for buffers in the current gdb-proc |
2085 (defun gdb-protected-buffer-p (buffer) | 1984 (defun gdb-protected-buffer-p (buffer) |
2086 "Is BUFFER a buffer which we want to leave displayed?" | 1985 "Is BUFFER a buffer which we want to leave displayed?" |
2087 (save-excursion | 1986 (save-excursion |
2088 (set-buffer buffer) | 1987 (set-buffer buffer) |
2089 (or gdb-buffer-type | 1988 (or gdb-buffer-type |
2127 (set-window-buffer gdb-source-window buffer)) | 2026 (set-window-buffer gdb-source-window buffer)) |
2128 | 2027 |
2129 | 2028 |
2130 ;;; Shared keymap initialization: | 2029 ;;; Shared keymap initialization: |
2131 | 2030 |
2132 (defun gdb-display-gdb-buffer (instance) | 2031 (defun gdb-display-gdb-buffer () |
2133 (interactive (list (gdb-needed-default-instance))) | 2032 (interactive (list gdb-proc)) |
2134 (gdb-display-buffer | 2033 (gdb-display-buffer |
2135 (gdb-get-create-instance-buffer instance 'gdba))) | 2034 (gdb-get-create-instance-buffer 'gdba))) |
2136 | 2035 |
2137 (defun gdb-make-windows-menu (map) | 2036 (defun gdb-make-windows-menu (map) |
2138 ;; FIXME: This adds to the DBX, PerlDB, ... menu as well :-( | 2037 ;; FIXME: This adds to the DBX, PerlDB, ... menu as well :-( |
2139 ;; Probably we should create gdb-many-windows-map and put those menus | 2038 ;; Probably we should create gdb-many-windows-map and put those menus |
2140 ;; on that map. | 2039 ;; on that map. |
2159 (define-key gud-minor-mode-map "\C-c\M-\C-f" 'gdb-display-stack-buffer) | 2058 (define-key gud-minor-mode-map "\C-c\M-\C-f" 'gdb-display-stack-buffer) |
2160 (define-key gud-minor-mode-map "\C-c\M-\C-b" 'gdb-display-breakpoints-buffer) | 2059 (define-key gud-minor-mode-map "\C-c\M-\C-b" 'gdb-display-breakpoints-buffer) |
2161 | 2060 |
2162 (gdb-make-windows-menu gud-minor-mode-map) | 2061 (gdb-make-windows-menu gud-minor-mode-map) |
2163 | 2062 |
2164 (defun gdb-frame-gdb-buffer (instance) | 2063 (defun gdb-frame-gdb-buffer () |
2165 (interactive (list (gdb-needed-default-instance))) | 2064 (interactive (list gdb-proc)) |
2166 (switch-to-buffer-other-frame | 2065 (switch-to-buffer-other-frame |
2167 (gdb-get-create-instance-buffer instance 'gdba))) | 2066 (gdb-get-create-instance-buffer 'gdba))) |
2168 | 2067 |
2169 (defun gdb-make-frames-menu (map) | 2068 (defun gdb-make-frames-menu (map) |
2170 (define-key map [menu-bar frames] | 2069 (define-key map [menu-bar frames] |
2171 (cons "GDB-Frames" (make-sparse-keymap "GDB-Frames"))) | 2070 (cons "GDB-Frames" (make-sparse-keymap "GDB-Frames"))) |
2172 (define-key map [menu-bar frames gdb] | 2071 (define-key map [menu-bar frames gdb] |
2185 '("Assembler" . gdb-frame-assembler-buffer))) | 2084 '("Assembler" . gdb-frame-assembler-buffer))) |
2186 | 2085 |
2187 (if (display-graphic-p) | 2086 (if (display-graphic-p) |
2188 (gdb-make-frames-menu gud-minor-mode-map)) | 2087 (gdb-make-frames-menu gud-minor-mode-map)) |
2189 | 2088 |
2190 (defun gdb-proc-died (proc) | |
2191 ;; Stop displaying an arrow in a source file. | |
2192 (setq overlay-arrow-position nil) | |
2193 | |
2194 ;; Kill the dummy process, so that C-x C-c won't worry about it. | |
2195 (save-excursion | |
2196 (set-buffer (process-buffer proc)) | |
2197 (kill-process | |
2198 (get-buffer-process | |
2199 (gdb-get-instance-buffer gdb-buffer-instance 'gdb-inferior-io))))) | |
2200 ;; end of functions from gdba.el | 2089 ;; end of functions from gdba.el |
2201 | 2090 |
2202 ;; new functions for gdb-ui.el | 2091 ;; new functions for gdb-ui.el |
2092 | |
2093 (defvar gdb-main-file nil "Source file from which program execution begins.") | |
2094 | |
2203 ;; layout for all the windows | 2095 ;; layout for all the windows |
2204 (defun gdb-setup-windows (instance) | 2096 (defun gdb-setup-windows () |
2205 (gdb-display-locals-buffer instance) | 2097 (gdb-display-locals-buffer) |
2206 (gdb-display-stack-buffer instance) | 2098 (gdb-display-stack-buffer) |
2207 (delete-other-windows) | 2099 (delete-other-windows) |
2208 (gdb-display-breakpoints-buffer instance) | 2100 (gdb-display-breakpoints-buffer) |
2209 (gdb-display-display-buffer instance) | 2101 (gdb-display-display-buffer) |
2210 (delete-other-windows) | 2102 (delete-other-windows) |
2211 (split-window nil ( / ( * (window-height) 3) 4)) | 2103 (split-window nil ( / ( * (window-height) 3) 4)) |
2212 (split-window nil ( / (window-height) 3)) | 2104 (split-window nil ( / (window-height) 3)) |
2213 (split-window-horizontally) | 2105 (split-window-horizontally) |
2214 (other-window 1) | 2106 (other-window 1) |
2215 (switch-to-buffer (gdb-locals-buffer-name instance)) | 2107 (switch-to-buffer (gdb-locals-buffer-name)) |
2216 (other-window 1) | 2108 (other-window 1) |
2217 (switch-to-buffer | 2109 (switch-to-buffer |
2218 (if gud-last-last-frame | 2110 (if gud-last-last-frame |
2219 (gud-find-file (car gud-last-last-frame)) | 2111 (gud-find-file (car gud-last-last-frame)) |
2220 (gud-find-file gdb-main-file))) | 2112 (gud-find-file gdb-main-file))) |
2221 (setq gdb-source-window (get-buffer-window (current-buffer))) | 2113 (setq gdb-source-window (get-buffer-window (current-buffer))) |
2222 (split-window-horizontally) | 2114 (split-window-horizontally) |
2223 (other-window 1) | 2115 (other-window 1) |
2224 (switch-to-buffer (gdb-inferior-io-name instance)) | 2116 (switch-to-buffer (gdb-inferior-io-name)) |
2225 (other-window 1) | 2117 (other-window 1) |
2226 (switch-to-buffer (gdb-stack-buffer-name instance)) | 2118 (switch-to-buffer (gdb-stack-buffer-name)) |
2227 (split-window-horizontally) | 2119 (split-window-horizontally) |
2228 (other-window 1) | 2120 (other-window 1) |
2229 (switch-to-buffer (gdb-breakpoints-buffer-name instance)) | 2121 (switch-to-buffer (gdb-breakpoints-buffer-name)) |
2230 (other-window 1)) | 2122 (other-window 1)) |
2231 | 2123 |
2232 (defun gdb-restore-windows () | 2124 (defun gdb-restore-windows () |
2233 "Restore the basic arrangement of windows used by gdba. | 2125 "Restore the basic arrangement of windows used by gdba. |
2234 This arrangement depends on the value of `gdb-many-windows'." | 2126 This arrangement depends on the value of `gdb-many-windows'." |
2235 (interactive) | 2127 (interactive) |
2236 (if gdb-many-windows | 2128 (if gdb-many-windows |
2237 (progn | 2129 (progn |
2238 (switch-to-buffer gud-comint-buffer) | 2130 (switch-to-buffer gud-comint-buffer) |
2239 (delete-other-windows) | 2131 (delete-other-windows) |
2240 (gdb-setup-windows gdb-buffer-instance)) | 2132 (gdb-setup-windows)) |
2241 ;else | 2133 ;else |
2242 (switch-to-buffer gud-comint-buffer) | 2134 (switch-to-buffer gud-comint-buffer) |
2243 (delete-other-windows) | 2135 (delete-other-windows) |
2244 (split-window) | 2136 (split-window) |
2245 (other-window 1) | 2137 (other-window 1) |
2265 (other-window 1) | 2157 (other-window 1) |
2266 (setq gdb-many-windows nil)) | 2158 (setq gdb-many-windows nil)) |
2267 ;else | 2159 ;else |
2268 (switch-to-buffer gud-comint-buffer) | 2160 (switch-to-buffer gud-comint-buffer) |
2269 (delete-other-windows) | 2161 (delete-other-windows) |
2270 (gdb-setup-windows gdb-buffer-instance) | 2162 (gdb-setup-windows) |
2271 (setq gdb-many-windows t))) | 2163 (setq gdb-many-windows t))) |
2272 | 2164 |
2273 (defconst breakpoint-xpm-data "/* XPM */ | 2165 (defconst breakpoint-xpm-data "/* XPM */ |
2274 static char *magick[] = { | 2166 static char *magick[] = { |
2275 /* columns rows colors chars-per-pixel */ | 2167 /* columns rows colors chars-per-pixel */ |
2335 ;; all other windows. | 2227 ;; all other windows. |
2336 (if (eq (selected-window) (minibuffer-window)) | 2228 (if (eq (selected-window) (minibuffer-window)) |
2337 (other-window 1)) | 2229 (other-window 1)) |
2338 (delete-other-windows) | 2230 (delete-other-windows) |
2339 (if gdb-many-windows | 2231 (if gdb-many-windows |
2340 (gdb-setup-windows gdb-buffer-instance) | 2232 (gdb-setup-windows) |
2341 ;else | 2233 ;else |
2342 (gdb-display-breakpoints-buffer gdb-buffer-instance) | 2234 (gdb-display-breakpoints-buffer) |
2343 (gdb-display-display-buffer instance) | 2235 (gdb-display-display-buffer) |
2344 (gdb-display-stack-buffer instance) | 2236 (gdb-display-stack-buffer) |
2345 (delete-other-windows) | 2237 (delete-other-windows) |
2346 (split-window) | 2238 (split-window) |
2347 (other-window 1) | 2239 (other-window 1) |
2348 (switch-to-buffer (gud-find-file gdb-main-file)) | 2240 (switch-to-buffer (gud-find-file gdb-main-file)) |
2349 (other-window 1) | 2241 (other-window 1) |
2416 (while overlays | 2308 (while overlays |
2417 (let ((overlay (car overlays))) | 2309 (let ((overlay (car overlays))) |
2418 (when (string-equal (overlay-get overlay 'before-string) "gdb-arrow") | 2310 (when (string-equal (overlay-get overlay 'before-string) "gdb-arrow") |
2419 (delete-overlay overlay))) | 2311 (delete-overlay overlay))) |
2420 (setq overlays (cdr overlays))))) | 2312 (setq overlays (cdr overlays))))) |
2421 | |
2422 (defvar gdb-array-slice-map nil) | |
2423 (setq gdb-array-slice-map (make-keymap)) | |
2424 (define-key gdb-array-slice-map [mouse-2] 'gdb-array-slice) | |
2425 | |
2426 (defun gdb-array-slice (event) | |
2427 "Select an array slice to display." | |
2428 (interactive "e") | |
2429 (mouse-set-point event) | |
2430 (save-excursion | |
2431 (let ((n -1) (stop 0) (start 0) (point (point))) | |
2432 (beginning-of-line) | |
2433 (while (search-forward "[" point t) | |
2434 (setq n (+ n 1))) | |
2435 (setq start (string-to-int (read-string "Start index: "))) | |
2436 (aset gdb-array-start n start) | |
2437 (setq stop (string-to-int (read-string "Stop index: "))) | |
2438 (aset gdb-array-stop n stop))) | |
2439 (gdb-array-format1)) | |
2440 | 2313 |
2441 (defun gdb-array-visualise () | 2314 (defun gdb-array-visualise () |
2442 "Visualise arrays and slices using graph program from plotutils." | 2315 "Visualise arrays and slices using graph program from plotutils." |
2443 (interactive) | 2316 (interactive) |
2444 (if (and (display-graphic-p) gdb-display-string) | 2317 (if (and (display-graphic-p) gdb-display-string) |
2466 | 2339 |
2467 (defun gdb-delete-display () | 2340 (defun gdb-delete-display () |
2468 "Delete displayed expression and its frame." | 2341 "Delete displayed expression and its frame." |
2469 (interactive) | 2342 (interactive) |
2470 (gdb-instance-enqueue-idle-input | 2343 (gdb-instance-enqueue-idle-input |
2471 gdb-buffer-instance | |
2472 (list (concat "server delete display " gdb-display-number "\n") | 2344 (list (concat "server delete display " gdb-display-number "\n") |
2473 '(lambda () nil))) | 2345 '(lambda () nil))) |
2474 (kill-buffer nil) | 2346 (kill-buffer nil) |
2475 (delete-frame)) | 2347 (delete-frame)) |
2476 | 2348 |
2483 (concat "server disassemble " gdb-main-or-pc "\n") | 2355 (concat "server disassemble " gdb-main-or-pc "\n") |
2484 gdb-assembler-handler | 2356 gdb-assembler-handler |
2485 gdb-assembler-custom) | 2357 gdb-assembler-custom) |
2486 | 2358 |
2487 (defun gdb-assembler-custom () | 2359 (defun gdb-assembler-custom () |
2488 (let ((buffer (gdb-get-instance-buffer gdb-buffer-instance | 2360 (let ((buffer (gdb-get-instance-buffer 'gdb-assembler-buffer)) |
2489 'gdb-assembler-buffer)) | |
2490 (gdb-arrow-position) (address) (flag)) | 2361 (gdb-arrow-position) (address) (flag)) |
2491 (if gdb-current-address | 2362 (if gdb-current-address |
2492 (progn | 2363 (progn |
2493 (save-excursion | 2364 (save-excursion |
2494 (set-buffer buffer) | 2365 (set-buffer buffer) |
2503 (set-buffer buffer) | 2374 (set-buffer buffer) |
2504 (if (display-graphic-p) | 2375 (if (display-graphic-p) |
2505 (remove-images (point-min) (point-max)) | 2376 (remove-images (point-min) (point-max)) |
2506 (remove-strings (point-min) (point-max)))) | 2377 (remove-strings (point-min) (point-max)))) |
2507 (save-excursion | 2378 (save-excursion |
2508 (set-buffer (gdb-get-instance-buffer instance 'gdb-breakpoints-buffer)) | 2379 (set-buffer (gdb-get-instance-buffer 'gdb-breakpoints-buffer)) |
2509 (goto-char (point-min)) | 2380 (goto-char (point-min)) |
2510 (while (< (point) (- (point-max) 1)) | 2381 (while (< (point) (- (point-max) 1)) |
2511 (forward-line 1) | 2382 (forward-line 1) |
2512 (if (looking-at "[^\t].*breakpoint") | 2383 (if (looking-at "[^\t].*breakpoint") |
2513 (progn | 2384 (progn |
2555 \\{gdb-assembler-mode-map}" | 2426 \\{gdb-assembler-mode-map}" |
2556 (setq major-mode 'gdb-assembler-mode) | 2427 (setq major-mode 'gdb-assembler-mode) |
2557 (setq mode-name "Assembler") | 2428 (setq mode-name "Assembler") |
2558 (set (make-local-variable 'gud-minor-mode) 'gdba) | 2429 (set (make-local-variable 'gud-minor-mode) 'gdba) |
2559 (set (make-local-variable 'tool-bar-map) gud-tool-bar-map) | 2430 (set (make-local-variable 'tool-bar-map) gud-tool-bar-map) |
2560 (set (make-variable-buffer-local 'left-margin-width) 2) | 2431 (setq left-margin-width 2) |
2561 (setq buffer-read-only t) | 2432 (setq buffer-read-only t) |
2562 (use-local-map gdb-assembler-mode-map) | 2433 (use-local-map gdb-assembler-mode-map) |
2563 (gdb-invalidate-assembler gdb-buffer-instance) | 2434 (gdb-invalidate-assembler) |
2564 (gdb-invalidate-breakpoints gdb-buffer-instance)) | 2435 (gdb-invalidate-breakpoints)) |
2565 | 2436 |
2566 (defun gdb-assembler-buffer-name (instance) | 2437 (defun gdb-assembler-buffer-name () |
2567 (save-excursion | 2438 (save-excursion |
2568 (set-buffer (process-buffer (gdb-instance-process instance))) | 2439 (set-buffer (process-buffer gdb-proc)) |
2569 (concat "*Machine Code " (gdb-instance-target-string instance) "*"))) | 2440 (concat "*Machine Code " (gdb-instance-target-string) "*"))) |
2570 | 2441 |
2571 (defun gdb-display-assembler-buffer (instance) | 2442 (defun gdb-display-assembler-buffer () |
2572 (interactive (list (gdb-needed-default-instance))) | 2443 (interactive (list gdb-proc)) |
2573 (gdb-display-buffer | 2444 (gdb-display-buffer |
2574 (gdb-get-create-instance-buffer instance | 2445 (gdb-get-create-instance-buffer 'gdb-assembler-buffer))) |
2575 'gdb-assembler-buffer))) | 2446 |
2576 | 2447 (defun gdb-frame-assembler-buffer () |
2577 (defun gdb-frame-assembler-buffer (instance) | 2448 (interactive (list gdb-proc)) |
2578 (interactive (list (gdb-needed-default-instance))) | |
2579 (switch-to-buffer-other-frame | 2449 (switch-to-buffer-other-frame |
2580 (gdb-get-create-instance-buffer instance | 2450 (gdb-get-create-instance-buffer 'gdb-assembler-buffer))) |
2581 'gdb-assembler-buffer))) | 2451 |
2582 | 2452 (defun gdb-invalidate-frame-and-assembler (&optional ignored) |
2583 (defun gdb-invalidate-frame-and-assembler (instance &optional ignored) | 2453 (gdb-invalidate-frames) |
2584 (gdb-invalidate-frames instance) | 2454 (gdb-invalidate-assembler)) |
2585 (gdb-invalidate-assembler instance)) | 2455 |
2586 | 2456 (defun gdb-invalidate-breakpoints-and-assembler (&optional ignored) |
2587 (defun gdb-invalidate-breakpoints-and-assembler (instance &optional ignored) | 2457 (gdb-invalidate-breakpoints) |
2588 (gdb-invalidate-breakpoints instance) | 2458 (gdb-invalidate-assembler)) |
2589 (gdb-invalidate-assembler instance)) | 2459 |
2460 (defvar gdb-prev-main-or-pc nil) | |
2590 | 2461 |
2591 ; modified because if gdb-main-or-pc has changed value a new command | 2462 ; modified because if gdb-main-or-pc has changed value a new command |
2592 ; must be enqueued to update the buffer with the new output | 2463 ; must be enqueued to update the buffer with the new output |
2593 (defun gdb-invalidate-assembler (instance &optional ignored) | 2464 (defun gdb-invalidate-assembler (&optional ignored) |
2594 (if (and ((lambda (instance) | 2465 (if (and ((lambda () |
2595 (gdb-get-instance-buffer instance | 2466 (gdb-get-instance-buffer (quote gdb-assembler-buffer)))) |
2596 (quote gdb-assembler-buffer))) instance) | |
2597 (or (not (member (quote gdb-invalidate-assembler) | 2467 (or (not (member (quote gdb-invalidate-assembler) |
2598 (gdb-instance-pending-triggers instance))) | 2468 (gdb-instance-pending-triggers))) |
2599 (not (string-equal gdb-main-or-pc gdb-prev-main-or-pc)))) | 2469 (not (string-equal gdb-main-or-pc gdb-prev-main-or-pc)))) |
2600 (progn | 2470 (progn |
2601 | 2471 |
2602 ; take previous disassemble command off the queue | 2472 ; take previous disassemble command off the queue |
2603 (save-excursion | 2473 (save-excursion |
2604 (set-buffer (gdb-get-instance-buffer instance 'gdba)) | 2474 (set-buffer (gdb-get-instance-buffer 'gdba)) |
2605 (let ((queue gdb-idle-input-queue) (item)) | 2475 (let ((queue gdb-idle-input-queue) (item)) |
2606 (while queue | 2476 (while queue |
2607 (setq item (car queue)) | 2477 (setq item (car queue)) |
2608 (if (equal (cdr item) '(gdb-assembler-handler)) | 2478 (if (equal (cdr item) '(gdb-assembler-handler)) |
2609 (delete item gdb-idle-input-queue)) | 2479 (delete item gdb-idle-input-queue)) |
2610 (setq queue (cdr queue))))) | 2480 (setq queue (cdr queue))))) |
2611 | 2481 |
2612 (gdb-instance-enqueue-idle-input | 2482 (gdb-instance-enqueue-idle-input |
2613 instance (list (concat "server disassemble " gdb-main-or-pc "\n") | 2483 (list (concat "server disassemble " gdb-main-or-pc "\n") |
2614 (quote gdb-assembler-handler))) | 2484 (quote gdb-assembler-handler))) |
2615 (set-gdb-instance-pending-triggers | 2485 (set-gdb-instance-pending-triggers |
2616 instance (cons (quote gdb-invalidate-assembler) | 2486 (cons (quote gdb-invalidate-assembler) |
2617 (gdb-instance-pending-triggers instance))) | 2487 (gdb-instance-pending-triggers))) |
2618 (setq gdb-prev-main-or-pc gdb-main-or-pc)))) | 2488 (setq gdb-prev-main-or-pc gdb-main-or-pc)))) |
2619 | 2489 |
2620 (defun gdb-delete-line () | 2490 (defun gdb-delete-line () |
2621 "Delete current line." | 2491 "Delete current line." |
2622 (interactive) | 2492 (interactive) |