]> git.eshelyaron.com Git - emacs.git/commitdiff
* fns.c (Ffillarray): Don't assume bool vector size fits in 'int'.
authorPaul Eggert <eggert@cs.ucla.edu>
Sat, 18 Jun 2011 15:57:22 +0000 (08:57 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Sat, 18 Jun 2011 15:57:22 +0000 (08:57 -0700)
src/ChangeLog
src/fns.c

index 80626bc0c2ae6e45e37f6e56fb423509f535047d..c47a6402e8128b9517ab86a7c9fa2e760e93c2a2 100644 (file)
@@ -1,5 +1,7 @@
 2011-06-18  Paul Eggert  <eggert@cs.ucla.edu>
 
+       * fns.c (Ffillarray): Don't assume bool vector size fits in 'int'.
+
        * alloc.c (Fmake_bool_vector): Avoid unnecessary multiplication.
 
        * fns.c (concat): Catch string overflow earlier.
index 4c1505ab0f12b94cad973b80778d8a56c88fa8bc..7b303ff3836be6c3d782b019132c4c107569c231 100644 (file)
--- a/src/fns.c
+++ b/src/fns.c
@@ -2188,19 +2188,17 @@ ARRAY is a vector, string, char-table, or bool-vector.  */)
   else if (BOOL_VECTOR_P (array))
     {
       register unsigned char *p = XBOOL_VECTOR (array)->data;
-      int size_in_chars
-       = ((XBOOL_VECTOR (array)->size + BOOL_VECTOR_BITS_PER_CHAR - 1)
+      EMACS_INT size = XBOOL_VECTOR (array)->size;
+      EMACS_INT size_in_chars
+       = ((size + BOOL_VECTOR_BITS_PER_CHAR - 1)
           / BOOL_VECTOR_BITS_PER_CHAR);
 
-      charval = (! NILP (item) ? -1 : 0);
-      for (idx = 0; idx < size_in_chars - 1; idx++)
-       p[idx] = charval;
-      if (idx < size_in_chars)
+      if (size_in_chars)
        {
-         /* Mask out bits beyond the vector size.  */
-         if (XBOOL_VECTOR (array)->size % BOOL_VECTOR_BITS_PER_CHAR)
-           charval &= (1 << (XBOOL_VECTOR (array)->size % BOOL_VECTOR_BITS_PER_CHAR)) - 1;
-         p[idx] = charval;
+         memset (p, ! NILP (item) ? -1 : 0, size_in_chars);
+
+         /* Clear any extraneous bits in the last byte.  */
+         p[size_in_chars - 1] &= (1 << (size % BOOL_VECTOR_BITS_PER_CHAR)) - 1;
        }
     }
   else