From: Nathan F. <nf...@us...> - 2009-04-23 13:29:03
|
Update of /cvsroot/sbcl/sbcl/src/code In directory fdv4jf1.ch3.sourceforge.com:/tmp/cvs-serv13162/src/code Modified Files: coerce.lisp Log Message: 1.0.27.27: micro-optimize COERCE *->vector and vector->list * sprinkle type declarations around to avoid checking for general SEQUENCEs; * use >= in loop exit tests to avoid checks for overflow. Index: coerce.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/code/coerce.lisp,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- coerce.lisp 5 Dec 2006 17:50:20 -0000 1.21 +++ coerce.lisp 23 Apr 2009 13:28:55 -0000 1.22 @@ -13,16 +13,17 @@ (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)) @@ -39,12 +40,13 @@ 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)))))) |