0.7.5.5:
authorChristophe Rhodes <csr21@cam.ac.uk>
Fri, 5 Jul 2002 14:39:51 +0000 (14:39 +0000)
committerChristophe Rhodes <csr21@cam.ac.uk>
Fri, 5 Jul 2002 14:39:51 +0000 (14:39 +0000)
Fix bug 186 by adding a declaration to the FILL transform.
... and write a test
... analogous fix in the transform for HAIRY-DATA-VECTOR-SET,
though any bug coming from there hadn't been
detected yet.
Greetings from Paris!

BUGS
src/compiler/generic/vm-tran.lisp
src/compiler/seqtran.lisp
tests/seq.impure.lisp
version.lisp-expr

diff --git a/BUGS b/BUGS
index 08bfbdc..7d7bfe2 100644 (file)
--- a/BUGS
+++ b/BUGS
@@ -1369,17 +1369,6 @@ WORKAROUND:
   however, compiling and loading the same expression in a file works
   as expected.
 
-186: "Undercautious FILL transform"
-  Compiling and loading the following code:
-  (declare (optimize (safety 3) (speed 2) (space 1)))
-  (defun foo (x)
-    (fill (make-string 10) x))
-  and then running
-  * (foo 4097)
-  "@@@@@@@@@@"
-  This is probably due to insufficient checking in the IR1
-  deftransform for FILL
-
 187: "type inference confusion around DEFTRANSFORM time"
   (reported even more verbosely on sbcl-devel 2002-06-28 as "strange
   bug in DEFTRANSFORM")
index 80b1623..2cbd25c 100644 (file)
@@ -88,7 +88,8 @@
     (let ((element-type-specifier (type-specifier element-ctype)))
       `(multiple-value-bind (array index)
           (%data-vector-and-index array index)
-        (declare (type (simple-array ,element-type-specifier 1) array))
+        (declare (type (simple-array ,element-type-specifier 1) array)
+                 (type ,element-type-specifier new-value))
         (data-vector-set array
                          index
                          new-value)))))
index a1fc338..5b29033 100644 (file)
                    :policy (> speed space))
   "open code"
   (let ((element-type (upgraded-element-type-specifier-or-give-up seq)))
-    `(with-array-data ((data seq)
-                      (start start)
-                      (end end))
+    (values 
+     `(with-array-data ((data seq)
+                       (start start)
+                       (end end))
        (declare (type (simple-array ,element-type 1) data))
+       (declare (type fixnum start end))
        (do ((i start (1+ i)))
           ((= i end) seq)
         (declare (type index i))
         ;; WITH-ARRAY-DATA did our range checks once and for all, so
-        ;; it'd be wasteful to check again on every AREF.
+        ;; it'd be wasteful to check again on every AREF...
         (declare (optimize (safety 0))) 
-        (setf (aref data i) item)))))
+        (setf (aref data i) item)))
+     ;; ... though we still need to check that the new element can fit
+     ;; into the vector in safe code. -- CSR, 2002-07-05
+     `((declare (type ,element-type item))))))
 \f
 ;;;; utilities
 
index 1339374..c75e952 100644 (file)
   ;; fixed in sbcl-0.7.4.22 by WHN
   (assert (null (ignore-errors (subseq avec 1 5)))))
 
+;;; FILL
+(defun test-fill-typecheck (x)
+  (declare (optimize (safety 3) (space 2) (speed 1)))
+  (fill (make-string 10) x))
+
+(assert (string= (test-fill-typecheck #\@) "@@@@@@@@@@"))
+;;; BUG 186, fixed in sbcl-0.7.5.5
+(assert (null (ignore-errors (test-fill-typecheck 4097))))
+
 ;;; success
 (quit :unix-status 104)
index 858a599..aa73c96 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.5.4"
+"0.7.5.5"