changeset 5329:7b391d07b334

Tweak a few compiler macros for functions in cl-seq.el. lisp/ChangeLog addition: 2011-01-02 Aidan Kehoe <kehoea@parhasard.net> * cl-macs.el (define-star-compiler-macros): Make sure the form has ITEM and LIST specified before attempting to change to calls with explicit tests; necessary for some tests in lisp-tests.el to compile correctly. (stable-union, stable-intersection): Add compiler macros for these functions, in the same way we do for most of the other functions in cl-seq.el. tests/ChangeLog addition: 2011-01-02 Aidan Kehoe <kehoea@parhasard.net> * automated/lisp-tests.el (test-fun): Test member*, assoc*, rassoc*, delete* here too.
author Aidan Kehoe <kehoea@parhasard.net>
date Sun, 02 Jan 2011 16:18:26 +0000
parents dae3d95cf319
children fbafdc1bb4d2
files lisp/ChangeLog lisp/cl-macs.el tests/ChangeLog tests/automated/lisp-tests.el
diffstat 4 files changed, 76 insertions(+), 49 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Sun Jan 02 02:32:59 2011 +0000
+++ b/lisp/ChangeLog	Sun Jan 02 16:18:26 2011 +0000
@@ -1,3 +1,13 @@
+2011-01-02  Aidan Kehoe  <kehoea@parhasard.net>
+
+	* cl-macs.el (define-star-compiler-macros):
+	Make sure the form has ITEM and LIST specified before attempting
+	to change to calls with explicit tests; necessary for some tests
+	in lisp-tests.el to compile correctly.
+	(stable-union, stable-intersection): Add compiler macros for these
+	functions, in the same way we do for most of the other functions
+	in cl-seq.el.
+
 2011-01-01  Aidan Kehoe  <kehoea@parhasard.net>
 
 	* cl-macs.el (dolist, dotimes, do-symbols, macrolet)
--- a/lisp/cl-macs.el	Sun Jan 02 02:32:59 2011 +0000
+++ b/lisp/cl-macs.el	Sun Jan 02 16:18:26 2011 +0000
@@ -3283,51 +3283,53 @@
 	(mapcar
 	 (function*
 	  (lambda ((star-function eq-function equal-function))
-	    `(define-compiler-macro ,star-function (&whole form item list
-						    &rest keys)
-	      (condition-case nil
-		  (symbol-macrolet ((not-constant '#:not-constant))
-		    (let* ((test-expr (plist-get keys :test ''eql))
-			   (test (cl-const-expr-val test-expr not-constant))
-			   (item-val (cl-const-expr-val item not-constant))
-			   (list-val (cl-const-expr-val list not-constant)))
-		      (if (and keys
-			       (not (and (eq :test (car keys))
-					 (eql 2 (length keys)))))
-			  form
-			(cond ((eq test 'eq) `(,',eq-function ,item ,list))
-			      ((eq test 'equal)
-			       `(,',equal-function ,item ,list))
-			      ((and (eq test 'eql)
-				    (not (eq not-constant item-val)))
-			       (if (cl-non-fixnum-number-p item-val)
-				   `(,',equal-function ,item ,list)
-				 `(,',eq-function ,item ,list)))
-			      ((and (eq test 'eql) (not (eq not-constant
-							    list-val)))
-			       (if (some 'cl-non-fixnum-number-p list-val)
-				   `(,',equal-function ,item ,list)
-				 ;; This compiler macro used to limit calls
-				 ;; to ,,eq-function to lists where all
-				 ;; elements were either fixnums or
-				 ;; symbols. There's no
-				 ;; reason to do this.
-				 `(,',eq-function ,item ,list)))
-			      ;; This is a hilariously specific case; see
-			      ;; add-to-list in subr.el.
-			      ((and (eq test not-constant)
-				    (eq 'or (car-safe test-expr))
-				    (eql 3 (length test-expr))
-				    (every #'cl-safe-expr-p (cdr form))
-				    `(if ,(second test-expr)
-					 (,',star-function ,item ,list :test
-							   ,(second test-expr))
-				      (,',star-function
-				       ,item ,list :test ,(third test-expr)))))
-			      (t form)))))
-		;; No need to warn about a malformed property list,
-		;; #'byte-compile-normal-call will do that for us.
-		(malformed-property-list form)))))
+	    `(define-compiler-macro ,star-function (&whole form &rest keys)
+              (if (< (length form) 3)
+                  form
+                (condition-case nil
+                    (symbol-macrolet ((not-constant '#:not-constant))
+                      (let* ((item (pop keys))
+                             (list (pop keys))
+                             (test-expr (plist-get keys :test ''eql))
+                             (test (cl-const-expr-val test-expr not-constant))
+                             (item-val (cl-const-expr-val item not-constant))
+                             (list-val (cl-const-expr-val list not-constant)))
+                        (if (and keys (not (and (eq :test (car keys))
+                                                (eql 2 (length keys)))))
+                            form
+                          (cond ((eq test 'eq) `(,',eq-function ,item ,list))
+                                ((eq test 'equal)
+                                 `(,',equal-function ,item ,list))
+                                ((and (eq test 'eql)
+                                      (not (eq not-constant item-val)))
+                                 (if (cl-non-fixnum-number-p item-val)
+                                     `(,',equal-function ,item ,list)
+                                   `(,',eq-function ,item ,list)))
+                                ((and (eq test 'eql) (not (eq not-constant
+                                                              list-val)))
+                                 (if (some 'cl-non-fixnum-number-p list-val)
+                                     `(,',equal-function ,item ,list)
+                                   ;; This compiler macro used to limit
+                                   ;; calls to ,,eq-function to lists where
+                                   ;; all elements were either fixnums or
+                                   ;; symbols. There's no reason to do this.
+                                   `(,',eq-function ,item ,list)))
+                                ;; This is a hilariously specific case; see
+                                ;; add-to-list in subr.el.
+                                ((and (eq test not-constant)
+                                      (eq 'or (car-safe test-expr))
+                                      (eql 3 (length test-expr))
+                                      (every #'cl-safe-expr-p (cdr form))
+                                      `(if ,(second test-expr)
+                                        (,',star-function ,item ,list :test
+                                                          ,(second test-expr))
+                                        (,',star-function
+                                         ,item ,list :test
+                                         ,(third test-expr)))))
+                                (t form)))))
+                  ;; No need to warn about a malformed property list,
+                  ;; #'byte-compile-normal-call will do that for us.
+                  (malformed-property-list form))))))
 	 macros))))
   (define-star-compiler-macros
     (member* memq member)
@@ -3736,6 +3738,16 @@
 	(the string ,string) :test #'eq)
     form))
 
