summaryrefslogtreecommitdiff
path: root/src/fns.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2011-06-18 08:57:22 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2011-06-18 08:57:22 -0700
commitb4e50fa0d03ebc4a71f4d0057495ac2b8c391429 (patch)
tree3ef23b64fc951feb0f47157b89df88f6805ff738 /src/fns.c
parentc0c1ee9f77d41298cd3b576fdf8b97e5d8d87e17 (diff)
downloademacs-b4e50fa0d03ebc4a71f4d0057495ac2b8c391429.tar.gz
emacs-b4e50fa0d03ebc4a71f4d0057495ac2b8c391429.tar.bz2
emacs-b4e50fa0d03ebc4a71f4d0057495ac2b8c391429.zip
* fns.c (Ffillarray): Don't assume bool vector size fits in 'int'.
Diffstat (limited to 'src/fns.c')
-rw-r--r--src/fns.c18
1 files changed, 8 insertions, 10 deletions
diff --git a/src/fns.c b/src/fns.c
index 4c1505ab0f1..7b303ff3836 100644
--- 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