]> code.delx.au - gnu-emacs-elpa/commitdiff
Possibly some of the source update redisplay problems has been fixed.
authorrocky <rocky@gnu.org>
Sun, 17 Apr 2011 00:34:28 +0000 (20:34 -0400)
committerrocky <rocky@gnu.org>
Sun, 17 Apr 2011 00:34:28 +0000 (20:34 -0400)
Add ability to understand what frame we might be in. Done for trepan.el. Others may follow. Add Emacs command to toggle whether we stay in source or not and better support for cmdbuf-info-describe.
gdb/init.d fix cut-and-paste error.

dbgr/common/buffer/command.el
dbgr/common/buffer/helper.el
dbgr/common/fringe.el
dbgr/common/track.el
dbgr/common/window.el
dbgr/debugger/gdb/init.el
dbgr/debugger/trepan/init.el
test/test-track.el

index 72f10cc1d94fec9d8b19cf0461830683fbb7c4b3..175597fe6f5cf188dbe98d17ffc119693c76652d 100644 (file)
 (dbgr-struct-field-setter "dbgr-cmdbuf-info" "src-shortkey?")
 (dbgr-struct-field-setter "dbgr-cmdbuf-info" "in-debugger?")
 
-(defun dbgr-cmdbuf-info-describe ()
+(defun dbgr-cmdbuf-info-describe (&optional buffer)
   (interactive "")
-  (let ((info dbgr-cmdbuf-info)
-       (cmdbuf-name (buffer-name)))
-    (switch-to-buffer (get-buffer-create "*Describe*"))
-    (delete-region (point-min) (point-max))
-    (insert (format "cmdbuf-info for %s\n" cmdbuf-name))
-    (insert (format "Debugger-name: %s\n" 
-                   (dbgr-cmdbuf-info-debugger-name info)))
-    (insert (format "In source or command buffer?: %s\n" 
-                   (dbgr-cmdbuf-info-in-srcbuf? info)))
-    (insert (format "Command-line args: %s\n" 
-                   (dbgr-cmdbuf-info-cmd-args info)))
-    (insert (format "Source should go into shortkey?: %s\n"
-                   (dbgr-cmdbuf-info-src-shortkey? info)))
-    (insert (format "Breakpoint list: %s\n"
-                   (dbgr-cmdbuf-info-bp-list info)))
-    (insert (format "Remap table for debugger commands: %s\n"
-                   (dbgr-cmdbuf-info-cmd-hash info)))
-    (insert (format "Source buffers seen: %s\n"
-                   (dbgr-cmdbuf-info-srcbuf-list info)))
-    (insert (format "Backtrace buffer: %s\n"
-                   (dbgr-cmdbuf-info-bt-buf info)))
-    (insert (format "In debugger?: %s\n"
-                   (dbgr-cmdbuf-info-in-debugger? info)))
+  (setq buffer (dbgr-get-cmdbuf buffer))
+  (if buffer
+      (with-current-buffer buffer
+       (let ((info dbgr-cmdbuf-info)
+             (cmdbuf-name (buffer-name)))
+         (switch-to-buffer (get-buffer-create "*Describe*"))
+         (delete-region (point-min) (point-max))
+         (insert (format "cmdbuf-info for %s\n" cmdbuf-name))
+         (insert (format "Debugger-name: %s\n" 
+                         (dbgr-cmdbuf-info-debugger-name info)))
+         (insert (format "Selected window should contain source?: %s\n" 
+                         (dbgr-cmdbuf-info-in-srcbuf? info)))
+         (insert (format "Command-line args: %s\n" 
+                         (dbgr-cmdbuf-info-cmd-args info)))
+         (insert (format "Source should go into shortkey?: %s\n"
+                         (dbgr-cmdbuf-info-src-shortkey? info)))
+         (insert (format "Breakpoint list: %s\n"
+                         (dbgr-cmdbuf-info-bp-list info)))
+         (insert (format "Remap table for debugger commands: %s\n"
+                         (dbgr-cmdbuf-info-cmd-hash info)))
+         (insert (format "Source buffers seen: %s\n"
+                         (dbgr-cmdbuf-info-srcbuf-list info)))
+         (insert (format "Backtrace buffer: %s\n"
+                         (dbgr-cmdbuf-info-bt-buf info)))
+         (insert (format "In debugger?: %s\n"
+                         (dbgr-cmdbuf-info-in-debugger? info)))
+         )
+       )
+    (message "Buffer %s is not a debugger buffer; nothing done."
+            (or buffer (current-buffer)))
     )
   )
 
        dbgr-cmdbuf-info
        (dbgr-cmdbuf-info? dbgr-cmdbuf-info)))
 
