From 0009bbcdd02c9bd8c8db09d4a23b8de338ae24d0 Mon Sep 17 00:00:00 2001 From: William Harold Newman Date: Sat, 1 Jun 2002 23:53:55 +0000 Subject: [PATCH] 0.7.4.12: reminding the compiler how to compile the high-level parts of my Go program now that I'm not stuck in the same stupid low level part any more, part II (where 0.7.4.10 was part I): You can never have too many IGNORE-ERRORSs. --- src/code/target-type.lisp | 21 ++++++++++++++++++++- tests/compiler.pure.lisp | 15 +++++++++++++++ version.lisp-expr | 2 +- 3 files changed, 36 insertions(+), 2 deletions(-) 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 diff --git a/tests/compiler.pure.lisp b/tests/compiler.pure.lisp index 73a6c7d..7b4346c 100644 --- a/tests/compiler.pure.lisp +++ b/tests/compiler.pure.lisp @@ -114,3 +114,18 @@ (assert (functionp fun)) (assert (not warnings-p)) (assert (not failure-p)))) + +;;; a bug in 0.7.4.11 +(dolist (i '(a b 1 2 "x" "y")) + ;; In sbcl-0.7.4.11, the compiler tried to source-transform the + ;; TYPEP here but got confused and died, doing + ;; (ASSOC '(AND INTEGERP (SATISFIES PLUSP))) + ;; *BACKEND-TYPE-PREDICATES* + ;; :TEST #'TYPE=) + ;; and blowing up because TYPE= tried to call PLUSP on the + ;; characters of the MEMBER-TYPE representing STANDARD-CHAR. + (when (typep i '(and integer (satisfies oddp))) + (print i))) +(dotimes (i 14) + (when (typep i '(and integer (satisfies oddp))) + (print i))) diff --git a/version.lisp-expr b/version.lisp-expr index 104c2fc..2360276 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -18,4 +18,4 @@ ;;; for internal versions, especially for internal versions off the ;;; main CVS branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".) -"0.7.4.11" +"0.7.4.12" -- 1.7.10.4