* enhancement: clean.sh now also cleans doc/internals.
* enhancement: SB-EXT:PRINT-SYMBOL-WITH-PREFIX can be used within ~// to
print a symbol with a package prefix.
+ * enhancement: The debugger and backtracing are more robust against buggy
+ PRINT-OBJECT methods.
* optimization: calls to static functions on x86-64 use less instructions.
* optimization: compute encode-universal-time at compile time when possible.
* optimization: when referencing internal functions as #'x, don't go through
useful when the debugger was invoked to handle an error in
deeply nested input syntax, and now the reader is confused.)")
\f
+(defmacro with-debug-io-syntax (() &body body)
+ (let ((thunk (gensym "THUNK")))
+ `(dx-flet ((,thunk ()
+ ,@body))
+ (funcall-with-debug-io-syntax #',thunk))))
;;; If LOC is an unknown location, then try to find the block start
;;; location. Used by source printing to some information instead of
corresponding to method functions are printed. Possible values
are :MINIMAL, :NORMAL, and :FULL. See *METHOD-FRAME-STYLE* for more
information."
- (fresh-line stream)
- (when print-thread
- (format stream "Backtrace for: ~S~%" sb!thread:*current-thread*))
- (let ((*suppress-print-errors* (if (subtypep 'serious-condition *suppress-print-errors*)
- *suppress-print-errors*
- 'serious-condition))
- (*print-circle* t)
- (n start))
- (handler-bind ((print-not-readable #'print-unreadably))
+ (with-debug-io-syntax ()
+ (fresh-line stream)
+ (when print-thread
+ (format stream "Backtrace for: ~S~%" sb!thread:*current-thread*))
+ (let ((*suppress-print-errors* (if (subtypep 'serious-condition *suppress-print-errors*)
+ *suppress-print-errors*
+ 'serious-condition))
+ (*print-circle* t)
+ (n start))
+ (handler-bind ((print-not-readable #'print-unreadably))
(map-backtrace (lambda (frame)
(print-frame-call frame stream
:number n
:from (backtrace-start-frame from)
:start start
:count count)))
- (fresh-line stream)
- (values))
+ (fresh-line stream)
+ (values)))
(defun list-backtrace (&key
(count *backtrace-frame-count*)
(package-name *package*))
(setf *package* (find-package :cl-user))
(format *error-output*
- "The value of ~S was not an undeleted PACKAGE. It has been
-reset to ~S."
+ "The value of ~S was not an undeleted PACKAGE. It has been ~
+ reset to ~S."
'*package* *package*))
;; Before we start our own output, finish any pending output.