-(defun dbgr-cmdbuf-info-in-debugger-toggle ()
-  "Toggle state of whether we think we running a debugger or not"
+(defun dbgr-cmdbuf-stay-in-source-toggle (&optional buffer)
+  "Toggle state of whether we should stay in source code or not"
   (interactive "")
-  (dbgr-cmdbuf-info-in-debugger?= (not (dbgr-sget 'cmdbuf-info 'in-debugger?)))
-  (dbgr-cmdbuf-mode-line-update)
-)
+  (setq buffer (dbgr-get-cmdbuf buffer))
+  (if buffer
+      (with-current-buffer buffer
+       (dbgr-cmdbuf-info-in-srcbuf?= 
+        (not (dbgr-sget 'cmdbuf-info 'in-srcbuf?)))
+       (message "Selected window should contain source?: %s\n" 
+                (dbgr-cmdbuf-info-in-srcbuf? dbgr-cmdbuf-info))
+       )
+    (message "Buffer %s is not a debugger buffer; nothing done."
+            (or buffer (current-buffer)))
+    )
+  )
 
 (defun dbgr-cmdbuf-add-srcbuf(srcbuf &optional cmdbuf)
   "Add SRCBUF to srcbuf-list field of INFO unless it is already included."
index 9c0c3aaadb4dce0d9b9791d0acea88335011a153..5ecd6758e38040dd99591626be9e922386ce4dea 100644 (file)
@@ -79,7 +79,7 @@ if we don't find anything."
          nil)))))
 
 (defun dbgr-get-cmdbuf( &optional opt-buffer)
-  "Return the source-code buffer associated with OPT-BUFFER
+  "Return the command buffer associated with OPT-BUFFER
 or `current-buffer' if that is omitted. nil is returned
 if we don't find anything."
 
index a8c2fb1432e4a01e638e3afbffa9434cbc4ba364..fd404e83dde22213292ad4359bb4f4c6160e85c1 100644 (file)
@@ -2,8 +2,8 @@
 ;; Fringe marks for history of stopping points
 
 ;; Bitmap for hollow overlay-arrow in fringe
-;; (define-fringe-bitmap 'hollow-right-triangle
-;;  "\xe0\x90\x88\x84\x84\x88\x90\xe0")
+(define-fringe-bitmap 'hollow-right-triangle
+  "\xe0\x90\x88\x84\x84\x88\x90\xe0")
 
 ;; FIXME: Figure out how to do this as a macro.
 
@@ -169,27 +169,30 @@ session which should also erase those fringe arrows."
       (goto-char dbgr-overlay-arrow1))
   )
 
-(defun dbgr-recenter-arrow()
+(defun dbgr-recenter-arrow(&optional opt-buffer)
   "If the current buffer contains dbgr-overlay-arrows 1, 2 or 3 
    recenter window to show that"
   (interactive "")
-  ;; We need to update in the order 3..1 so that if there are more than on
-  ;; arrows in the same buffer the smaller number (e.g. arrow 1) is the 
-  ;; position we are at rather than the earlier one (e.g. arrow 3).
-  (if (and dbgr-overlay-arrow3 
-          (eq (marker-buffer dbgr-overlay-arrow3) (current-buffer)))
-      (goto-char dbgr-overlay-arrow3)
-    )
-  (if (and dbgr-overlay-arrow2 
-          (eq (marker-buffer dbgr-overlay-arrow2) (current-buffer)))
-      (goto-char dbgr-overlay-arrow2)
-    )
-  (if (and dbgr-overlay-arrow1 
-          (eq (marker-buffer dbgr-overlay-arrow1) (current-buffer)))
-      (goto-char dbgr-overlay-arrow1)
-    )
-  (redisplay)
-  )
+  (let ((buffer (or opt-buffer (current-buffer))))
+    ;; We need to update in the order 3..1 so that if there are more than on
+    ;; arrows in the same buffer the smaller number (e.g. arrow 1) is the 
+    ;; position we are at rather than the earlier one (e.g. arrow 3).
+    (with-current-buffer-safe buffer
+      (if (and dbgr-overlay-arrow3 
+              (eq (marker-buffer dbgr-overlay-arrow3) buffer))
+         (goto-char dbgr-overlay-arrow3)
+       )
+      (if (and dbgr-overlay-arrow2 
+              (eq (marker-buffer dbgr-overlay-arrow2) buffer))
+         (goto-char dbgr-overlay-arrow2)
+      )
+      (if (and dbgr-overlay-arrow1 
+              (eq (marker-buffer dbgr-overlay-arrow1) buffer))
+         (goto-char dbgr-overlay-arrow1)
+       )
+      (redisplay)
+      )
+    ))
 
 
 (provide 'dbgr-fringe)
index 90e31163d497965bfc00cac1d835a226991001d3..e1ba5154b21faeca993eb4154779dcbd16859232 100644 (file)
@@ -82,6 +82,9 @@ evaluating (dbgr-cmdbuf-info-loc-regexp dbgr-cmdbuf-info)"
   (if (> from to) (psetq to from from to))
   (let* ((text (buffer-substring-no-properties from to))
         (loc (dbgr-track-loc text cmd-mark))
+        ;; If we see a selected frame number, it is stored
+        ;; in frame-num. Otherwise, nil.
+        (frame-num)  
         (text-sans-loc)
         (bp-loc)
         (cmdbuf (or opt-cmdbuf (current-buffer)))
@@ -91,7 +94,10 @@ evaluating (dbgr-cmdbuf-info-loc-regexp dbgr-cmdbuf-info)"
            (with-current-buffer cmdbuf
              (if (dbgr-sget 'cmdbuf-info 'divert-output?)
                  (dbgr-track-divert-prompt text cmdbuf to))
+             ;; FIXME: instead of these fixed filters, 
+             ;; put into a list and iterate over that.
              (setq text-sans-loc (or (dbgr-track-loc-remaining text) text))
+             (setq frame-num (dbgr-track-selected-frame text) text)
              (setq bp-loc (dbgr-track-bp-loc text-sans-loc cmd-mark cmdbuf))
              (if bp-loc 
                  (let ((src-buffer (dbgr-loc-goto bp-loc)))
@@ -100,8 +106,10 @@ evaluating (dbgr-cmdbuf-info-loc-regexp dbgr-cmdbuf-info)"
                      (dbgr-bp-add-info bp-loc)
                      )))
              (if loc 
-                 (progn 
-                   (dbgr-track-loc-action loc cmdbuf)
+                 (let ((selected-frame 
+                        (or (not frame-num) 
+                            (eq frame-num (dbgr-cmdbuf-pat "top-frame-num")))))
+                   (dbgr-track-loc-action loc cmdbuf (not selected-frame))
                    (dbgr-cmdbuf-info-in-debugger?= 't)
                    (dbgr-cmdbuf-mode-line-update)
                    )
@@ -174,7 +182,7 @@ unshown."
   (interactive)
   (dbgr-track-hist-fn-internal 'dbgr-loc-hist-oldest))
 
-(defun dbgr-track-loc-action (loc cmdbuf)
+(defun dbgr-track-loc-action (loc cmdbuf &optional not-selected-frame)
   "If loc is valid, show loc and do whatever actions we do for
 encountering a new loc."
   (if (dbgr-loc? loc)
@@ -220,11 +228,25 @@ encountering a new loc."
              (with-current-buffer srcbuf
                (if (and (boundp 'dbgr-overlay-arrow1)
                         (markerp dbgr-overlay-arrow1))
-                   (dbgr-window-update-position srcbuf dbgr-overlay-arrow1)))
+                   (progn 
+                     ;; Doesn't work
+                     ;; (if not-selected-frame
+                     ;;          (set-fringe-bitmap-face 'hollow-right-triangle 
+                     ;;                                  'dbgr-overlay-arrow1)
+                     ;;                        ; else 
+                     ;;        (set-fringe-bitmap-face 'dbgr-right-triangle1 
+                     ;;                                'dbgr-overlay-arrow1)
+                     ;;        )
+                     (dbgr-window-update-position srcbuf dbgr-overlay-arrow1)))
+               )
              (if cmd-window (select-window cmd-window)))
-         (dbgr-window-src srcbuf)
+         ; else
+         (progn
+           (dbgr-window-src srcbuf)
+           (dbgr-window-update-position srcbuf dbgr-overlay-arrow1))
          )
-       )))
+       ))
+  )
 
 (defun dbgr-track-loc(text cmd-mark &optional opt-regexp opt-file-group opt-line-group )
   "Do regular-expression matching to find a file name and line number inside
@@ -331,6 +353,23 @@ loc-regexp pattern"
     nil)
   )
   
+(defun dbgr-track-selected-frame(text)
+  "Return a selected frame number found in TEXT or nil if none found."
+  (if (dbgr-cmdbuf?)
+      (let ((selected-frame-pat (dbgr-cmdbuf-pat "selected-frame"))
+           (frame-num-regexp)
+           )
+       (if (and selected-frame-pat 
+                (setq frame-num-regexp (dbgr-loc-pat-regexp 
+                                        selected-frame-pat)))
+           (if (string-match frame-num-regexp text)
+               (let ((frame-num-group (dbgr-loc-pat-num selected-frame-pat)))
+                 (string-to-number (match-string frame-num-group text)))
+             nil)
+         nil))
+    nil)
+  )
+  
 (defun dbgr-track-divert-prompt(text cmdbuf to)
   "Return a cons node of the part before the prompt-regexp and the part 
    after the prompt-regexp-prompt. If not found return nil."
index c8fce30b71e36ffb69a3ef0aaa39e229df9ee6b7..e179abddc5ccb7fb4e7ffe56b37babfeeeb39e36 100644 (file)
@@ -8,13 +8,17 @@
 
 (defun dbgr-window-update-position (buffer marker)
   "Update BUFFER to position specified with MARKER.
-We assume MAKER points inside BUFFER"
+We assume MARKER points inside BUFFER"
   (with-current-buffer buffer
     (let ((window (get-buffer-window buffer)))
       (if window
          (progn 
            (select-window window)
-           (goto-char marker))))))
+           (goto-char marker)
+           (redisplay)
+           )
+       )))
+  )
 
 
 (defun dbgr-window-src ( &optional opt-buffer )
@@ -23,12 +27,13 @@ We don't care if the command buffer is also displayed.
 See also `dbgr-window-src-undistub-cmd'"
   (let* ((buffer (or opt-buffer (current-buffer)))
         (src-buffer (dbgr-get-srcbuf buffer))
-        (src-window (get-buffer-window src-buffer))
+        (src-window (get-buffer-window src-buffer 'visible))
         (window (selected-window)))
     (if src-buffer 
-       (unless src-window
+       (unless (and src-window (not (window-minibuffer-p)))
          (set-window-buffer window src-buffer))
-       )))
+       )
+    ))
 
 (defun dbgr-window-src-undisturb-cmd ( &optional opt-buffer )
   "Make sure the source buffers is displayed in windows without
index a3f7bf74f411a9d6bdc376dd73b5c75b94800973..56ff879a3e9b8e3587a53af038b3bca5383f3138 100644 (file)
@@ -81,7 +81,7 @@ dbgr-loc-pat struct")
         (1 dbgr-backtrace-number-face))
        ))
 
