debug-early: Print bytecode in a more manageable way

* lisp/emacs-lisp/debug-early.el (debug-early-backtrace):
Escape newlines to and bytecodes to make backtraces slightly more
readable.  Use `cl-prin1` when available.
This commit is contained in:
Stefan Monnier 2022-04-29 22:18:09 -04:00
parent 73088b30cf
commit 08108a856a

View file

@ -35,30 +35,34 @@
(defalias 'debug-early-backtrace (defalias 'debug-early-backtrace
#'(lambda () #'(lambda ()
"Print a trace of Lisp function calls currently active. "Print a trace of Lisp function calls currently active.
The output stream used is the value of `standard-output'. The output stream used is the value of `standard-output'.
This is a simplified version of the standard `backtrace' This is a simplified version of the standard `backtrace'
function, intended for use in debugging the early parts function, intended for use in debugging the early parts
of the build process." of the build process."
(princ "\n") (princ "\n")
(mapbacktrace (let ((print-escape-newlines t)
#'(lambda (evald func args _flags) (print-escape-control-characters t)
(let ((args args)) (print-escape-nonascii t)
(if evald (prin1 (if (fboundp 'cl-prin1) #'cl-prin1 #'prin1)))
(progn (mapbacktrace
(princ " ") #'(lambda (evald func args _flags)
(prin1 func) (let ((args args))
(princ "(")) (if evald
(progn (progn
(princ " (") (princ " ")
(setq args (cons func args)))) (funcall prin1 func)
(if args (princ "("))
(while (progn (progn
(prin1 (car args)) (princ " (")
(setq args (cdr args))) (setq args (cons func args))))
(princ " "))) (if args
(princ ")\n")))))) (while (progn
(funcall prin1 (car args))
(setq args (cdr args)))
(princ " ")))
(princ ")\n")))))))
(defalias 'debug-early (defalias 'debug-early
#'(lambda (&rest args) #'(lambda (&rest args)
@ -76,7 +80,7 @@ superseded by `debug' after enough Lisp has been loaded to
support the latter, except in batch mode which always uses support the latter, except in batch mode which always uses
`debug-early'. `debug-early'.
(In versions of Emacs prior to Emacs 29, no backtrace was \(In versions of Emacs prior to Emacs 29, no backtrace was
available before `debug' was usable.)" available before `debug' was usable.)"
(princ "\nError: ") (princ "\nError: ")
(prin1 (car (car (cdr args)))) ; The error symbol. (prin1 (car (car (cdr args)))) ; The error symbol.