From: Christophe Rhodes Date: Fri, 5 Jul 2002 14:39:51 +0000 (+0000) Subject: 0.7.5.5: X-Git-Url: http://repo.macrolet.net/gitweb/?a=commitdiff_plain;h=9669e4709b33fc8644ad209c51242f09aba91038;p=sbcl.git 0.7.5.5: 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! --- diff --git a/BUGS b/BUGS index 08bfbdc..7d7bfe2 100644 --- 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") diff --git a/src/compiler/generic/vm-tran.lisp b/src/compiler/generic/vm-tran.lisp index 80b1623..2cbd25c 100644 --- a/src/compiler/generic/vm-tran.lisp +++ b/src/compiler/generic/vm-tran.lisp @@ -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))))) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index a1fc338..5b29033 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -293,17 +293,22 @@ :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)))))) ;;;; utilities diff --git a/tests/seq.impure.lisp b/tests/seq.impure.lisp index 1339374..c75e952 100644 --- a/tests/seq.impure.lisp +++ b/tests/seq.impure.lisp @@ -198,5 +198,14 @@ ;; 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) diff --git a/version.lisp-expr b/version.lisp-expr index 858a599..aa73c96 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.5.4" +"0.7.5.5"