X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Ftarget-type.lisp;h=d024ace63c366868eb133fcb6a922f0f8fe15260;hb=92a258eda6d6f0cadd1251200285671ec92aa45f;hp=6bbc5ddb66e899e2b1a01e136797445914b181e4;hpb=82653abf5573c22c691e2243b70647ecdaa6aea8;p=sbcl.git diff --git a/src/code/target-type.lisp b/src/code/target-type.lisp index 6bbc5dd..d024ace 100644 --- a/src/code/target-type.lisp +++ b/src/code/target-type.lisp @@ -81,7 +81,26 @@ (let ((predicate-name (second hairy-spec))) (declare (type symbol predicate-name)) ; by ANSI spec of SATISFIES (if (fboundp predicate-name) - (values (not (null (funcall predicate-name obj))) t) + (let* (;; "Is OBJ of the SATISFIES type?" represented + ;; as a generalized boolean. + ;; + ;; (Why IGNORE-ERRORS? This code is used to try to + ;; check type relationships at compile time. + ;; Passing only-slightly-twisted types like + ;; (AND INTEGER (SATISFIES ODDP)) into the + ;; rather-significantly-twisted type dispatch + ;; system can easily give rise to oddities like + ;; calling predicates like ODDP on values they + ;; don't like. (E.g. on OBJ=#\NEWLINE when the + ;; above type is tested for TYPE= against + ;; STANDARD-CHAR, represented as a + ;; MEMBER-TYPE.) In such cases, NIL seems to be + ;; an appropriate answer to "is OBJ of the + ;; SATISFIES type?") + (gbool (ignore-errors (funcall predicate-name obj))) + ;; RAW coerced to a pure BOOLEAN value + (bool (not (not gbool)))) + (values bool t)) (values nil nil))))))))) ;;; Return the layout for an object. This is the basic operation for