]> code.delx.au - gnu-emacs/commitdiff
(internal_equal) <case Lisp_Vectorlike>: Declare size as
authorAndreas Schwab <schwab@suse.de>
Tue, 25 Nov 2003 12:22:08 +0000 (12:22 +0000)
committerAndreas Schwab <schwab@suse.de>
Tue, 25 Nov 2003 12:22:08 +0000 (12:22 +0000)
EMACS_INT to not lose bits.
(Ffillarray): Don't set bits beyond the size of a bool vector.

src/ChangeLog
src/fns.c

index 95b5f247e4d3b07153cd352c98e05fac18bef200..605ed62bc3f52b906f4723e7e00019f4d583052c 100644 (file)
@@ -1,3 +1,9 @@
+2003-11-25  Andreas Schwab  <schwab@suse.de>
+
+       * fns.c (internal_equal) <case Lisp_Vectorlike>: Declare size as
+       EMACS_INT to not lose bits.
+       (Ffillarray): Don't set bits beyond the size of a bool vector.
+
 2003-11-25  Kim F. Storm  <storm@cua.dk>
 
        * print.c (Fredirect_debugging_output) [!GNU_LINUX]: Do not
index 5d7111a69a4ad8374d7d4fc3e73500d2d54755d0..18bf8d62a8bf9bce187be2bd736e4a708bc5233c 100644 (file)
--- a/src/fns.c
+++ b/src/fns.c
@@ -2192,8 +2192,8 @@ internal_equal (o1, o2, depth)
 
     case Lisp_Vectorlike:
       {
-       register int i, size;
-       size = XVECTOR (o1)->size;
+       register int i;
+       EMACS_INT size = XVECTOR (o1)->size;
        /* Pseudovectors have the type encoded in the size field, so this test
           actually checks that the objects have the same type as well as the
           same size.  */
@@ -2315,8 +2315,15 @@ ARRAY is a vector, string, char-table, or bool-vector.  */)
        = (XBOOL_VECTOR (array)->size + BITS_PER_CHAR - 1) / BITS_PER_CHAR;
 
       charval = (! NILP (item) ? -1 : 0);
-      for (index = 0; index < size_in_chars; index++)
+      for (index = 0; index < size_in_chars - 1; index++)
        p[index] = charval;
+      if (index < size_in_chars)
+       {
+         /* Mask out bits beyond the vector size.  */
+         if (XBOOL_VECTOR (array)->size % BITS_PER_CHAR)
+           charval &= (1 << (XBOOL_VECTOR (array)->size % BITS_PER_CHAR)) - 1;
+         p[index] = charval;
+       }
     }
   else
     {