@@ -168,158 +168,150 @@ first will be printed into the backtrace buffer.
168168If `inhibit-redisplay' is non-nil when this function is called,
169169the debugger will not be entered."
170170 (interactive )
171- (cond
172- (inhibit-redisplay
173- ; ; Don't really try to enter debugger within an eval from redisplay.
174- debugger-value)
175- ((and (eq t (framep (selected-frame )))
176- (equal " initial_terminal" (terminal-name )))
177- ; ; We're in the initial-frame (where `message' just outputs to stdout) so
178- ; ; there's no tty or GUI frame to display the backtrace and interact with
179- ; ; it: just dump a backtrace to stdout.
180- ; ; This happens for example while handling an error in code from
181- ; ; early-init.el with --debug-init.
182- (message " Error: %S " args)
183- (let ((print-escape-newlines t )
184- (print-escape-control-characters t )
185- (print-level 8 )
186- (print-length 50 )
187- (skip t )) ; Skip the first frame (i.e. the `debug' frame)!
188- (mapbacktrace (lambda (_evald func args _flags )
189- (if skip
190- (setq skip nil )
191- (message " %S " (cons func args))))
192- 'debug )))
193- (t
194- (unless noninteractive
195- (message " Entering debugger... " ))
196- (let (debugger-value
197- (debugger-previous-state
198- (if (get-buffer " *Backtrace*" )
199- (with-current-buffer (get-buffer " *Backtrace*" )
200- (debugger--save-buffer-state))))
201- (debugger-args args)
202- (debugger-buffer (get-buffer-create " *Backtrace*" ))
203- (debugger-old-buffer (current-buffer ))
204- (debugger-window nil )
205- (debugger-step-after-exit nil )
206- (debugger-will-be-back nil )
207- ; ; Don't keep reading from an executing kbd macro!
208- (executing-kbd-macro nil )
209- ; ; Save the outer values of these vars for the `e' command
210- ; ; before we replace the values.
211- (debugger-outer-match-data (match-data ))
212- (debugger-with-timeout-suspend (with-timeout-suspend )))
213- ; ; Set this instead of binding it, so that `q'
214- ; ; will not restore it.
215- (setq overriding-terminal-local-map nil )
216- ; ; Don't let these magic variables affect the debugger itself.
217- (let ((last-command nil ) this-command track-mouse
218- (inhibit-trace t )
219- unread-command-events
220- unread-post-input-method-events
221- last-input-event last-command-event last-nonmenu-event
222- last-event-frame
223- overriding-local-map
224- load-read-function
225- ; ; If we are inside a minibuffer, allow nesting
226- ; ; so that we don't get an error from the `e' command.
227- (enable-recursive-minibuffers
228- (or enable-recursive-minibuffers (> (minibuffer-depth ) 0 )))
229- (standard-input t ) (standard-output t )
230- inhibit-redisplay
231- (cursor-in-echo-area nil )
232- (window-configuration (current-window-configuration )))
233- (unwind-protect
234- (save-excursion
235- (when (eq (car debugger-args) 'debug )
236- ; ; Skip the frames for backtrace-debug, byte-code,
237- ; ; debug--implement-debug-on-entry and the advice's `apply' .
238- (backtrace-debug 4 t )
239- ; ; Place an extra debug-on-exit for macro's.
240- (when (eq 'lambda (car-safe (cadr (backtrace-frame 4 ))))
241- (backtrace-debug 5 t )))
242- (with-current-buffer debugger-buffer
243- (unless (derived-mode-p 'debugger-mode )
244- (debugger-mode ))
245- (debugger-setup-buffer debugger-args)
246- (when noninteractive
247- ; ; If the backtrace is long, save the beginning
248- ; ; and the end, but discard the middle.
249- (when (> (count-lines (point-min ) (point-max ))
250- debugger-batch-max-lines)
251- (goto-char (point-min ))
252- (forward-line (/ 2 debugger-batch-max-lines))
253- (let ((middlestart (point )))
254- (goto-char (point-max ))
255- (forward-line (- (/ 2 debugger-batch-max-lines)
256- debugger-batch-max-lines))
257- (delete-region middlestart (point )))
258- (insert " ...\n " ))
259- (goto-char (point-min ))
260- (message " %s " (buffer-string ))
261- (kill-emacs -1 )))
262- (pop-to-buffer
263- debugger-buffer
264- `((display-buffer-reuse-window
265- display-buffer-in-previous-window
266- display-buffer-below-selected)
267- . ((window-min-height . 10 )
268- (window-height . fit-window-to-buffer)
269- ,@(when (and (window-live-p debugger-previous-window)
270- (frame-visible-p
271- (window-frame debugger-previous-window)))
272- `((previous-window . , debugger-previous-window ))))))
273- (setq debugger-window (selected-window ))
274- (if (eq debugger-previous-window debugger-window)
275- (when debugger-jumping-flag
276- ; ; Try to restore previous height of debugger
277- ; ; window.
278- (condition-case nil
279- (window-resize
280- debugger-window
281- (- debugger-previous-window-height
282- (window-total-height debugger-window)))
283- (error nil )))
284- (setq debugger-previous-window debugger-window))
285- (message " " )
286- (let ((standard-output nil )
287- (buffer-read-only t ))
288- (message " " )
289- ; ; Make sure we unbind buffer-read-only in the right buffer.
290- (save-excursion
291- (recursive-edit ))))
292- (when (and (window-live-p debugger-window)
293- (eq (window-buffer debugger-window) debugger-buffer))
294- ; ; Record height of debugger window.
295- (setq debugger-previous-window-height
296- (window-total-height debugger-window)))
297- (if debugger-will-be-back
298- ; ; Restore previous window configuration (Bug#12623).
299- (set-window-configuration window-configuration)
171+ (if inhibit-redisplay
172+ ; ; Don't really try to enter debugger within an eval from redisplay.
173+ debugger-value
174+ (let ((non-interactive-frame
175+ (or noninteractive ; FIXME: Presumably redundant.
176+ ; ; If we're in the initial-frame (where `message' just
177+ ; ; outputs to stdout) so there's no tty or GUI frame to
178+ ; ; display the backtrace and interact with it: just dump a
179+ ; ; backtrace to stdout. This happens for example while
180+ ; ; handling an error in code from early-init.el with
181+ ; ; --debug-init.
182+ (and (eq t (framep (selected-frame )))
183+ (equal " initial_terminal" (terminal-name )))))
184+ ; ; Don't let `inhibit-message' get in our way (especially important if
185+ ; ; `non-interactive-frame' evaluated to a non-nil value.
186+ (inhibit-message nil ))
187+ (unless non-interactive-frame
188+ (message " Entering debugger... " ))
189+ (let (debugger-value
190+ (debugger-previous-state
191+ (if (get-buffer " *Backtrace*" )
192+ (with-current-buffer (get-buffer " *Backtrace*" )
193+ (debugger--save-buffer-state))))
194+ (debugger-args args)
195+ (debugger-buffer (get-buffer-create " *Backtrace*" ))
196+ (debugger-old-buffer (current-buffer ))
197+ (debugger-window nil )
198+ (debugger-step-after-exit nil )
199+ (debugger-will-be-back nil )
200+ ; ; Don't keep reading from an executing kbd macro!
201+ (executing-kbd-macro nil )
202+ ; ; Save the outer values of these vars for the `e' command
203+ ; ; before we replace the values.
204+ (debugger-outer-match-data (match-data ))
205+ (debugger-with-timeout-suspend (with-timeout-suspend )))
206+ ; ; Set this instead of binding it, so that `q'
207+ ; ; will not restore it.
208+ (setq overriding-terminal-local-map nil )
209+ ; ; Don't let these magic variables affect the debugger itself.
210+ (let ((last-command nil ) this-command track-mouse
211+ (inhibit-trace t )
212+ unread-command-events
213+ unread-post-input-method-events
214+ last-input-event last-command-event last-nonmenu-event
215+ last-event-frame
216+ overriding-local-map
217+ load-read-function
218+ ; ; If we are inside a minibuffer, allow nesting
219+ ; ; so that we don't get an error from the `e' command.
220+ (enable-recursive-minibuffers
221+ (or enable-recursive-minibuffers (> (minibuffer-depth ) 0 )))
222+ (standard-input t ) (standard-output t )
223+ inhibit-redisplay
224+ (cursor-in-echo-area nil )
225+ (window-configuration (current-window-configuration )))
226+ (unwind-protect
227+ (save-excursion
228+ (when (eq (car debugger-args) 'debug )
229+ ; ; Skip the frames for backtrace-debug, byte-code,
230+ ; ; debug--implement-debug-on-entry and the advice's `apply' .
231+ (backtrace-debug 4 t )
232+ ; ; Place an extra debug-on-exit for macro's.
233+ (when (eq 'lambda (car-safe (cadr (backtrace-frame 4 ))))
234+ (backtrace-debug 5 t )))
235+ (with-current-buffer debugger-buffer
236+ (unless (derived-mode-p 'debugger-mode )
237+ (debugger-mode ))
238+ (debugger-setup-buffer debugger-args)
239+ (when non-interactive-frame
240+ ; ; If the backtrace is long, save the beginning
241+ ; ; and the end, but discard the middle.
242+ (let ((inhibit-read-only t ))
243+ (when (> (count-lines (point-min ) (point-max ))
244+ debugger-batch-max-lines)
245+ (goto-char (point-min ))
246+ (forward-line (/ debugger-batch-max-lines 2 ))
247+ (let ((middlestart (point )))
248+ (goto-char (point-max ))
249+ (forward-line (- (/ debugger-batch-max-lines 2 )))
250+ (delete-region middlestart (point )))
251+ (insert " ...\n " )))
252+ (message " %s " (buffer-string ))
253+ (kill-emacs -1 )))
254+ (pop-to-buffer
255+ debugger-buffer
256+ `((display-buffer-reuse-window
257+ display-buffer-in-previous-window
258+ display-buffer-below-selected)
259+ . ((window-min-height . 10 )
260+ (window-height . fit-window-to-buffer)
261+ ,@(when (and (window-live-p debugger-previous-window)
262+ (frame-visible-p
263+ (window-frame debugger-previous-window)))
264+ `((previous-window . , debugger-previous-window ))))))
265+ (setq debugger-window (selected-window ))
266+ (if (eq debugger-previous-window debugger-window)
267+ (when debugger-jumping-flag
268+ ; ; Try to restore previous height of debugger
269+ ; ; window.
270+ (condition-case nil
271+ (window-resize
272+ debugger-window
273+ (- debugger-previous-window-height
274+ (window-total-height debugger-window)))
275+ (error nil )))
276+ (setq debugger-previous-window debugger-window))
277+ (message " " )
278+ (let ((standard-output nil )
279+ (buffer-read-only t ))
280+ (message " " )
281+ ; ; Make sure we unbind buffer-read-only in the right buffer.
282+ (save-excursion
283+ (recursive-edit ))))
300284 (when (and (window-live-p debugger-window)
301285 (eq (window-buffer debugger-window) debugger-buffer))
302- (progn
303- ; ; Unshow debugger-buffer.
304- (quit-restore-window debugger-window debugger-bury-or-kill)
305- ; ; Restore current buffer (Bug#12502).
306- (set-buffer debugger-old-buffer)))
307- ; ; Forget debugger window, it won't be back (Bug#17882).
308- (setq debugger-previous-window nil ))
309- ; ; Restore previous state of debugger-buffer in case we were
310- ; ; in a recursive invocation of the debugger, otherwise just
311- ; ; erase the buffer.
312- (when (buffer-live-p debugger-buffer)
313- (with-current-buffer debugger-buffer
314- (if debugger-previous-state
315- (debugger--restore-buffer-state debugger-previous-state)
316- (setq backtrace-insert-header-function nil )
317- (setq backtrace-frames nil )
318- (backtrace-print))))
319- (with-timeout-unsuspend debugger-with-timeout-suspend)
320- (set-match-data debugger-outer-match-data)))
321- (setq debug-on-next-call debugger-step-after-exit)
322- debugger-value))))
286+ ; ; Record height of debugger window.
287+ (setq debugger-previous-window-height
288+ (window-total-height debugger-window)))
289+ (if debugger-will-be-back
290+ ; ; Restore previous window configuration (Bug#12623).
291+ (set-window-configuration window-configuration)
292+ (when (and (window-live-p debugger-window)
293+ (eq (window-buffer debugger-window) debugger-buffer))
294+ (progn
295+ ; ; Unshow debugger-buffer.
296+ (quit-restore-window debugger-window debugger-bury-or-kill)
297+ ; ; Restore current buffer (Bug#12502).
298+ (set-buffer debugger-old-buffer)))
299+ ; ; Forget debugger window, it won't be back (Bug#17882).
300+ (setq debugger-previous-window nil ))
301+ ; ; Restore previous state of debugger-buffer in case we were
302+ ; ; in a recursive invocation of the debugger, otherwise just
303+ ; ; erase the buffer.
304+ (when (buffer-live-p debugger-buffer)
305+ (with-current-buffer debugger-buffer
306+ (if debugger-previous-state
307+ (debugger--restore-buffer-state debugger-previous-state)
308+ (setq backtrace-insert-header-function nil )
309+ (setq backtrace-frames nil )
310+ (backtrace-print))))
311+ (with-timeout-unsuspend debugger-with-timeout-suspend)
312+ (set-match-data debugger-outer-match-data)))
313+ (setq debug-on-next-call debugger-step-after-exit)
314+ debugger-value))))
323315
324316(defun debugger--print (obj &optional stream )
325317 (condition-case err
0 commit comments