summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Froyd <froydnj@cs.rice.edu>2009-04-23 13:28:55 +0000
committerNathan Froyd <froydnj@cs.rice.edu>2009-04-23 13:28:55 +0000
commit6de517974934588c8b5c6355e04bef11af9db3d0 (patch)
treecbada0a7979094c6aaaa91f6584cdd5dbb59c606
parent512be7140b2fa9c12ba905c27c7569c0b5c44257 (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.lisp16
-rw-r--r--version.lisp-expr2
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"