From: Stefan Monnier Date: Thu, 6 Mar 2025 20:23:03 +0000 (-0500) Subject: (debug--early): Avoid re-entering the debugger for the same error X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=20c522640c3bf1f2ec71a5deca7b689284065ad7;p=emacs.git (debug--early): Avoid re-entering the debugger for the same error 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) --- diff --git a/lisp/emacs-lisp/debug-early.el b/lisp/emacs-lisp/debug-early.el index 48b71e7f9f0..b6fdef00080 100644 --- a/lisp/emacs-lisp/debug-early.el +++ b/lisp/emacs-lisp/debug-early.el @@ -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) diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el index 89acb38e4f0..038aadcdc07 100644 --- a/lisp/emacs-lisp/debug.el +++ b/lisp/emacs-lisp/debug.el @@ -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)))))