Mercurial > emacs
comparison lisp/progmodes/gdb-mi.el @ 104148:3bbb840267e1
(gdb-add-pending, gdb-pending-p, gdb-delete-pending): Macros to
handle pending triggers.
(gdb-threads-mode-map, def-gdb-thread-buffer-command)
(def-gdb-thread-buffer-simple-command)
(gdb-display-stack-for-thread, gdb-display-locals-for-thread)
(gdb-display-registers-for-thread, gdb-frame-stack-for-thread)
(gdb-frame-locals-for-thread, gdb-frame-registers-for-thread): New
commands which show buffers bound to thread.
(gdb-stack-list-locals-regexp): Removed unused regexp.
author | Dmitry Dzhus <dima@sphinx.net.ru> |
---|---|
date | Tue, 04 Aug 2009 13:27:21 +0000 |
parents | 9629847b09ed |
children | da5e764f0af8 |
comparison
equal
deleted
inserted
replaced
104147:9629847b09ed | 104148:3bbb840267e1 |
---|---|
189 for subsequent processing by a command. This is the | 189 for subsequent processing by a command. This is the |
190 disposition of output generated by commands that | 190 disposition of output generated by commands that |
191 gdb mode sends to gdb on its own behalf.") | 191 gdb mode sends to gdb on its own behalf.") |
192 | 192 |
193 (defvar gdb-pending-triggers '() | 193 (defvar gdb-pending-triggers '() |
194 "A list of trigger functions that have run later than their output handlers.") | 194 "A list of trigger functions which have not yet been handled. |
195 | |
196 Elements are either function names or pairs (buffer . function)") | |
197 | |
198 (defmacro gdb-add-pending (item) | |
199 `(push ,item gdb-pending-triggers)) | |
200 (defmacro gdb-pending-p (item) | |
201 `(member ,item gdb-pending-triggers)) | |
202 (defmacro gdb-delete-pending (item) | |
203 `(setq gdb-pending-triggers | |
204 (delete ,item gdb-pending-triggers))) | |
195 | 205 |
196 (defcustom gdb-debug-log-max 128 | 206 (defcustom gdb-debug-log-max 128 |
197 "Maximum size of `gdb-debug-log'. If nil, size is unlimited." | 207 "Maximum size of `gdb-debug-log'. If nil, size is unlimited." |
198 :group 'gdb | 208 :group 'gdb |
199 :type '(choice (integer :tag "Number of elements") | 209 :type '(choice (integer :tag "Number of elements") |
722 ,(car var) nil))))) | 732 ,(car var) nil))))) |
723 (message-box "No symbol \"%s\" in current context." expr))) | 733 (message-box "No symbol \"%s\" in current context." expr))) |
724 | 734 |
725 (defun gdb-speedbar-update () | 735 (defun gdb-speedbar-update () |
726 (when (and (boundp 'speedbar-frame) (frame-live-p speedbar-frame) | 736 (when (and (boundp 'speedbar-frame) (frame-live-p speedbar-frame) |
727 (not (member 'gdb-speedbar-timer gdb-pending-triggers))) | 737 (not (gdb-pending-p 'gdb-speedbar-timer))) |
728 ;; Dummy command to update speedbar even when idle. | 738 ;; Dummy command to update speedbar even when idle. |
729 (gdb-input (list "-environment-pwd" 'gdb-speedbar-timer-fn)) | 739 (gdb-input (list "-environment-pwd" 'gdb-speedbar-timer-fn)) |
730 ;; Keep gdb-pending-triggers non-nil till end. | 740 ;; Keep gdb-pending-triggers non-nil till end. |
731 (push 'gdb-speedbar-timer gdb-pending-triggers))) | 741 (gdb-add-pending 'gdb-speedbar-timer))) |
732 | 742 |
733 (defun gdb-speedbar-timer-fn () | 743 (defun gdb-speedbar-timer-fn () |
734 (if gdb-speedbar-auto-raise | 744 (if gdb-speedbar-auto-raise |
735 (raise-frame speedbar-frame)) | 745 (raise-frame speedbar-frame)) |
736 (setq gdb-pending-triggers | 746 (gdb-delete-pending 'gdb-speedbar-timer) |
737 (delq 'gdb-speedbar-timer gdb-pending-triggers)) | |
738 (speedbar-timer-fn)) | 747 (speedbar-timer-fn)) |
739 | 748 |
740 (defun gdb-var-evaluate-expression-handler (varnum changed) | 749 (defun gdb-var-evaluate-expression-handler (varnum changed) |
741 (goto-char (point-min)) | 750 (goto-char (point-min)) |
742 (re-search-forward ".*value=\\(\".*\"\\)" nil t) | 751 (re-search-forward ".*value=\\(\".*\"\\)" nil t) |
829 (if (re-search-forward gdb-error-regexp nil t) | 838 (if (re-search-forward gdb-error-regexp nil t) |
830 (message-box "Invalid number or expression (%s)" value))) | 839 (message-box "Invalid number or expression (%s)" value))) |
831 | 840 |
832 ; Uses "-var-update --all-values". Needs GDB 6.4 onwards. | 841 ; Uses "-var-update --all-values". Needs GDB 6.4 onwards. |
833 (defun gdb-var-update () | 842 (defun gdb-var-update () |
834 (if (not (member 'gdb-var-update gdb-pending-triggers)) | 843 (if (not (gdb-pending-p 'gdb-var-update)) |
835 (gdb-input | 844 (gdb-input |
836 (list "-var-update --all-values *" 'gdb-var-update-handler))) | 845 (list "-var-update --all-values *" 'gdb-var-update-handler))) |
837 (push 'gdb-var-update gdb-pending-triggers)) | 846 (gdb-add-pending 'gdb-var-update)) |
838 | 847 |
839 (defconst gdb-var-update-regexp | 848 (defconst gdb-var-update-regexp |
840 "{.*?name=\"\\(.*?\\)\".*?,\\(?:value=\\(\".*?\"\\),\\)?.*?\ | 849 "{.*?name=\"\\(.*?\\)\".*?,\\(?:value=\\(\".*?\"\\),\\)?.*?\ |
841 in_scope=\"\\(.*?\\)\".*?}") | 850 in_scope=\"\\(.*?\\)\".*?}") |
842 | 851 |
857 (setcar (nthcdr 5 var) 'changed) | 866 (setcar (nthcdr 5 var) 'changed) |
858 (setcar (nthcdr 4 var) | 867 (setcar (nthcdr 4 var) |
859 (read (match-string 2)))) | 868 (read (match-string 2)))) |
860 ((string-equal match "invalid") | 869 ((string-equal match "invalid") |
861 (gdb-var-delete-1 varnum))))))) | 870 (gdb-var-delete-1 varnum))))))) |
862 (setq gdb-pending-triggers | 871 (gdb-delete-pending 'gdb-var-update) |
863 (delq 'gdb-var-update gdb-pending-triggers)) | |
864 (gdb-speedbar-update)) | 872 (gdb-speedbar-update)) |
865 | 873 |
866 (defun gdb-speedbar-expand-node (text token indent) | 874 (defun gdb-speedbar-expand-node (text token indent) |
867 "Expand the node the user clicked on. | 875 "Expand the node the user clicked on. |
868 TEXT is the text of the button we clicked on, a + or - item. | 876 TEXT is the text of the button we clicked on, a + or - item. |
914 | 922 |
915 (defun gdb-get-buffer (key &optional thread) | 923 (defun gdb-get-buffer (key &optional thread) |
916 "Get a specific GDB buffer. | 924 "Get a specific GDB buffer. |
917 | 925 |
918 In that buffer, `gdb-buffer-type' must be equal to KEY and | 926 In that buffer, `gdb-buffer-type' must be equal to KEY and |
919 `gdb-thread-number' (if provided) must be equal to THREAD." | 927 `gdb-thread-number' (if provided) must be equal to THREAD. |
928 | |
929 When THREAD is nil, global `gdb-thread-number' value is used." | |
930 (when (not thread) (setq thread gdb-thread-number)) | |
920 (catch 'found | 931 (catch 'found |
921 (dolist (buffer (buffer-list) nil) | 932 (dolist (buffer (buffer-list) nil) |
922 (with-current-buffer buffer | 933 (with-current-buffer buffer |
923 (when (and (eq gdb-buffer-type key) | 934 (when (and (eq gdb-buffer-type key) |
924 (or (not thread) | 935 (equal gdb-thread-number thread)) |
925 (equal gdb-thread-number thread))) | |
926 (throw 'found buffer)))))) | 936 (throw 'found buffer)))))) |
927 | 937 |
928 (defun gdb-get-buffer-create (key &optional thread) | 938 (defun gdb-get-buffer-create (key &optional thread) |
929 "Create a new GDB buffer of the type specified by KEY. | 939 "Create a new GDB buffer of the type specified by KEY. |
930 The key should be one of the cars in `gdb-buffer-rules'. | 940 The key should be one of the cars in `gdb-buffer-rules'. |
1220 (setcar item (concat (number-to-string gdb-token-number) (car item))) | 1230 (setcar item (concat (number-to-string gdb-token-number) (car item))) |
1221 (push (cons gdb-token-number (car (cdr item))) gdb-handler-alist) | 1231 (push (cons gdb-token-number (car (cdr item))) gdb-handler-alist) |
1222 (process-send-string (get-buffer-process gud-comint-buffer) | 1232 (process-send-string (get-buffer-process gud-comint-buffer) |
1223 (concat (car item) "\n"))) | 1233 (concat (car item) "\n"))) |
1224 | 1234 |
1225 (defmacro gdb-current-context-command (command) | 1235 (defun gdb-current-context-command (command) |
1226 "Add --thread option to gdb COMMAND. | 1236 "Add --thread option to gdb COMMAND. |
1227 | 1237 |
1228 Option value is taken from `gdb-thread-number'." | 1238 Option value is taken from `gdb-thread-number'." |
1229 (concat command " --thread " gdb-thread-number)) | 1239 (concat command " --thread " gdb-thread-number)) |
1240 | |
1241 (defun gdb-current-context-buffer-name (name) | |
1242 "Add thread information and asterisks to string NAME." | |
1243 (concat "*" name | |
1244 (if (local-variable-p 'gdb-thread-number) | |
1245 " (bound to thread " | |
1246 " (current thread ") | |
1247 gdb-thread-number ")*")) | |
1230 | 1248 |
1231 | 1249 |
1232 (defcustom gud-gdb-command-name "gdb -i=mi" | 1250 (defcustom gud-gdb-command-name "gdb -i=mi" |
1233 "Default command to execute an executable under the GDB debugger." | 1251 "Default command to execute an executable under the GDB debugger." |
1234 :type 'string | 1252 :type 'string |
1565 ;; See how it's done in gdb-get-buffer-create. | 1583 ;; See how it's done in gdb-get-buffer-create. |
1566 | 1584 |
1567 (defmacro def-gdb-auto-update-trigger (trigger-name gdb-command | 1585 (defmacro def-gdb-auto-update-trigger (trigger-name gdb-command |
1568 handler-name) | 1586 handler-name) |
1569 `(defun ,trigger-name (&optional signal) | 1587 `(defun ,trigger-name (&optional signal) |
1570 (if (not (member (cons (current-buffer) ',trigger-name) | 1588 (if (not (gdb-pending-p |
1571 gdb-pending-triggers)) | 1589 (cons (current-buffer) ',trigger-name))) |
1572 (progn | 1590 (progn |
1573 (gdb-input | 1591 (gdb-input |
1574 (list ,gdb-command | 1592 (list ,gdb-command |
1575 (gdb-bind-function-to-buffer ',handler-name (current-buffer)))) | 1593 (gdb-bind-function-to-buffer ',handler-name (current-buffer)))) |
1576 (push (cons (current-buffer) ',trigger-name) gdb-pending-triggers))))) | 1594 (gdb-add-pending (cons (current-buffer) ',trigger-name)))))) |
1577 | 1595 |
1578 ;; Used by disassembly buffer only, the rest use | 1596 ;; Used by disassembly buffer only, the rest use |
1579 ;; def-gdb-trigger-and-handler | 1597 ;; def-gdb-trigger-and-handler |
1580 (defmacro def-gdb-auto-update-handler (handler-name trigger-name custom-defun) | 1598 (defmacro def-gdb-auto-update-handler (handler-name trigger-name custom-defun) |
1581 "Define a handler HANDLER-NAME for TRIGGER-NAME with CUSTOM-DEFUN. | 1599 "Define a handler HANDLER-NAME for TRIGGER-NAME with CUSTOM-DEFUN. |
1582 | 1600 |
1583 Delete ((current-buffer) . TRIGGER) from `gdb-pending-triggers', | 1601 Delete ((current-buffer) . TRIGGER) from `gdb-pending-triggers', |
1584 erase current buffer and evaluate CUSTOM-DEFUN." | 1602 erase current buffer and evaluate CUSTOM-DEFUN." |
1585 `(defun ,handler-name () | 1603 `(defun ,handler-name () |
1586 (setq gdb-pending-triggers | 1604 (gdb-delete-pending (cons (current-buffer) ',trigger-name)) |
1587 (delq (cons (current-buffer) ',trigger-name) | |
1588 gdb-pending-triggers)) | |
1589 (let* ((buffer-read-only nil)) | 1605 (let* ((buffer-read-only nil)) |
1590 (erase-buffer) | 1606 (erase-buffer) |
1591 (,custom-defun) | 1607 (,custom-defun) |
1592 (gdb-update-buffer-name)))) | 1608 (gdb-update-buffer-name)))) |
1593 | 1609 |
1617 'gdb-breakpoints-buffer-name | 1633 'gdb-breakpoints-buffer-name |
1618 'gdb-breakpoints-mode | 1634 'gdb-breakpoints-mode |
1619 'gdb-invalidate-breakpoints) | 1635 'gdb-invalidate-breakpoints) |
1620 | 1636 |
1621 (defun gdb-breakpoints-list-handler-custom () | 1637 (defun gdb-breakpoints-list-handler-custom () |
1622 (setq gdb-pending-triggers (delq 'gdb-invalidate-breakpoints | |
1623 gdb-pending-triggers)) | |
1624 (let ((breakpoints-list (gdb-get-field | 1638 (let ((breakpoints-list (gdb-get-field |
1625 (json-partial-output "bkpt" "script") | 1639 (json-partial-output "bkpt" "script") |
1626 'BreakpointTable 'body))) | 1640 'BreakpointTable 'body))) |
1627 (setq gdb-breakpoints-list breakpoints-list) | 1641 (setq gdb-breakpoints-list breakpoints-list) |
1628 (insert "Num\tType\t\tDisp\tEnb\tHits\tAddr What\n") | 1642 (insert "Num\tType\t\tDisp\tEnb\tHits\tAddr What\n") |
1944 "Font lock keywords used in `gdb-threads-mode'.") | 1958 "Font lock keywords used in `gdb-threads-mode'.") |
1945 | 1959 |
1946 (defvar gdb-threads-mode-map | 1960 (defvar gdb-threads-mode-map |
1947 (let ((map (make-sparse-keymap))) | 1961 (let ((map (make-sparse-keymap))) |
1948 (define-key map " " 'gdb-select-thread) | 1962 (define-key map " " 'gdb-select-thread) |
1963 (define-key map "s" 'gdb-display-stack-for-thread) | |
1964 (define-key map "S" 'gdb-frame-stack-for-thread) | |
1965 (define-key map "l" 'gdb-display-locals-for-thread) | |
1966 (define-key map "L" 'gdb-frame-locals-for-thread) | |
1967 (define-key map "r" 'gdb-display-registers-for-thread) | |
1968 (define-key map "R" 'gdb-frame-registers-for-thread) | |
1949 map)) | 1969 map)) |
1950 | 1970 |
1951 (defvar gdb-breakpoints-header | 1971 (defvar gdb-breakpoints-header |
1952 (list | 1972 (list |
1953 (gdb-propertize-header "Breakpoints" gdb-breakpoints-buffer | 1973 (gdb-propertize-header "Breakpoints" gdb-breakpoints-buffer |
2003 (when (string-equal gdb-thread-number | 2023 (when (string-equal gdb-thread-number |
2004 (gdb-get-field thread 'id)) | 2024 (gdb-get-field thread 'id)) |
2005 (set-marker gdb-thread-position (line-beginning-position))) | 2025 (set-marker gdb-thread-position (line-beginning-position))) |
2006 (newline)))) | 2026 (newline)))) |
2007 | 2027 |
2008 (defun gdb-select-thread () | 2028 (defmacro def-gdb-thread-buffer-command (name custom-defun &optional doc) |
2009 "Select the thread at current line of threads buffer." | 2029 "Define a NAME command which will act upon thread on the current line. |
2010 (interactive) | 2030 |
2011 (save-excursion | 2031 CUSTOM-DEFUN may use locally bound `thread' variable, which will |
2012 (beginning-of-line) | 2032 be the value of 'gdb-thread propery of the current line. If |
2013 (let ((thread (get-text-property (point) 'gdb-thread))) | 2033 'gdb-thread is nil, error is signaled." |
2014 (if thread | 2034 `(defun ,name () |
2015 (if (string-equal (gdb-get-field thread 'state) "running") | 2035 ,(when doc doc) |
2016 (error "Cannot select running thread") | 2036 (interactive) |
2017 (let ((new-id (gdb-get-field thread 'id))) | 2037 (save-excursion |
2018 (setq gdb-thread-number new-id) | 2038 (beginning-of-line) |
2019 (gud-basic-call (concat "-thread-select " new-id)))) | 2039 (let ((thread (get-text-property (point) 'gdb-thread))) |
2020 (error "Not recognized as thread line"))))) | 2040 (if thread |
2041 ,custom-defun | |
2042 (error "Not recognized as thread line")))))) | |
2043 | |
2044 (defmacro def-gdb-thread-buffer-simple-command (name buffer-command &optional doc) | |
2045 "Define a NAME which will call BUFFER-COMMAND with id of thread | |
2046 on the current line." | |
2047 `(def-gdb-thread-buffer-command ,name | |
2048 (,buffer-command (gdb-get-field thread 'id)) | |
2049 ,doc)) | |
2050 | |
2051 (def-gdb-thread-buffer-command gdb-select-thread | |
2052 (if (string-equal (gdb-get-field thread 'state) "running") | |
2053 (error "Cannot select running thread") | |
2054 (let ((new-id (gdb-get-field thread 'id))) | |
2055 (setq gdb-thread-number new-id) | |
2056 (gud-basic-call (concat "-thread-select " new-id)))) | |
2057 "Select the thread at current line of threads buffer.") | |
2058 | |
2059 (def-gdb-thread-simple-buffer-command | |
2060 gdb-display-stack-for-thread | |
2061 gdb-display-stack-buffer | |
2062 "Display stack buffer for the thread at current line.") | |
2063 | |
2064 (def-gdb-thread-simple-buffer-command | |
2065 gdb-display-locals-for-thread | |
2066 gdb-display-locals-buffer | |
2067 "Display locals buffer for the thread at current line.") | |
2068 | |
2069 (def-gdb-thread-simple-buffer-command | |
2070 gdb-display-registers-for-thread | |
2071 gdb-display-registers-buffer | |
2072 "Display registers buffer for the thread at current line.") | |
2073 | |
2074 (def-gdb-thread-simple-buffer-command | |
2075 gdb-frame-stack-for-thread | |
2076 gdb-frame-stack-buffer | |
2077 "Display a new frame with stack buffer for the thread at | |
2078 current line.") | |
2079 | |
2080 (def-gdb-thread-simple-buffer-command | |
2081 gdb-frame-locals-for-thread | |
2082 gdb-frame-locals-buffer | |
2083 "Display a new frame with locals buffer for the thread at | |
2084 current line.") | |
2085 | |
2086 (def-gdb-thread-simple-buffer-command | |
2087 gdb-frame-registers-for-thread | |
2088 gdb-frame-registers-buffer | |
2089 "Display a new frame with registers buffer for the thread at | |
2090 current line.") | |
2021 | 2091 |
2022 | 2092 |
2023 ;;; Memory view | 2093 ;;; Memory view |
2024 | 2094 |
2025 (defcustom gdb-memory-rows 8 | 2095 (defcustom gdb-memory-rows 8 |
2652 (put-text-property bl (+ bl 4) | 2722 (put-text-property bl (+ bl 4) |
2653 'face '(:inverse-video t))))) | 2723 'face '(:inverse-video t))))) |
2654 (forward-line 1))))) | 2724 (forward-line 1))))) |
2655 | 2725 |
2656 (defun gdb-stack-buffer-name () | 2726 (defun gdb-stack-buffer-name () |
2657 (concat "*stack frames of " (gdb-get-target-string) " (thread " gdb-thread-number ")*")) | 2727 (gdb-current-context-buffer-name |
2728 (concat "stack frames of " (gdb-get-target-string)))) | |
2658 | 2729 |
2659 (def-gdb-display-buffer | 2730 (def-gdb-display-buffer |
2660 gdb-display-stack-buffer | 2731 gdb-display-stack-buffer |
2661 'gdb-stack-buffer | 2732 'gdb-stack-buffer |
2662 "Display backtrace of current stack.") | 2733 "Display backtrace of current stack.") |
2721 (gdb-set-buffer-rules | 2792 (gdb-set-buffer-rules |
2722 'gdb-locals-buffer | 2793 'gdb-locals-buffer |
2723 'gdb-locals-buffer-name | 2794 'gdb-locals-buffer-name |
2724 'gdb-locals-mode | 2795 'gdb-locals-mode |
2725 'gdb-invalidate-locals) | 2796 'gdb-invalidate-locals) |
2726 | |
2727 (defconst gdb-stack-list-locals-regexp | |
2728 (concat "name=\"\\(.*?\\)\",type=\"\\(.*?\\)\"")) | |
2729 | 2797 |
2730 (defvar gdb-locals-watch-map | 2798 (defvar gdb-locals-watch-map |
2731 (let ((map (make-sparse-keymap))) | 2799 (let ((map (make-sparse-keymap))) |
2732 (suppress-keymap map) | 2800 (suppress-keymap map) |
2733 (define-key map "\r" 'gud-watch) | 2801 (define-key map "\r" 'gud-watch) |
2807 '(gdb-locals-font-lock-keywords)) | 2875 '(gdb-locals-font-lock-keywords)) |
2808 (run-mode-hooks 'gdb-locals-mode-hook) | 2876 (run-mode-hooks 'gdb-locals-mode-hook) |
2809 'gdb-invalidate-locals) | 2877 'gdb-invalidate-locals) |
2810 | 2878 |
2811 (defun gdb-locals-buffer-name () | 2879 (defun gdb-locals-buffer-name () |
2812 (concat "*locals of " (gdb-get-target-string) "*")) | 2880 (gdb-current-context-buffer-name |
2881 (concat "locals of " (gdb-get-target-string)))) | |
2813 | 2882 |
2814 (def-gdb-display-buffer | 2883 (def-gdb-display-buffer |
2815 gdb-display-locals-buffer | 2884 gdb-display-locals-buffer |
2816 'gdb-locals-buffer | 2885 'gdb-locals-buffer |
2817 "Display local variables of current stack and their values.") | 2886 "Display local variables of current stack and their values.") |
2872 (use-local-map gdb-registers-mode-map) | 2941 (use-local-map gdb-registers-mode-map) |
2873 (run-mode-hooks 'gdb-registers-mode-hook) | 2942 (run-mode-hooks 'gdb-registers-mode-hook) |
2874 'gdb-invalidate-registers) | 2943 'gdb-invalidate-registers) |
2875 | 2944 |
2876 (defun gdb-registers-buffer-name () | 2945 (defun gdb-registers-buffer-name () |
2877 (concat "*registers of " (gdb-get-target-string) "*")) | 2946 (gdb-current-context-buffer-name |
2947 (concat "registers of " (gdb-get-target-string)))) | |
2878 | 2948 |
2879 (def-gdb-display-buffer | 2949 (def-gdb-display-buffer |
2880 gdb-display-registers-buffer | 2950 gdb-display-registers-buffer |
2881 'gdb-registers-buffer | 2951 'gdb-registers-buffer |
2882 "Display integer register contents.") | 2952 "Display integer register contents.") |
2887 "Display integer register contents in a new frame.") | 2957 "Display integer register contents in a new frame.") |
2888 | 2958 |
2889 ;; Needs GDB 6.4 onwards (used to fail with no stack). | 2959 ;; Needs GDB 6.4 onwards (used to fail with no stack). |
2890 (defun gdb-get-changed-registers () | 2960 (defun gdb-get-changed-registers () |
2891 (if (and (gdb-get-buffer 'gdb-registers-buffer) | 2961 (if (and (gdb-get-buffer 'gdb-registers-buffer) |
2892 (not (member 'gdb-get-changed-registers gdb-pending-triggers))) | 2962 (not (gdb-pending-p 'gdb-get-changed-registers))) |
2893 (progn | 2963 (progn |
2894 (gdb-input | 2964 (gdb-input |
2895 (list | 2965 (list |
2896 "-data-list-changed-registers" | 2966 "-data-list-changed-registers" |
2897 'gdb-changed-registers-handler)) | 2967 'gdb-changed-registers-handler)) |
2898 (push 'gdb-get-changed-registers gdb-pending-triggers)))) | 2968 (gdb-add-pending 'gdb-get-changed-registers)))) |
2899 | 2969 |
2900 (defun gdb-changed-registers-handler () | 2970 (defun gdb-changed-registers-handler () |
2901 (setq gdb-pending-triggers | 2971 (gdb-delete-pending 'gdb-get-changed-registers) |
2902 (delq 'gdb-get-changed-registers gdb-pending-triggers)) | |
2903 (setq gdb-changed-registers nil) | 2972 (setq gdb-changed-registers nil) |
2904 (dolist (register-number (gdb-get-field (json-partial-output) 'changed-registers)) | 2973 (dolist (register-number (gdb-get-field (json-partial-output) 'changed-registers)) |
2905 (push register-number gdb-changed-registers))) | 2974 (push register-number gdb-changed-registers))) |
2906 | 2975 |
2907 (defun gdb-register-names-handler () | 2976 (defun gdb-register-names-handler () |
2926 (gdb-init-buffer)))) | 2995 (gdb-init-buffer)))) |
2927 (gdb-force-mode-line-update | 2996 (gdb-force-mode-line-update |
2928 (propertize "ready" 'face font-lock-variable-name-face))) | 2997 (propertize "ready" 'face font-lock-variable-name-face))) |
2929 | 2998 |
2930 (defun gdb-get-selected-frame () | 2999 (defun gdb-get-selected-frame () |
2931 (if (not (member 'gdb-get-selected-frame gdb-pending-triggers)) | 3000 (if (not (gdb-pending-p 'gdb-get-selected-frame)) |
2932 (progn | 3001 (progn |
2933 (gdb-input | 3002 (gdb-input |
2934 (list (gdb-current-context-command "-stack-info-frame") 'gdb-frame-handler)) | 3003 (list (gdb-current-context-command "-stack-info-frame") 'gdb-frame-handler)) |
2935 (push 'gdb-get-selected-frame | 3004 (push 'gdb-get-selected-frame |
2936 gdb-pending-triggers)))) | 3005 gdb-pending-triggers)))) |
2937 | 3006 |
2938 (defun gdb-frame-handler () | 3007 (defun gdb-frame-handler () |
2939 (setq gdb-pending-triggers | 3008 (gdb-delete-pending 'gdb-get-selected-frame) |
2940 (delq 'gdb-get-selected-frame gdb-pending-triggers)) | |
2941 (let ((frame (gdb-get-field (json-partial-output) 'frame))) | 3009 (let ((frame (gdb-get-field (json-partial-output) 'frame))) |
2942 (when frame | 3010 (when frame |
2943 (setq gdb-frame-number (gdb-get-field frame 'level)) | 3011 (setq gdb-frame-number (gdb-get-field frame 'level)) |
2944 (setq gdb-pc-address (gdb-get-field frame 'addr)) | 3012 (setq gdb-pc-address (gdb-get-field frame 'addr)) |
2945 (setq gdb-selected-frame (gdb-get-field frame 'func)) | 3013 (setq gdb-selected-frame (gdb-get-field frame 'func)) |