1.0.17.14: slightly better LIST*
authorNikodemus Siivola <nikodemus@random-state.net>
Sat, 31 May 2008 17:43:12 +0000 (17:43 +0000)
committerNikodemus Siivola <nikodemus@random-state.net>
Sat, 31 May 2008 17:43:12 +0000 (17:43 +0000)
 * Disable type-checks in full calls to LIST*, because we know the &REST
   list is a proper list.

 * Handle 1 argument case in the source-transform.

 * Add a derive-type optimizer, so we can figure out the common case
   when the return value is know to be a CONS.

src/code/list.lisp
src/compiler/srctran.lisp
version.lisp-expr

index 045e1de..d18d3a5 100644 (file)
 
 (defun list* (arg &rest others)
   #!+sb-doc
-  "Return a list of the arguments with last cons a dotted pair"
+  "Return a list of the arguments with last cons a dotted pair."
+  ;; We know the &REST is a proper list.
+  (declare (optimize (sb!c::type-check 0)))
   (cond ((atom others) arg)
         ((atom (cdr others)) (cons arg (car others)))
         (t (do ((x others (cdr x)))
index 37c3a73..5ae92be 100644 (file)
     (t (values nil t))))
 
 ;;; And similarly for LIST*.
-(define-source-transform list* (&rest args)
-  (case (length args)
-    (2 `(cons ,(first args) ,(second args)))
-    (t (values nil t))))
+(define-source-transform list* (arg &rest others)
+  (cond ((not others) arg)
+        ((not (cdr others)) `(cons ,arg ,(car others)))
+        (t (values nil t))))
+
+(defoptimizer (list* derive-type) ((arg &rest args))
+  (if args
+      (specifier-type 'cons)
+      (lvar-type arg)))
 
 ;;; Translate RPLACx to LET and SETF.
 (define-source-transform rplaca (x y)
index 7b01e17..c416aa7 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.17.13"
+"1.0.17.14"