]> git.eshelyaron.com Git - emacs.git/commitdiff
(debug--early): Avoid re-entering the debugger for the same error
authorStefan Monnier <monnier@iro.umontreal.ca>
Thu, 6 Mar 2025 20:23:03 +0000 (15:23 -0500)
committerEshel Yaron <me@eshelyaron.com>
Sun, 9 Mar 2025 10:20:25 +0000 (11:20 +0100)
Fixes bug#76787.

* lisp/emacs-lisp/debug.el (debugger--last-error): Move ...
* lisp/emacs-lisp/debug-early.el (debugger--last-error): ... here.
(debug--early): Use it.

(cherry picked from commit fb33e3b4c79f8d922d9fe6e593dcc12c3c4b24eb)

lisp/emacs-lisp/debug-early.el
lisp/emacs-lisp/debug.el

index 48b71e7f9f03050b62195e44c11fabc7c20ecb53..b6fdef00080b22d4e26a0d6eb3edfac82cfec551 100644 (file)
@@ -36,6 +36,8 @@
 ;; For bootstrap reasons, we cannot use any macros here since they're
 ;; not defined yet.
 
+(defvar debugger--last-error nil)
+
 (defalias 'debug-early-backtrace
   #'(lambda (&optional base)
       "Print a trace of Lisp function calls currently active.
@@ -76,15 +78,20 @@ of the build process."
                              (setq args (cdr args)))
                       (princ " ")))
                 (princ ")\n"))))
-        base))))
+        base))
+      (message "debug-early-backtrace...done")))
 
 (defalias 'debug--early
   #'(lambda (error base)
-  (princ "\nError: ")
-  (prin1 (car error))  ; The error symbol.
-  (princ " ")
-  (prin1 (cdr error))  ; The error data.
-  (debug-early-backtrace base)))
+      (if (eq error debugger--last-error) nil
+        (setq debugger--last-error nil)
+        (princ "\nError: ")
+        (prin1 (car error))             ; The error symbol.
+        (princ " ")
+        (prin1 (cdr error))             ; The error data.
+        (prog1 ;; Purposefully not `unwind-protect'!
+            (debug-early-backtrace base)
+          (setq debugger--last-error error)))))
 
 (defalias 'debug-early                  ;Called from C.
   #'(lambda (&rest args)
index 89acb38e4f050c2f47516be731ce8152c72a2e4c..038aadcdc07543c6657dd92402ae66fd5a35c21c 100644 (file)
@@ -153,8 +153,6 @@ where CAUSE can be:
     (insert (debugger--buffer-state-content state)))
   (goto-char (debugger--buffer-state-pos state)))
 
-(defvar debugger--last-error nil)
-
 (defun debugger--duplicate-p (args)
   (pcase args
     (`(error ,err . ,_) (and (consp err) (eq err debugger--last-error)))))