1.0.30.42: missing array predicate definitions
authorNikodemus Siivola <nikodemus@random-state.net>
Mon, 10 Aug 2009 09:58:45 +0000 (09:58 +0000)
committerNikodemus Siivola <nikodemus@random-state.net>
Mon, 10 Aug 2009 09:58:45 +0000 (09:58 +0000)
 * Not all specialized array predicates had an out-of-line predicate.
   Generate them from the SAETP vector. Reported by Stelian Ionescu.

 * Test case.

NEWS
src/code/pred.lisp
tests/compiler.pure.lisp
version.lisp-expr

diff --git a/NEWS b/NEWS
index f368e7e..fea08fb 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -50,6 +50,8 @@ changes relative to sbcl-1.0.30:
     Elsasser)
   * improvement: pretty-printing of various Lisp forms has been improved
     (thanks to Tobias Rittweiler)
+  * bug fix: some out-of-line array predicates were missing (reported by
+    Stelian Ionescu)
   * bug fix: a failing AVER in CONVERT-MV-CALL has been fixed. (thanks to
     Larry D'Anna)
   * bug fix: a failing AVER in %ALLOCATE-CLOSURES conversion has been fixed
index 2830c51..346e388 100644 (file)
   (def-type-predicate-wrapper ratiop)
   (def-type-predicate-wrapper realp)
   (def-type-predicate-wrapper short-float-p)
-  (def-type-predicate-wrapper simple-array-p)
-  (def-type-predicate-wrapper simple-bit-vector-p)
-  (def-type-predicate-wrapper simple-base-string-p)
-  #!+sb-unicode (def-type-predicate-wrapper simple-character-string-p)
-  (def-type-predicate-wrapper simple-string-p)
-  (def-type-predicate-wrapper simple-vector-p)
   (def-type-predicate-wrapper single-float-p)
-  (def-type-predicate-wrapper stringp)
   (def-type-predicate-wrapper %instancep)
   (def-type-predicate-wrapper symbolp)
   (def-type-predicate-wrapper system-area-pointer-p)
   (def-type-predicate-wrapper weak-pointer-p)
-  (def-type-predicate-wrapper vectorp)
-  #!+#.(cl:if (cl:= 32 sb!vm:n-word-bits) '(and) '(or))
-  (def-type-predicate-wrapper unsigned-byte-32-p)
   #!+#.(cl:if (cl:= 32 sb!vm:n-word-bits) '(and) '(or))
-  (def-type-predicate-wrapper signed-byte-32-p)
+  (progn
+    (def-type-predicate-wrapper unsigned-byte-32-p)
+    (def-type-predicate-wrapper signed-byte-32-p))
   #!+#.(cl:if (cl:= 64 sb!vm:n-word-bits) '(and) '(or))
-  (def-type-predicate-wrapper unsigned-byte-64-p)
-  #!+#.(cl:if (cl:= 64 sb!vm:n-word-bits) '(and) '(or))
-  (def-type-predicate-wrapper signed-byte-64-p)
-  (def-type-predicate-wrapper simple-array-nil-p)
-  (def-type-predicate-wrapper simple-array-unsigned-byte-2-p)
-  (def-type-predicate-wrapper simple-array-unsigned-byte-4-p)
-  (def-type-predicate-wrapper simple-array-unsigned-byte-8-p)
-  (def-type-predicate-wrapper simple-array-unsigned-byte-16-p)
-  (def-type-predicate-wrapper simple-array-unsigned-byte-32-p)
-  (def-type-predicate-wrapper simple-array-signed-byte-8-p)
-  (def-type-predicate-wrapper simple-array-signed-byte-16-p)
-  (def-type-predicate-wrapper simple-array-signed-byte-30-p)
-  (def-type-predicate-wrapper simple-array-signed-byte-32-p)
-  (def-type-predicate-wrapper simple-array-single-float-p)
-  (def-type-predicate-wrapper simple-array-double-float-p)
-  #!+long-float (def-type-predicate-wrapper simple-array-long-float-p)
-  (def-type-predicate-wrapper simple-array-complex-single-float-p)
-  (def-type-predicate-wrapper simple-array-complex-double-float-p)
-  #!+long-float (def-type-predicate-wrapper simple-array-complex-long-float-p)
+  (progn
+    (def-type-predicate-wrapper unsigned-byte-64-p)
+    (def-type-predicate-wrapper signed-byte-64-p))
+  ;; Specialized array types
+  (macrolet ((saetp-defs ()
+               `(progn
+                  ,@(map 'list
+                         (lambda (saetp)
+                           `(def-type-predicate-wrapper
+                                ,(symbolicate (sb!vm:saetp-primitive-type-name saetp) "-P")))
+                         sb!vm:*specialized-array-element-type-properties*))))
+    (saetp-defs))
+  ;; Other array types
+  (def-type-predicate-wrapper simple-array-p)
+  (def-type-predicate-wrapper simple-string-p)
+  (def-type-predicate-wrapper stringp)
+  (def-type-predicate-wrapper vectorp)
   (def-type-predicate-wrapper vector-nil-p))
 \f
 ;;; Return the specifier for the type of object. This is not simply
index e8309c7..48cf250 100644 (file)
                            t))))
     (ctu:assert-no-consing (funcall f))))
 
+(with-test (:name :array-type-predicates)
+  (dolist (et sb-kernel::*specialized-array-element-types*)
+    (when et
+      (let* ((v (make-array 3 :element-type et))
+             (fun (compile nil `(lambda ()
+                                  (list
+                                   (if (typep ,v '(simple-array ,et (*)))
+                                       :good
+                                       :bad)
+                                   (if (typep (elt ,v 0) '(simple-array ,et (*)))
+                                       :bad
+                                       :good))))))
+        (assert (equal '(:good :good) (funcall fun)))))))
+
 (with-test (:name :truncate-float)
   (let ((s (compile nil `(lambda (x)
                            (declare (single-float x))
index edf1472..189db65 100644 (file)
@@ -17,4 +17,4 @@
 ;;; checkins which aren't released. (And occasionally for internal
 ;;; versions, especially for internal versions off the main CVS
 ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"1.0.30.41"
+"1.0.30.42"