diff options
author | Nathan Froyd <froydnj@cs.rice.edu> | 2009-04-23 13:28:55 +0000 |
---|---|---|
committer | Nathan Froyd <froydnj@cs.rice.edu> | 2009-04-23 13:28:55 +0000 |
commit | 6de517974934588c8b5c6355e04bef11af9db3d0 (patch) | |
tree | cbada0a7979094c6aaaa91f6584cdd5dbb59c606 | |
parent | 512be7140b2fa9c12ba905c27c7569c0b5c44257 (diff) |
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.
-rw-r--r-- | src/code/coerce.lisp | 16 | ||||
-rw-r--r-- | version.lisp-expr | 2 |
2 files changed, 10 insertions, 8 deletions
diff --git a/src/code/coerce.lisp b/src/code/coerce.lisp index 9bd1e2390..a4a93f0c4 100644 --- a/src/code/coerce.lisp +++ b/src/code/coerce.lisp @@ -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)))))) diff --git a/version.lisp-expr b/version.lisp-expr index a6f8f39fa..1bf4112dd 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -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" |