diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2011-06-18 08:57:22 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2011-06-18 08:57:22 -0700 |
commit | b4e50fa0d03ebc4a71f4d0057495ac2b8c391429 (patch) | |
tree | 3ef23b64fc951feb0f47157b89df88f6805ff738 /src/fns.c | |
parent | c0c1ee9f77d41298cd3b576fdf8b97e5d8d87e17 (diff) | |
download | emacs-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.c | 18 |
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 |