X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Fdebug.impure.lisp;h=a593394a5769328968e6a59af77ceafdd981ebf0;hb=f846a7a310d630cf538811959916492a28a75fb1;hp=96916bb24537620a1b70f7202f6f4e1209b24073;hpb=9c9c68bd6e5e3c6d02e9f1bfd583b87bb9e85eea;p=sbcl.git diff --git a/tests/debug.impure.lisp b/tests/debug.impure.lisp index 96916bb..a593394 100644 --- a/tests/debug.impure.lisp +++ b/tests/debug.impure.lisp @@ -58,5 +58,102 @@ (assert (eql &rest-sym '&rest)) (assert (symbolp format-args-sym))) +;;; Check for backtraces generally being correct. Ensure that the +;;; actual backtrace finishes (doesn't signal any errors on its own), +;;; and that it contains the frames we expect, doesn't contain any +;;; "bogus stack frame"s, and contains the appropriate toplevel call +;;; and hasn't been cut off anywhere. +(defun verify-backtrace (test-function frame-name + &key (key #'first) (test #'eql) + (allow-bogus-frames nil)) + (let ((result nil) + (return-value nil)) + (block outer-handler + (handler-bind + ((error #'(lambda (condition) + (let ((backtrace (ignore-errors + (sb-debug:backtrace-as-list)))) + ;; Make sure we find what we're looking for. + (if (member frame-name backtrace :key key :test test) + (setf result (list :error condition)) + (print (list :failed :frame frame-name :backtrace backtrace))) + ;; Make sure there's no bogus stack frames + ;; unless they're explicitly allowed. + (when (and (not allow-bogus-frames) + (member "bogus stack frame" backtrace + :key #'first :test #'equal)) + (print 'verify-backtrace-bogus) + (setf result nil)) + ;; Make sure the backtrace isn't stunted in + ;; any way. (Depends on running in the main + ;; thread.) + (unless (member 'sb-impl::toplevel-init backtrace + :key #'first :test #'equal) + (print 'verify-backtrace-stunted) + (setf result nil))) + (return-from outer-handler)))) + (funcall test-function))) + (values result return-value))) + +;;; Test for "undefined function" (undefined_tramp) working properly. +;;; Try it with and without tail call elimination, since they can have +;;; different effects. (Specifically, if undefined_tramp is incorrect +;;; a stunted stack can result from the tail call variant.) +#-(or alpha) ; bug 346 +(flet ((optimized () + (declare (optimize (speed 2) (debug 1))) ; tail call elimination + (#:undefined-function 42)) + (not-optimized () + (declare (optimize (speed 1) (debug 2))) ; no tail call elimination + (#:undefined-function 42)) + (test (fun) + (declare (optimize (speed 1) (debug 2))) ; no tail call elimination + (funcall fun))) + #-x86 ; <- known bug (?): fails for me on 0.8.17.31/Linux/x86 -- WHN 2004-12-27 + (dolist (frame '(#-(or x86 x86-64) "undefined function" ; bug 353 + "FLET COMMON-LISP-USER::TEST")) + (assert (verify-backtrace (lambda () (test #'optimized)) frame + :test #'equal + :allow-bogus-frames (or #+(or x86 x86-64) t)))) + (dolist (frame '(#-(or x86 x86-64) "undefined function" ; bug 353 + "FLET COMMON-LISP-USER::NOT-OPTIMIZED" + "FLET COMMON-LISP-USER::TEST")) + (assert (verify-backtrace (lambda () (test #'not-optimized)) frame + :test #'equal + :allow-bogus-frames (or #+(or x86 x86-64) t))))) + +;;; Division by zero was a common error on PPC. It depended on the +;;; return function either being before INTEGER-/-INTEGER in memory, +;;; or more than MOST-POSITIVE-FIXNUM bytes ahead. It also depends on +;;; INTEGER-/-INTEGER calling SIGNED-TRUNCATE. I believe Raymond Toy +;;; says that the Sparc backend (at least for CMUCL) inlines this, so +;;; if SBCL does the same this test is probably not good for the +;;; Sparc. +;;; +;;; Disabling tail call elimination on this will probably ensure that +;;; the return value (to the flet or the enclosing top level form) is +;;; more than MOST-POSITIVE-FIXNUM with the current spaces on OS X. +;;; Enabling it might catch other problems, so do it anyway. +#-alpha ; bug 346 +(progn + (flet ((test-function () + (declare (optimize (speed 2) (debug 1))) ; tail call elimination + (/ 42 0))) + (assert (verify-backtrace #'test-function '/))) + + (flet ((test-function () + (declare (optimize (speed 1) (debug 2))) ; no tail call elimination + (/ 42 0))) + (assert (verify-backtrace #'test-function '/)))) + +#-(or alpha) ; bug 61 +(progn + (defun throw-test () + (throw 'no-such-tag t)) + (assert (verify-backtrace #'throw-test + #-(or x86 x86-64 sparc) 'throw-test + #+(or x86 x86-64 sparc) "XEP for COMMON-LISP-USER::THROW-TEST" ; bug 354 + :test #'equal))) + ;;; success (quit :unix-status 104)