(debug-convert-byte-code): Convert the doc info to a string.
[bpt/emacs.git] / lisp / emacs-lisp / debug.el
index 150686c..6e830e7 100644 (file)
@@ -30,6 +30,7 @@
 (defvar debug-function-list nil
   "List of functions currently set for debug on entry.")
 
+(defvar debugger-outer-match-data)
 (defvar debugger-outer-track-mouse)
 (defvar debugger-outer-last-command)
 (defvar debugger-outer-this-command)
@@ -56,17 +57,17 @@ any other args you like.  In that case, the list of args after the
 first will be printed into the backtrace buffer."
   (message "Entering debugger...")
   (let (debugger-value
-       (debugger-match-data (match-data))
        (debug-on-error nil)
        (debug-on-quit nil)
        (debugger-buffer (let ((default-major-mode 'fundamental-mode))
-                          (generate-new-buffer "*Backtrace*")))
+                          (get-buffer-create "*Backtrace*")))
        (debugger-old-buffer (current-buffer))
        (debugger-step-after-exit nil)
        ;; Don't keep reading from an executing kbd macro!
        (executing-macro nil)
        ;; Save the outer values of these vars for the `e' command
        ;; before we replace the values.
+       (debugger-outer-match-data (match-data))
        (debugger-outer-track-mouse track-mouse)
        (debugger-outer-last-command last-command)
        (debugger-outer-this-command this-command)
@@ -136,10 +137,19 @@ first will be printed into the backtrace buffer."
                    (buffer-read-only t))
                (message "")
                (recursive-edit))))
-       ;; So that users do not try to execute debugger commands
-       ;;  in an invalid context
-       (kill-buffer debugger-buffer)
-       (store-match-data debugger-match-data)))
+       ;; Kill or at least neuter the backtrace buffer, so that users
+       ;; don't try to execute debugger commands in an invalid context.
+       (if (get-buffer-window debugger-buffer 'visible)
+           ;; Still visible despite the save-window-excursion?  Maybe it
+           ;; it's in a pop-up frame.  It would be annoying to delete and
+           ;; recreate it every time the debugger stops, so instead we'll
+           ;; erase it but leave it visible.
+           (save-excursion
+             (set-buffer debugger-buffer)
+             (erase-buffer)
+             (fundamental-mode))
+         (kill-buffer debugger-buffer))
+       (store-match-data debugger-outer-match-data)))
     ;; Put into effect the modified values of these variables
     ;; in case the user set them with the `e' command.
     (setq track-mouse debugger-outer-track-mouse)
@@ -288,7 +298,9 @@ Applies to the frame whose line point is on in the backtrace."
          (standard-input debugger-outer-standard-input)
          (standard-output debugger-outer-standard-output)
          (cursor-in-echo-area debugger-outer-cursor-in-echo-area))
+      (store-match-data debugger-outer-match-data)
       (prog1 (eval-expression exp)
+       (setq debugger-outer-match-data (match-data))
        (setq debugger-outer-track-mouse track-mouse)
        (setq debugger-outer-last-command last-command)
        (setq debugger-outer-this-command this-command)
@@ -401,7 +413,10 @@ If argument is nil or an empty string, cancel for all functions."
          (if (nthcdr 5 contents)
              (setq body (cons (list 'interactive (nth 5 contents)) body)))
          (if (nth 4 contents)
-             (setq body (cons (nth 4 contents) body)))
+             ;; Use `documentation' here, to get the actual string,
+             ;; in case the compiled function has a reference
+             ;; to the .elc file.
+             (setq body (cons (documentation function) body)))
          (fset function (cons 'lambda (cons (car contents) body)))))))
 
 (defun debug-on-entry-1 (function defn flag)
@@ -437,6 +452,9 @@ If argument is nil or an empty string, cancel for all functions."
          (terpri)
          (setq list (cdr list))))
       (princ "Note: if you have redefined a function, then it may no longer\n")
-      (princ "be set to debug on entry, even if it is in the list."))))
+      (princ "be set to debug on entry, even if it is in the list."))
+    (save-excursion
+      (set-buffer standard-output)
+      (help-mode))))
 
 ;;; debug.el ends here