Skip to content

Commit 0223a15

Browse files
doublepEli-Zaretskii
authored andcommitted
* lisp/emacs-lisp/debug.el (debug): Merge the non-interactive cases
bug#38927 (cherry picked from commit 5020594)
1 parent 5bf2ef3 commit 0223a15

File tree

1 file changed

+142
-150
lines changed

1 file changed

+142
-150
lines changed

lisp/emacs-lisp/debug.el

Lines changed: 142 additions & 150 deletions
Original file line numberDiff line numberDiff line change
@@ -168,158 +168,150 @@ first will be printed into the backtrace buffer.
168168
If `inhibit-redisplay' is non-nil when this function is called,
169169
the 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

Comments
 (0)