0.7.4.12:
authorWilliam Harold Newman <william.newman@airmail.net>
Sat, 1 Jun 2002 23:53:55 +0000 (23:53 +0000)
committerWilliam Harold Newman <william.newman@airmail.net>
Sat, 1 Jun 2002 23:53:55 +0000 (23:53 +0000)
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
tests/compiler.pure.lisp
version.lisp-expr

index 6bbc5dd..d024ace 100644 (file)
          (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)))))))))
 \f
 ;;; Return the layout for an object. This is the basic operation for
index 73a6c7d..7b4346c 100644 (file)
     (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)))
index 104c2fc..2360276 100644 (file)
@@ -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"