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