-(macrolet ((with-details (bool &body body)
- `(let ((sb-debug:*show-entry-point-details* ,bool))
- ,@body)))
-
- ;; &MORE-PROCESSOR
- (with-details t
- (assert (verify-backtrace (lambda () (bt.1 :key))
- '(((sb-c::&more-processor bt.1) &rest)))))
- (with-details nil
- (assert (verify-backtrace (lambda () (bt.1 :key))
- '((bt.1 :key)))))
-
- ;; XEP
- (with-details t
- (assert (verify-backtrace #'bt.2
- '(((sb-c::xep bt.2) 0 ?)))))
- (with-details nil
- (assert (verify-backtrace #'bt.2
- '((bt.2)))))
-
- ;; TL-XEP
- (with-details t
- (assert (verify-backtrace #'namestring
- '(((sb-c::tl-xep namestring) 0 ?)))))
- (with-details nil
- (assert (verify-backtrace #'namestring
- '((namestring)))))
-
- ;; VARARGS-ENTRY
- (with-details t
- (assert (verify-backtrace #'bt.3
- '(((sb-c::varargs-entry bt.3) :key nil)))))
- (with-details nil
- (assert (verify-backtrace #'bt.3
- '((bt.3 :key nil)))))
-
- ;; HAIRY-ARG-PROCESSOR
- (with-details t
- (assert (verify-backtrace #'bt.4
- '(((sb-c::hairy-arg-processor bt.4) ?)))))
- (with-details nil
- (assert (verify-backtrace #'bt.4
- '((bt.4 ?)))))
-
- ;; &OPTIONAL-PROCESSOR
- (with-details t
- (assert (verify-backtrace #'bt.5
- '(((sb-c::&optional-processor bt.5))))))
- (with-details nil
- (assert (verify-backtrace #'bt.5
- '((bt.5))))))
-
-;;; success
-(quit :unix-status 104)
+;;; FIXME: This test really should be broken into smaller pieces
+(with-test (:name (:backtrace :misc)
+ :fails-on '(and :x86 :linux))
+ (macrolet ((with-details (bool &body body)
+ `(let ((sb-debug:*show-entry-point-details* ,bool))
+ ,@body)))
+
+ ;; TL-XEP
+ (print :tl-xep)
+ (with-details t
+ (assert (verify-backtrace #'namestring
+ '(((sb-c::tl-xep namestring) 0 ?)))))
+ (with-details nil
+ (assert (verify-backtrace #'namestring
+ '((namestring)))))
+
+
+ ;; &MORE-PROCESSOR
+ (with-details t
+ (assert (verify-backtrace (lambda () (bt.1.1 :key))
+ '(((sb-c::&more-processor bt.1.1) &rest))))
+ (assert (verify-backtrace (lambda () (bt.1.2 :key))
+ '(((sb-c::&more-processor bt.1.2) &rest))))
+ (assert (verify-backtrace (lambda () (bt.1.3 :key))
+ '(((sb-c::&more-processor bt.1.3) &rest)))))
+ (with-details nil
+ (assert (verify-backtrace (lambda () (bt.1.1 :key))
+ '((bt.1.1 :key))))
+ (assert (verify-backtrace (lambda () (bt.1.2 :key))
+ '((bt.1.2 &rest))))
+ (assert (verify-backtrace (lambda () (bt.1.3 :key))
+ '((bt.1.3 &rest)))))
+
+ ;; XEP
+ (print :xep)
+ (with-details t
+ (assert (verify-backtrace #'bt.2.1
+ '(((sb-c::xep bt.2.1) 0 ?))))
+ (assert (verify-backtrace #'bt.2.2
+ '(((sb-c::xep bt.2.2) &rest))))
+ (assert (verify-backtrace #'bt.2.3
+ '(((sb-c::xep bt.2.3) &rest)))))
+ (with-details nil
+ (assert (verify-backtrace #'bt.2.1
+ '((bt.2.1))))
+ (assert (verify-backtrace #'bt.2.2
+ '((bt.2.2 &rest))))
+ (assert (verify-backtrace #'bt.2.3
+ '((bt.2.3 &rest)))))
+
+ ;; VARARGS-ENTRY
+ (print :varargs-entry)
+ (with-details t
+ (assert (verify-backtrace #'bt.3.1
+ '(((sb-c::varargs-entry bt.3.1) :key nil))))
+ (assert (verify-backtrace #'bt.3.2
+ '(((sb-c::varargs-entry bt.3.2) :key ?))))
+ (assert (verify-backtrace #'bt.3.3
+ '(((sb-c::varargs-entry bt.3.3) &rest)))))
+ (with-details nil
+ (assert (verify-backtrace #'bt.3.1
+ '((bt.3.1 :key nil))))
+ (assert (verify-backtrace #'bt.3.2
+ '((bt.3.2 :key ?))))
+ (assert (verify-backtrace #'bt.3.3
+ '((bt.3.3 &rest)))))
+
+ ;; HAIRY-ARG-PROCESSOR
+ (print :hairy-args-processor)
+ (with-details t
+ (assert (verify-backtrace #'bt.4.1
+ '(((sb-c::hairy-arg-processor bt.4.1) ?))))
+ (assert (verify-backtrace #'bt.4.2
+ '(((sb-c::hairy-arg-processor bt.4.2) ?))))
+ (assert (verify-backtrace #'bt.4.3
+ '(((sb-c::hairy-arg-processor bt.4.3) &rest)))))
+ (with-details nil
+ (assert (verify-backtrace #'bt.4.1
+ '((bt.4.1 ?))))
+ (assert (verify-backtrace #'bt.4.2
+ '((bt.4.2 ?))))
+ (assert (verify-backtrace #'bt.4.3
+ '((bt.4.3 &rest)))))
+
+ ;; &OPTIONAL-PROCESSOR
+ (print :optional-processor)
+ (with-details t
+ (assert (verify-backtrace #'bt.5.1
+ '(((sb-c::&optional-processor bt.5.1)))))
+ (assert (verify-backtrace #'bt.5.2
+ '(((sb-c::&optional-processor bt.5.2) &rest))))
+ (assert (verify-backtrace #'bt.5.3
+ '(((sb-c::&optional-processor bt.5.3) &rest)))))
+ (with-details nil
+ (assert (verify-backtrace #'bt.5.1
+ '((bt.5.1))))
+ (assert (verify-backtrace #'bt.5.2
+ '((bt.5.2 &rest))))
+ (assert (verify-backtrace #'bt.5.3
+ '((bt.5.3 &rest)))))))
+
+;;;; test TRACE
+
+(defun trace-this ()
+ 'ok)
+
+(let ((out (with-output-to-string (*trace-output*)
+ (trace trace-this)
+ (assert (eq 'ok (trace-this)))
+ (untrace))))
+ (assert (search "TRACE-THIS" out))
+ (assert (search "returned OK" out)))
+
+;;; bug 379
+;;; This is not a WITH-TEST :FAILS-ON PPC DARWIN since there are
+;;; suspicions that the breakpoint trace might corrupt the whole image
+;;; on that platform.
+#-(and ppc darwin)
+(let ((out (with-output-to-string (*trace-output*)
+ (trace trace-this :encapsulate nil)
+ (assert (eq 'ok (trace-this)))
+ (untrace))))
+ (assert (search "TRACE-THIS" out))
+ (assert (search "returned OK" out)))
+
+;;;; test infinite error protection
+
+(defmacro nest-errors (n-levels error-form)
+ (if (< 0 n-levels)
+ `(handler-bind ((error (lambda (condition)
+ (declare (ignore condition))
+ ,error-form)))
+ (nest-errors ,(1- n-levels) ,error-form))
+ error-form))
+
+(defun erroring-debugger-hook (condition old-debugger-hook)
+ (let ((*debugger-hook* old-debugger-hook))
+ (format t "recursive condition: ~A~%" condition) (force-output)
+ (error "recursive condition: ~A" condition)))
+
+(defun test-inifinite-error-protection ()
+ ;; after 50 successful throws to SB-IMPL::TOPLEVEL-CATCHER sbcl used
+ ;; to halt, it produces so much garbage that's hard to suppress that
+ ;; it is tested only once
+ (let ((*debugger-hook* #'erroring-debugger-hook))
+ (loop repeat 1 do
+ (let ((error-counter 0)
+ (*terminal-io* (make-broadcast-stream)))
+ (assert
+ (not (eq
+ :normal-exit
+ (catch 'sb-impl::toplevel-catcher
+ (nest-errors 20 (error "infinite error ~s"
+ (incf error-counter)))
+ :normal-exit))))))))
+
+(enable-debugger)
+
+(test-inifinite-error-protection)
+
+#+sb-thread
+(let ((thread (sb-thread:make-thread #'test-inifinite-error-protection)))
+ (loop while (sb-thread:thread-alive-p thread)))
+
+(disable-debugger)