-(setf (gethash "gdb" dbgr-pat-hash) dbgr-trepan-pat-hash)
+(setf (gethash "gdb" dbgr-pat-hash) dbgr-gdb-pat-hash)
 
 (defvar dbgr-gdb-command-hash (make-hash-table :test 'equal)
   "Hash key is command name like 'continue' and the value is 
index 517e18354838f2d694e07d8f0dc068677199c573..849e5530cf17706f8e6ccd60c3633ba69604e0bd 100644 (file)
@@ -63,6 +63,28 @@ dbgr-loc-pat struct")
        :regexp "^Deleted breakpoint \\([0-9]+\\)\n"
        :num 1))
 
+(defconst dbgr-trepan-selected-frame-indicator "-->"
+"String that describes which frame is selected in a debugger
+backtrace listing.")
+
+(defconst dbgr-trepan-frame-file-regexp
+  "[ \t\n]+in file \\([^ \n]+\\)")
+
+;; Top frame number
+(setf (gethash "top-frame-num" dbgr-trepan-pat-hash) 0)
+
+;; Regular expression that describes a debugger "selected" frame in in 
+;; a frame-motion command.
+;; For example:
+;; --> #1 TOP Object#<top /usr/local/bin/irb> in file /usr/local/bin/irb at line 9
+(setf (gethash "selected-frame" dbgr-trepan-pat-hash)
+      (make-dbgr-loc-pat
+       :regexp 
+       (format "^%s #\\([0-9]+\\) .*%s" 
+              dbgr-trepan-selected-frame-indicator
+              dbgr-trepan-frame-file-regexp)
+       :num 1))
+
 (setf (gethash "control-frame" dbgr-trepan-pat-hash)
       (make-dbgr-loc-pat
        :regexp "^c:\\([0-9]+\\) p:\\([0-9]+\\) s:\\([0-9]+\\) b:\\([0-9]+\\) l:\\([0-9a-f]+\\) d:\\([0-9a-f]+\\) \\([A-Z]+\\) \\(.+\\):\\([0-9]+\\)"
@@ -72,9 +94,6 @@ dbgr-loc-pat struct")
 ;;  Regular expression that describes a Ruby $! string
 (setf (gethash "dollar-bang" dbgr-trepan-pat-hash) dbgr-ruby-dollar-bang)
 
-(defconst dbgr-trepan-frame-file-regexp
-  "[ \t\n]+in file \\([^ \n]+\\)")
-
 ;;  Regular expression that describes debugger "backtrace" command line.
 ;;  e.g.
 ;; --> #0 METHOD Object#require(path) in file <internal:lib/require> at line 28
@@ -92,14 +111,10 @@ dbgr-loc-pat struct")
        :line-group 7)
       )
 
-(defconst dbgr-trepan-selected-frame-arrow "-->"
-"String that describes which frame is selected in a debugger
-backtrace listing.")
-
 ;; Regular expression that describes which frame is selected in 
 ;; a debugger backtrace listing.
 (setf (gethash "selected-frame-indicator" dbgr-trepan-pat-hash)
-      dbgr-trepan-selected-frame-arrow)
+      dbgr-trepan-selected-frame-indicator)
 
 (setf (gethash "font-lock-keywords" dbgr-trepan-pat-hash)
       '(
index 2ce9ae8593844bf73656f8cbd90e6f4369a40523..943234fd3cc3290ecf759240b55a117bc4716f03 100644 (file)
                    (assert-equal line-number (dbgr-loc-line-number loc)))
           )
 
+        (specify "dbgr-track-selected-frame"
+                 (setq debugger-output "up 
+--> #1 TOP Object#<top /usr/local/bin/irb> in file /usr/local/bin/irb at line 9
+   (/usr/local/bin/irb:9 @11)
+require irb'
+")
+                 (assert-equal 1 (dbgr-track-selected-frame debugger-output))
+
+                 (setq debugger-output " 
+--> #0 TOP Object#<top /usr/local/bin/irb> in file /usr/local/bin/irb at line 9
+   (/usr/local/bin/irb:9 @11)
+require irb'
+")
+                 (assert-equal 0 (dbgr-track-selected-frame debugger-output))
+
+                 (setq debugger-output "
+<- (<internal:lib/rubygems/custom_require>:38 remapped /usr/local/lib/ruby/gems/1.9.1/gems/trepanning-0.1.3.dev/data/custom_require.rb:38 @16)
+R=> false
+end
+")
+                 (assert-nil (dbgr-track-selected-frame debugger-output))
+                 )
+
+
         ;; (setq debugger-bp-output (format "Breakpoint %d set at line %d\n\tin file %s.\n"
         ;;                               bp-num line-number filename))
         ;; (setq bp-loc (dbgr-track-bp-loc debugger-bp-output nil))