+(define-compiler-macro stable-union (&whole form &rest cl-keys)
+  (if (> (length form) 2)
+      (list* 'union (pop cl-keys) (pop cl-keys) :stable t cl-keys)
+    form))
+
+(define-compiler-macro stable-intersection (&whole form &rest cl-keys)
+  (if (> (length form) 2)
+      (list* 'intersection (pop cl-keys) (pop cl-keys) :stable t cl-keys)
+    form))
+
 (map nil
      #'(lambda (function)
          ;; There are byte codes for the two-argument versions of these
--- a/tests/ChangeLog	Sun Jan 02 02:32:59 2011 +0000
+++ b/tests/ChangeLog	Sun Jan 02 16:18:26 2011 +0000
@@ -1,3 +1,8 @@
+2011-01-02  Aidan Kehoe  <kehoea@parhasard.net>
+
+	* automated/lisp-tests.el (test-fun): Test member*, assoc*,
+	rassoc*, delete* here too.
+
 2010-12-30  Aidan Kehoe  <kehoea@parhasard.net>
 
 	* automated/lisp-tests.el (wrong-type-argument): Add a missing
--- a/tests/automated/lisp-tests.el	Sun Jan 02 02:32:59 2011 +0000
+++ b/tests/automated/lisp-tests.el	Sun Jan 02 16:18:26 2011 +0000
@@ -798,12 +798,12 @@
 	     collect `(Check-Error circular-list (,fun 1 (make-circular-list ,n))))))
      (test-funs (&rest funs) `(progn ,@(loop for fun in funs collect `(test-fun ,fun)))))
 
-  (test-funs member old-member
+  (test-funs member* member old-member 
 	     memq   old-memq
-	     assoc  old-assoc
-	     rassoc old-rassoc
+	     assoc* assoc  old-assoc
+	     rassoc* rassoc old-rassoc
 	     rassq  old-rassq
-	     delete old-delete
+	     delete* delete old-delete
 	     delq   old-delq
 	     remassoc remassq remrassoc remrassq))