1.0.27.27: micro-optimize COERCE *->vector and vector->list
authorNathan Froyd <froydnj@cs.rice.edu>
Thu, 23 Apr 2009 13:28:55 +0000 (13:28 +0000)
committerNathan Froyd <froydnj@cs.rice.edu>
Thu, 23 Apr 2009 13:28:55 +0000 (13:28 +0000)
* sprinkle type declarations around to avoid checking for general SEQUENCEs;

* use >= in loop exit tests to avoid checks for overflow.

src/code/coerce.lisp
version.lisp-expr

index 9bd1e23..a4a93f0 100644 (file)
 
 (macrolet ((def (name result access src-type &optional typep)
              `(defun ,name (object ,@(if typep '(type) ()))
+                (declare (type ,(ecase src-type
+                                       (:list 'list)
+                                       (:vector 'vector)
+                                       (:sequence 'sequence)) object))
                 (do* ((index 0 (1+ index))
-                      (length (length (the ,(ecase src-type
-                                              (:list 'list)
-                                              (:vector 'vector)
-                                              (:sequence 'sequence))
-                                           object)))
+                      (length (length object))
                       (result ,result)
                       (in-object object))
-                     ((= index length) result)
+                     ((>= index length) result)
                   (declare (fixnum length index))
+                  (declare (type vector result))
                   (setf (,access result index)
                         ,(ecase src-type
                            (:list '(pop in-object))
     aref :sequence t))
 
 (defun vector-to-list* (object)
+  (declare (type vector object))
   (let ((result (list nil))
         (length (length object)))
     (declare (fixnum length))
     (do ((index 0 (1+ index))
          (splice result (cdr splice)))
-        ((= index length) (cdr result))
+        ((>= index length) (cdr result))
       (declare (fixnum index))
       (rplacd splice (list (aref object index))))))
 
index a6f8f39..1bf4112 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.27.26"
+"1.0.27.27"