changeset 5355:70b15ac66ee5

Correct a bug with circularity checking in #'mapcar*, #'map, etc. src/ChangeLog addition: 2011-02-10 Aidan Kehoe <kehoea@parhasard.net> * fns.c (shortest_length_among_sequences): This was buggy, it always errored if the last argument was circular, even if other arguments were non-circular. Correct that. tests/ChangeLog addition: 2011-02-10 Aidan Kehoe <kehoea@parhasard.net> * automated/lisp-tests.el: * automated/lisp-tests.el (mapcar*): If multiple SEQUENCE arguments are passed to #'mapcar*, and the last one is circular while the others aren't, make sure that #'mapcar* doesn't error.
author Aidan Kehoe <kehoea@parhasard.net>
date Thu, 10 Feb 2011 08:46:10 +0000
parents 22c4e67a2e69
children 5dd1ba5e0113
files src/ChangeLog src/fns.c tests/ChangeLog tests/automated/lisp-tests.el
diffstat 4 files changed, 22 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Wed Feb 09 20:15:50 2011 +0000
+++ b/src/ChangeLog	Thu Feb 10 08:46:10 2011 +0000
@@ -1,3 +1,9 @@
+2011-02-10  Aidan Kehoe  <kehoea@parhasard.net>
+
+	* fns.c (shortest_length_among_sequences):
+	This was buggy, it always errored if the last argument was
+	circular, even if other arguments were non-circular. Correct that.
+
 2011-02-09  Aidan Kehoe  <kehoea@parhasard.net>
 
 	* alloc.c (Facons):
--- a/src/fns.c	Wed Feb 09 20:15:50 2011 +0000
+++ b/src/fns.c	Thu Feb 10 08:46:10 2011 +0000
@@ -7145,7 +7145,7 @@
 static Elemcount
 shortest_length_among_sequences (int nsequences, Lisp_Object *sequences)
 {
-  Elemcount len = EMACS_INT_MAX;
+  Elemcount len = 1 + EMACS_INT_MAX;
   Lisp_Object length = Qnil;
   int i;
 
@@ -7167,7 +7167,7 @@
         }
     }
 
-  if (NILP (length))
+  if (len == 1 + EMACS_INT_MAX)
     {
       signal_circular_list_error (sequences[0]);
     }
--- a/tests/ChangeLog	Wed Feb 09 20:15:50 2011 +0000
+++ b/tests/ChangeLog	Thu Feb 10 08:46:10 2011 +0000
@@ -1,3 +1,11 @@
+2011-02-10  Aidan Kehoe  <kehoea@parhasard.net>
+
+	* automated/lisp-tests.el:
+	* automated/lisp-tests.el (mapcar*):
+	If multiple SEQUENCE arguments are passed to #'mapcar*, and the
+	last one is circular while the others aren't, make sure that
+	#'mapcar* doesn't error.
+
 2011-02-07  Aidan Kehoe  <kehoea@parhasard.net>
 
 	* automated/lisp-tests.el:
--- a/tests/automated/lisp-tests.el	Wed Feb 09 20:15:50 2011 +0000
+++ b/tests/automated/lisp-tests.el	Thu Feb 10 08:46:10 2011 +0000
@@ -1046,6 +1046,12 @@
       (car y))
     x)))
 
+(Assert
+ (equal
+  (let ((list (list pi))) (mapcar* #'cons [1 2 3 4] (nconc list list)))
+  `((1 . ,pi) (2 . ,pi) (3 . ,pi) (4 . ,pi)))
+ "checking mapcar* behaves correctly when only one arg is circular")
+
 (Assert (eql
  (length (multiple-value-list
           (car (mapcar #'(lambda (argument) (floor argument)) (list pi e)))))