diff options
| author | Dmitry Dzhus | 2009-08-04 14:40:33 +0000 |
|---|---|---|
| committer | Dmitry Dzhus | 2009-08-04 14:40:33 +0000 |
| commit | 4a6bcbc60243f18091b676b25cdff253515e0baa (patch) | |
| tree | f12c5cf7db36d5c284cebaec65c77df5668256e6 | |
| parent | 9e919ceebc9dd5f177d37886e10bfcce0de6664b (diff) | |
| download | emacs-4a6bcbc60243f18091b676b25cdff253515e0baa.tar.gz emacs-4a6bcbc60243f18091b676b25cdff253515e0baa.zip | |
(gdb-rules-name-maker, gdb-rules-buffer-mode)
(gdb-rules-update-trigger): Accessors for gdb-buffer-rules.
(def-gdb-auto-update-handler): New nopreserve optional argument.
(gdb-stack-list-frames-custom): Print stack from top to bottom.
| -rw-r--r-- | lisp/ChangeLog | 4 | ||||
| -rw-r--r-- | lisp/progmodes/gdb-mi.el | 47 |
2 files changed, 36 insertions, 15 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 85f277eed8f..f7ee7f9b652 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog | |||
| @@ -41,6 +41,10 @@ | |||
| 41 | (gdb-display-disassembly-for-thread) | 41 | (gdb-display-disassembly-for-thread) |
| 42 | (gdb-frame-disassembly-for-thread): New commands for threads | 42 | (gdb-frame-disassembly-for-thread): New commands for threads |
| 43 | buffer. | 43 | buffer. |
| 44 | (gdb-rules-name-maker, gdb-rules-buffer-mode) | ||
| 45 | (gdb-rules-update-trigger): Accessors for gdb-buffer-rules. | ||
| 46 | (def-gdb-auto-update-handler): New nopreserve optional argument. | ||
| 47 | (gdb-stack-list-frames-custom): Print stack from top to bottom. | ||
| 44 | 48 | ||
| 45 | 2009-08-04 Michael Albinus <michael.albinus@gmx.de> | 49 | 2009-08-04 Michael Albinus <michael.albinus@gmx.de> |
| 46 | 50 | ||
diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el index a5119e4257e..1f722264a34 100644 --- a/lisp/progmodes/gdb-mi.el +++ b/lisp/progmodes/gdb-mi.el | |||
| @@ -926,9 +926,13 @@ INDENT is the current indentation depth." | |||
| 926 | ;; named according to the rules set forth in the gdb-buffer-rules | 926 | ;; named according to the rules set forth in the gdb-buffer-rules |
| 927 | 927 | ||
| 928 | (defvar gdb-buffer-rules '()) | 928 | (defvar gdb-buffer-rules '()) |
| 929 | (defalias 'gdb-rules-name-maker 'second) | 929 | |
| 930 | (defalias 'gdb-rules-buffer-mode 'third) | 930 | (defun gdb-rules-name-maker (rules-entry) |
| 931 | (defalias 'gdb-rules-update-trigger 'fourth) | 931 | (cadr rules-entry)) |
| 932 | (defun gdb-rules-buffer-mode (rules-entry) | ||
| 933 | (nth 2 rules-entry)) | ||
| 934 | (defun gdb-rules-update-trigger (rules-entry) | ||
| 935 | (nth 3 rules-entry)) | ||
| 932 | 936 | ||
| 933 | (defun gdb-update-buffer-name () | 937 | (defun gdb-update-buffer-name () |
| 934 | (let ((f (gdb-rules-name-maker (assoc gdb-buffer-type | 938 | (let ((f (gdb-rules-name-maker (assoc gdb-buffer-type |
| @@ -1048,14 +1052,15 @@ DOC is an optional documentation string." | |||
| 1048 | (function | 1052 | (function |
| 1049 | (lambda () | 1053 | (lambda () |
| 1050 | (let ((trigger (gdb-rules-update-trigger | 1054 | (let ((trigger (gdb-rules-update-trigger |
| 1051 | (gdb-get-current-buffer-rules)))) | 1055 | (gdb-current-buffer-rules)))) |
| 1052 | (when trigger | 1056 | (when trigger |
| 1053 | (gdb-delete-subscriber | 1057 | (gdb-delete-subscriber |
| 1054 | gdb-buf-publisher | 1058 | gdb-buf-publisher |
| 1055 | ;; This should match gdb-add-subscriber done in | 1059 | ;; This should match gdb-add-subscriber done in |
| 1056 | ;; gdb-get-buffer-create | 1060 | ;; gdb-get-buffer-create |
| 1057 | (cons (current-buffer) | 1061 | (cons (current-buffer) |
| 1058 | (gdb-bind-function-to-buffer trigger (current-buffer)))))))))) | 1062 | (gdb-bind-function-to-buffer trigger (current-buffer)))))))) |
| 1063 | nil t)) | ||
| 1059 | 1064 | ||
| 1060 | ;; GUD buffers are an exception to the rules | 1065 | ;; GUD buffers are an exception to the rules |
| 1061 | (gdb-set-buffer-rules 'gdbmi 'error) | 1066 | (gdb-set-buffer-rules 'gdbmi 'error) |
| @@ -1454,7 +1459,7 @@ valid signal handlers.") | |||
| 1454 | (defun gdb-starting (output-field) | 1459 | (defun gdb-starting (output-field) |
| 1455 | ;; CLI commands don't emit ^running at the moment so use gdb-running too. | 1460 | ;; CLI commands don't emit ^running at the moment so use gdb-running too. |
| 1456 | (gdb-input | 1461 | (gdb-input |
| 1457 | (list "-data-list-register-names" 'gdb-get-register-names)) | 1462 | (list "-data-list-register-names" 'gdb-register-names-handler)) |
| 1458 | (setq gdb-inferior-status "running") | 1463 | (setq gdb-inferior-status "running") |
| 1459 | (gdb-force-mode-line-update | 1464 | (gdb-force-mode-line-update |
| 1460 | (propertize gdb-inferior-status 'face font-lock-type-face)) | 1465 | (propertize gdb-inferior-status 'face font-lock-type-face)) |
| @@ -1655,17 +1660,28 @@ trigger argument when describing buffer types with | |||
| 1655 | 1660 | ||
| 1656 | ;; Used by disassembly buffer only, the rest use | 1661 | ;; Used by disassembly buffer only, the rest use |
| 1657 | ;; def-gdb-trigger-and-handler | 1662 | ;; def-gdb-trigger-and-handler |
| 1658 | (defmacro def-gdb-auto-update-handler (handler-name trigger-name custom-defun) | 1663 | (defmacro def-gdb-auto-update-handler (handler-name trigger-name custom-defun &optional nopreserve) |
| 1659 | "Define a handler HANDLER-NAME for TRIGGER-NAME with CUSTOM-DEFUN. | 1664 | "Define a handler HANDLER-NAME for TRIGGER-NAME with CUSTOM-DEFUN. |
| 1660 | 1665 | ||
| 1666 | Handlers are normally called from the buffers they put output in. | ||
| 1667 | |||
| 1661 | Delete ((current-buffer) . TRIGGER) from `gdb-pending-triggers', | 1668 | Delete ((current-buffer) . TRIGGER) from `gdb-pending-triggers', |
| 1662 | erase current buffer and evaluate CUSTOM-DEFUN." | 1669 | erase current buffer and evaluate CUSTOM-DEFUN. Then |
| 1670 | `gdb-update-buffer-name' is called. | ||
| 1671 | |||
| 1672 | If NOPRESERVE is non-nil, window point is not restored after CUSTOM-DEFUN." | ||
| 1663 | `(defun ,handler-name () | 1673 | `(defun ,handler-name () |
| 1664 | (gdb-delete-pending (cons (current-buffer) ',trigger-name)) | 1674 | (gdb-delete-pending (cons (current-buffer) ',trigger-name)) |
| 1665 | (let* ((buffer-read-only nil)) | 1675 | (let* ((buffer-read-only nil) |
| 1676 | (window (get-buffer-window (current-buffer) 0)) | ||
| 1677 | (start (window-start window)) | ||
| 1678 | (p (window-point window))) | ||
| 1666 | (erase-buffer) | 1679 | (erase-buffer) |
| 1667 | (,custom-defun) | 1680 | (,custom-defun) |
| 1668 | (gdb-update-buffer-name)))) | 1681 | (gdb-update-buffer-name) |
| 1682 | ,(when (not nopreserve) | ||
| 1683 | '(set-window-start window start) | ||
| 1684 | '(set-window-point window p))))) | ||
| 1669 | 1685 | ||
| 1670 | (defmacro def-gdb-trigger-and-handler (trigger-name gdb-command | 1686 | (defmacro def-gdb-trigger-and-handler (trigger-name gdb-command |
| 1671 | handler-name custom-defun) | 1687 | handler-name custom-defun) |
| @@ -2026,7 +2042,7 @@ FILE is a full path." | |||
| 2026 | 2042 | ||
| 2027 | (defvar gdb-threads-mode-map | 2043 | (defvar gdb-threads-mode-map |
| 2028 | (let ((map (make-sparse-keymap))) | 2044 | (let ((map (make-sparse-keymap))) |
| 2029 | (define-key map " " 'gdb-select-thread) | 2045 | (define-key map "\r" 'gdb-select-thread) |
| 2030 | (define-key map "s" 'gdb-display-stack-for-thread) | 2046 | (define-key map "s" 'gdb-display-stack-for-thread) |
| 2031 | (define-key map "S" 'gdb-frame-stack-for-thread) | 2047 | (define-key map "S" 'gdb-frame-stack-for-thread) |
| 2032 | (define-key map "l" 'gdb-display-locals-for-thread) | 2048 | (define-key map "l" 'gdb-display-locals-for-thread) |
| @@ -2119,7 +2135,8 @@ on the current line." | |||
| 2119 | (error "Cannot select running thread") | 2135 | (error "Cannot select running thread") |
| 2120 | (let ((new-id (gdb-get-field thread 'id))) | 2136 | (let ((new-id (gdb-get-field thread 'id))) |
| 2121 | (setq gdb-thread-number new-id) | 2137 | (setq gdb-thread-number new-id) |
| 2122 | (gud-basic-call (concat "-thread-select " new-id)))) | 2138 | (gdb-input (list (concat "-thread-select " new-id) 'ignore)) |
| 2139 | (gdb-update))) | ||
| 2123 | "Select the thread at current line of threads buffer.") | 2140 | "Select the thread at current line of threads buffer.") |
| 2124 | 2141 | ||
| 2125 | (def-gdb-thread-simple-buffer-command | 2142 | (def-gdb-thread-simple-buffer-command |
| @@ -2583,7 +2600,8 @@ DOC is an optional documentation string." | |||
| 2583 | (def-gdb-auto-update-handler | 2600 | (def-gdb-auto-update-handler |
| 2584 | gdb-disassembly-handler | 2601 | gdb-disassembly-handler |
| 2585 | gdb-invalidate-disassembly | 2602 | gdb-invalidate-disassembly |
| 2586 | gdb-disassembly-handler-custom) | 2603 | gdb-disassembly-handler-custom |
| 2604 | t) | ||
| 2587 | 2605 | ||
| 2588 | (gdb-set-buffer-rules | 2606 | (gdb-set-buffer-rules |
| 2589 | 'gdb-disassembly-buffer | 2607 | 'gdb-disassembly-buffer |
| @@ -2767,13 +2785,12 @@ member." | |||
| 2767 | (defun gdb-stack-list-frames-custom () | 2785 | (defun gdb-stack-list-frames-custom () |
| 2768 | (let* ((res (json-partial-output "frame")) | 2786 | (let* ((res (json-partial-output "frame")) |
| 2769 | (stack (gdb-get-field res 'stack))) | 2787 | (stack (gdb-get-field res 'stack))) |
| 2770 | (dolist (frame (nreverse stack)) | 2788 | (dolist (frame stack) |
| 2771 | (insert (apply 'format `("%s in %s" ,@(gdb-get-many-fields frame 'level 'func)))) | 2789 | (insert (apply 'format `("%s in %s" ,@(gdb-get-many-fields frame 'level 'func)))) |
| 2772 | (gdb-insert-frame-location frame) | 2790 | (gdb-insert-frame-location frame) |
| 2773 | (newline)) | 2791 | (newline)) |
| 2774 | (save-excursion | 2792 | (save-excursion |
| 2775 | (goto-char (point-min)) | 2793 | (goto-char (point-min)) |
| 2776 | (forward-line 1) | ||
| 2777 | (while (< (point) (point-max)) | 2794 | (while (< (point) (point-max)) |
| 2778 | (add-text-properties (point-at-bol) (1+ (point-at-bol)) | 2795 | (add-text-properties (point-at-bol) (1+ (point-at-bol)) |
| 2779 | '(mouse-face highlight | 2796 | '(mouse-face highlight |