[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] master 74244d2: Better isolate code that assumes NIL_IS_ZE
From: |
Paul Eggert |
Subject: |
[Emacs-diffs] master 74244d2: Better isolate code that assumes NIL_IS_ZERO |
Date: |
Thu, 22 Jan 2015 04:03:59 +0000 |
branch: master
commit 74244d239e9093035c369721b469529a5fdaf1c6
Author: Paul Eggert <address@hidden>
Commit: Paul Eggert <address@hidden>
Better isolate code that assumes NIL_IS_ZERO
Suggested by Stefan Monnier in:
http://lists.gnu.org/archive/html/emacs-devel/2015-01/msg00588.html
* alloc.c (allocate_pseudovector):
Use memclear, not memsetnil, to remove a 'verify'.
* callint.c (Fcall_interactively):
* dispnew.c (realloc_glyph_pool):
* xdisp.c (init_iterator):
Use memclear, not memset, to remove a 'verify'.
* lisp.h (memclear): Rename from memsetnil, and take a byte
count rather than a word count. All callers changed.
---
src/ChangeLog | 14 ++++++++++++++
src/alloc.c | 7 ++-----
src/callint.c | 3 +--
src/coding.c | 2 +-
src/dispnew.c | 10 ++--------
src/eval.c | 7 ++++---
src/fns.c | 4 ++--
src/font.c | 4 ++--
src/lisp.h | 10 ++++++----
src/xdisp.c | 8 +-------
10 files changed, 35 insertions(+), 34 deletions(-)
diff --git a/src/ChangeLog b/src/ChangeLog
index e5e4fe9..4c5b2a1 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,17 @@
+2015-01-22 Paul Eggert <address@hidden>
+
+ Isolate NIL_IS_ZERO-assuming code better
+ Suggested by Stefan Monnier in:
+ http://lists.gnu.org/archive/html/emacs-devel/2015-01/msg00588.html
+ * alloc.c (allocate_pseudovector):
+ Use memclear, not memsetnil, to remove a 'verify'.
+ * callint.c (Fcall_interactively):
+ * dispnew.c (realloc_glyph_pool):
+ * xdisp.c (init_iterator):
+ Use memclear, not memset, to remove a 'verify'.
+ * lisp.h (memclear): Rename from memsetnil, and take a byte
+ count rather than a word count. All callers changed.
+
2015-01-20 Paul Eggert <address@hidden>
Undo port to hypothetical nonzero Qnil case
diff --git a/src/alloc.c b/src/alloc.c
index bf0456c..571b2b0 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -3174,11 +3174,8 @@ allocate_pseudovector (int memlen, int lisplen,
eassert (memlen - lisplen <= (1 << PSEUDOVECTOR_REST_BITS) - 1);
eassert (lisplen <= (1 << PSEUDOVECTOR_SIZE_BITS) - 1);
- /* Only the first LISPLEN slots will be traced normally by the GC.
- Since Qnil == 0, we can memset Lisp and non-Lisp data at one go. */
- verify (NIL_IS_ZERO);
- memsetnil (v->contents, zerolen);
-
+ /* Only the first LISPLEN slots will be traced normally by the GC. */
+ memclear (v->contents, zerolen * word_size);
XSETPVECTYPESIZE (v, tag, lisplen, memlen - lisplen);
return v;
}
diff --git a/src/callint.c b/src/callint.c
index 3a595b5..165d374 100644
--- a/src/callint.c
+++ b/src/callint.c
@@ -509,8 +509,7 @@ invoke it. If KEYS is omitted or nil, the return value of
visargs = args + nargs;
varies = (signed char *) (visargs + nargs);
- verify (NIL_IS_ZERO);
- memset (args, 0, nargs * (2 * word_size + 1));
+ memclear (args, nargs * (2 * word_size + 1));
GCPRO5 (prefix_arg, function, *args, *visargs, up_event);
gcpro3.nvars = nargs;
diff --git a/src/coding.c b/src/coding.c
index b95c0a5..43ebbe0 100644
--- a/src/coding.c
+++ b/src/coding.c
@@ -11273,7 +11273,7 @@ internal character representation. */);
{
Lisp_Object args[coding_arg_undecided_max];
- memsetnil (args, ARRAYELTS (args));
+ memclear (args, sizeof args);
Lisp_Object plist[16];
plist[0] = intern_c_string (":name");
diff --git a/src/dispnew.c b/src/dispnew.c
index 9af0ae5..3c8117e 100644
--- a/src/dispnew.c
+++ b/src/dispnew.c
@@ -1339,14 +1339,8 @@ realloc_glyph_pool (struct glyph_pool *pool, struct dim
matrix_dim)
ptrdiff_t old_nglyphs = pool->nglyphs;
pool->glyphs = xpalloc (pool->glyphs, &pool->nglyphs,
needed - old_nglyphs, -1, sizeof *pool->glyphs);
-
- /* Redisplay relies on nil as the object of special glyphs
- (truncation and continuation glyphs and also blanks used to
- extend each line on a TTY), so verify that memset does this. */
- verify (NIL_IS_ZERO);
-
- memset (pool->glyphs + old_nglyphs, 0,
- (pool->nglyphs - old_nglyphs) * sizeof *pool->glyphs);
+ memclear (pool->glyphs + old_nglyphs,
+ (pool->nglyphs - old_nglyphs) * sizeof *pool->glyphs);
}
/* Remember the number of rows and columns because (a) we use them
diff --git a/src/eval.c b/src/eval.c
index ddf6535..e649c15 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -2299,7 +2299,8 @@ usage: (apply FUNCTION &rest ARGUMENTS) */)
/* Avoid making funcall cons up a yet another new vector of arguments
by explicitly supplying nil's for optional values. */
SAFE_ALLOCA_LISP (funcall_args, 1 + XSUBR (fun)->max_args);
- memsetnil (funcall_args + numargs + 1, XSUBR (fun)->max_args - numargs);
+ memclear (funcall_args + numargs + 1,
+ (XSUBR (fun)->max_args - numargs) * word_size);
funcall_nargs = 1 + XSUBR (fun)->max_args;
}
else
@@ -2693,8 +2694,8 @@ usage: (funcall FUNCTION &rest ARGUMENTS) */)
eassert (XSUBR (fun)->max_args <= ARRAYELTS (internal_argbuf));
internal_args = internal_argbuf;
memcpy (internal_args, args + 1, numargs * word_size);
- memsetnil (internal_args + numargs,
- XSUBR (fun)->max_args - numargs);
+ memclear (internal_args + numargs,
+ (XSUBR (fun)->max_args - numargs) * word_size);
}
else
internal_args = args + 1;
diff --git a/src/fns.c b/src/fns.c
index d177294..a4b2e6d 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -2524,7 +2524,7 @@ mapcar1 (EMACS_INT leni, Lisp_Object *vals, Lisp_Object
fn, Lisp_Object seq)
if (vals)
{
/* Don't let vals contain any garbage when GC happens. */
- memsetnil (vals, leni);
+ memclear (vals, leni * word_size);
GCPRO3 (dummy, fn, seq);
gcpro1.var = vals;
@@ -3700,7 +3700,7 @@ larger_vector (Lisp_Object vec, ptrdiff_t incr_min,
ptrdiff_t nitems_max)
new_size = old_size + incr;
v = allocate_vector (new_size);
memcpy (v->contents, XVECTOR (vec)->contents, old_size * sizeof
*v->contents);
- memsetnil (v->contents + old_size, new_size - old_size);
+ memclear (v->contents + old_size, incr * word_size);
XSETVECTOR (vec, v);
return vec;
}
diff --git a/src/font.c b/src/font.c
index 190b33a..d05742c 100644
--- a/src/font.c
+++ b/src/font.c
@@ -989,14 +989,14 @@ font_expand_wildcards (Lisp_Object *field, int n)
if (i == 0 || ! NILP (tmp[i - 1]))
/* None of TMP[X] corresponds to Jth field. */
return -1;
- memsetnil (field + j, range[i].from - j);
+ memclear (field + j, (range[i].from - j) * word_size);
j = range[i].from;
}
field[j++] = tmp[i];
}
if (! NILP (tmp[n - 1]) && j < XLFD_REGISTRY_INDEX)
return -1;
- memsetnil (field + j, XLFD_LAST_INDEX - j);
+ memclear (field + j, (XLFD_LAST_INDEX - j) * word_size);
if (INTEGERP (field[XLFD_ENCODING_INDEX]))
field[XLFD_ENCODING_INDEX]
= Fintern (Fnumber_to_string (field[XLFD_ENCODING_INDEX]), Qnil);
diff --git a/src/lisp.h b/src/lisp.h
index 8967d6e..44117fc 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -1508,13 +1508,15 @@ gc_aset (Lisp_Object array, ptrdiff_t idx, Lisp_Object
val)
to find such assumptions later if we change Qnil to be nonzero. */
enum { NIL_IS_ZERO = XLI_BUILTIN_LISPSYM (iQnil) == 0 };
-/* Set a Lisp_Object array V's N entries to nil. */
+/* Clear the object addressed by P, with size NBYTES, so that all its
+ bytes are zero and all its Lisp values are nil. */
INLINE void
-memsetnil (Lisp_Object *v, ptrdiff_t n)
+memclear (void *p, ptrdiff_t nbytes)
{
- eassert (0 <= n);
+ eassert (0 <= nbytes);
verify (NIL_IS_ZERO);
- memset (v, 0, n * sizeof *v);
+ /* Since Qnil is zero, memset suffices. */
+ memset (p, 0, nbytes);
}
/* If a struct is made to look like a vector, this macro returns the length
diff --git a/src/xdisp.c b/src/xdisp.c
index 9611952..bdfea1e 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -2746,13 +2746,7 @@ init_iterator (struct it *it, struct window *w,
row = MATRIX_HEADER_LINE_ROW (w->desired_matrix);
}
- /* Clear IT. */
-
- /* The code assumes it->object and other Lisp_Object components are
- set to nil, so verify that memset does this. */
- verify (NIL_IS_ZERO);
- memset (it, 0, sizeof *it);
-
+ memclear (it, sizeof *it);
it->current.overlay_string_index = -1;
it->current.dpvec_index = -1;
it->base_face_id = remapped_base_face_id;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] master 74244d2: Better isolate code that assumes NIL_IS_ZERO,
Paul Eggert <=