X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Finterface.impure.lisp;h=da179ede3f0ee3c2e62c2b33dc50f1c09e7f0571;hb=1cba0af01f5107ab384d0d8b94b1f6330b3d0ef4;hp=ac4776ab51bd2809c8dba6b11bbe1501ba65a7af;hpb=c5e9ad7d244be10589cf079e36422ffe005d0e67;p=sbcl.git diff --git a/tests/interface.impure.lisp b/tests/interface.impure.lisp index ac4776a..da179ed 100644 --- a/tests/interface.impure.lisp +++ b/tests/interface.impure.lisp @@ -30,55 +30,60 @@ (assert (string= (documentation #'(setf foo) 'function) "(setf foo) documentation")) +(with-test (:name :disassemble) ;;; DISASSEMBLE shouldn't fail on closures or unpurified functions -(defun disassemble-fun (x) x) -(disassemble 'disassemble-fun) - -(let ((x 1)) (defun disassemble-closure (y) (if y (setq x y) x))) -(disassemble 'disassemble-closure) - -#+sb-eval -(progn - ;; Nor should it fail on interpreted functions - (let ((sb-ext:*evaluator-mode* :interpret)) - (eval `(defun disassemble-eval (x) x)) - (disassemble 'disassemble-eval)) - - ;; disassemble-eval should still be an interpreted function. - ;; clhs disassemble: "(If that function is an interpreted function, - ;; it is first compiled but the result of this implicit compilation - ;; is not installed.)" - (assert (sb-eval:interpreted-function-p #'disassemble-eval))) - -;; nor should it fail on generic functions or other funcallable instances -(defgeneric disassemble-generic (x)) -(disassemble 'disassemble-generic) -(let ((fin (sb-mop:make-instance 'sb-mop:funcallable-standard-object))) - (disassemble fin)) + (defun disassemble-fun (x) x) + (disassemble 'disassemble-fun) + + (let ((x 1)) (defun disassemble-closure (y) (if y (setq x y) x))) + (disassemble 'disassemble-closure) + + #+sb-eval + (progn + ;; Nor should it fail on interpreted functions + (let ((sb-ext:*evaluator-mode* :interpret)) + (eval `(defun disassemble-eval (x) x)) + (disassemble 'disassemble-eval)) + + ;; disassemble-eval should still be an interpreted function. + ;; clhs disassemble: "(If that function is an interpreted function, + ;; it is first compiled but the result of this implicit compilation + ;; is not installed.)" + (assert (sb-eval:interpreted-function-p #'disassemble-eval))) + + ;; nor should it fail on generic functions or other funcallable instances + (defgeneric disassemble-generic (x)) + (disassemble 'disassemble-generic) + (let ((fin (make-instance 'sb-mop:funcallable-standard-object))) + (disassemble fin))) ;;; while we're at it, much the same applies to ;;; FUNCTION-LAMBDA-EXPRESSION: (defun fle-fun (x) x) -(function-lambda-expression #'fle-fun) (let ((x 1)) (defun fle-closure (y) (if y (setq x y) x))) -(function-lambda-expression #'fle-closure) - -#+sb-eval -(progn - ;; Nor should it fail on interpreted functions - (let ((sb-ext:*evaluator-mode* :interpret)) - (eval `(defun fle-eval (x) x)) - (function-lambda-expression #'fle-eval)) - - ;; fle-eval should still be an interpreted function. - (assert (sb-eval:interpreted-function-p #'fle-eval))) - -;; nor should it fail on generic functions or other funcallable instances -(defgeneric fle-generic (x)) -(function-lambda-expression #'fle-generic) -(let ((fin (sb-mop:make-instance 'sb-mop:funcallable-standard-object))) - (function-lambda-expression fin)) + +(with-test (:name :function-lambda-expression) + (flet ((fle-name (x) + (nth-value 2 (function-lambda-expression x)))) + (assert (eql (fle-name #'fle-fun) 'fle-fun)) + (assert (eql (fle-name #'fle-closure) 'fle-closure)) + (assert (eql (fle-name #'disassemble-generic) 'disassemble-generic)) + (function-lambda-expression + (make-instance 'sb-mop:funcallable-standard-object)) + (function-lambda-expression + (make-instance 'generic-function)) + (function-lambda-expression + (make-instance 'standard-generic-function)) + #+sb-eval + (progn + (let ((sb-ext:*evaluator-mode* :interpret)) + (eval `(defun fle-eval (x) x)) + (assert (eql (fle-name #'fle-eval) 'fle-eval))) + + ;; fle-eval should still be an interpreted function. + (assert (sb-eval:interpreted-function-p #'fle-eval))))) + ;;; support for DESCRIBE tests (defstruct to-be-described a b) @@ -86,6 +91,10 @@ (let ((sb-ext:*evaluator-mode* :compile)) (eval `(let (x) (defun closure-to-describe () (incf x))))) +(with-test (:name :describe-empty-gf) + (describe (make-instance 'generic-function)) + (describe (make-instance 'standard-generic-function))) + ;;; DESCRIBE should run without signalling an error. (with-test (:name (describe :no-error)) (describe (make-to-be-described)) @@ -232,22 +241,21 @@ "bar" (incf x y))) -(with-test (:name (documentation closure)) +(with-test (:name (documentation :closure)) (assert (string= (documentation 'docfoo 'function) "bar")) - (assert (string= (documentation #'docfoo t) "bar")) (assert (string= (setf (documentation 'docfoo 'function) "baz") "baz")) (assert (string= (documentation 'docfoo 'function) "baz")) - (assert (string= (documentation #'docfoo t) "bar")) + (assert (string= (documentation #'docfoo t) "baz")) (assert (string= (setf (documentation #'docfoo t) "zot") "zot")) (assert (string= (documentation #'docfoo t) "zot")) - (assert (string= (documentation 'docfoo 'function) "baz")) + (assert (string= (documentation 'docfoo 'function) "zot")) (assert (not (setf (documentation 'docfoo 'function) nil))) - (assert (string= (documentation 'docfoo 'function) "zot"))) + (assert (not (documentation 'docfoo 'function)))) -(with-test (:name (documentation built-in-macro) :skipped-on '(not :sb-doc)) +(with-test (:name (documentation :built-in-macro) :skipped-on '(not :sb-doc)) (assert (documentation 'trace 'function))) -(with-test (:name (documentation built-in-function) :skipped-on '(not :sb-doc)) +(with-test (:name (documentation :built-in-function) :skipped-on '(not :sb-doc)) (assert (documentation 'cons 'function))) (with-test (:name :describe-generic-function-with-assumed-type) @@ -264,5 +272,61 @@ (assert (equal "foo" (documentation 'bug-643958-test 'function))) (setf (documentation 'bug-643958-test 'function) "bar") (assert (equal "bar" (documentation 'bug-643958-test 'function)))) + +(defclass cannot-print-this () + ()) +(defmethod print-object ((oops cannot-print-this) stream) + (error "No go!")) +(with-test (:name :describe-suppresses-print-errors) + (handler-bind ((error #'continue)) + (with-output-to-string (s) + (describe (make-instance 'cannot-print-this) s)))) +(with-test (:name :backtrace-suppresses-print-errors) + (handler-bind ((error #'continue)) + (with-output-to-string (s) + (labels ((foo (n x) + (when (plusp n) + (foo (1- n) x)) + (when (zerop n) + (sb-debug:backtrace 100 s)))) + (foo 100 (make-instance 'cannot-print-this)))))) +(with-test (:name :backtrace-and-circles) + (handler-bind ((error #'continue)) + (with-output-to-string (s) + (labels ((foo (n x) + (when (plusp n) + (foo (1- n) x)) + (when (zerop n) + (sb-debug:backtrace 100 s)))) + (foo 100 (let ((list (list t))) + (nconc list list))))))) + +(with-test (:name :endianness-in-features) + (assert + (or (member :big-endian *features*) + (member :little-endian *features*)))) + +(with-test (:name :function-documentation-mismatch) + (defun test () + "X" + nil) + (setf (symbol-function 'test2) #'test) + (setf (documentation 'test 'function) "Y") + (assert (equal (documentation #'test t) + (documentation 'test 'function))) + (setf (documentation 'test2 'function) "Z") + (assert (not + (equal (documentation 'test 'function) + (documentation 'test2 'function))))) + +(with-test (:name :setf-documentation-on-nil) + (assert + (handler-case + (assert (equal (setf (documentation nil 'function) "foo") "foo")) + (style-warning () t) + (:no-error (x) + (declare (ignore x)) + nil)))) + ;;;; success