Port to hypothetical case where Qnil is nonzero

* alloc.c (allocate_pseudovector):
* callint.c (Fcall_interactively):
* coding.c (syms_of_coding):
* dispnew.c (realloc_glyph_pool):
* fringe.c (init_fringe):
* lisp.h (memsetnil):
* xdisp.c (init_iterator):
Port to the currently-hypothetical case where Qnil is nonzero.
* dispnew.c (adjust_glyph_matrix): Remove unnecessary verification,
as there are no Lisp_Object values in the data here.
* lisp.h (NIL_IS_NONZERO): New symbol, replacing NIL_IS_ZERO.
All uses changed.  Define only if not already defined, so that one
can debug with -DNIL_IS_NONZERO.
* xdisp.c (init_iterator): Remove unnecessary initializations to 0.
This commit is contained in:
Paul Eggert 2015-01-19 16:49:11 -08:00
parent fb6462f056
commit 347e014471
8 changed files with 68 additions and 47 deletions

View file

@ -1,3 +1,21 @@
2015-01-20 Paul Eggert <eggert@cs.ucla.edu>
Port to hypothetical case where Qnil is nonzero
* alloc.c (allocate_pseudovector):
* callint.c (Fcall_interactively):
* coding.c (syms_of_coding):
* dispnew.c (realloc_glyph_pool):
* fringe.c (init_fringe):
* lisp.h (memsetnil):
* xdisp.c (init_iterator):
Port to the currently-hypothetical case where Qnil is nonzero.
* dispnew.c (adjust_glyph_matrix): Remove unnecessary verification,
as there are no Lisp_Object values in the data here.
* lisp.h (NIL_IS_NONZERO): New symbol, replacing NIL_IS_ZERO.
All uses changed. Define only if not already defined, so that one
can debug with -DNIL_IS_NONZERO.
* xdisp.c (init_iterator): Remove unnecessary initializations to 0.
2015-01-19 Eli Zaretskii <eliz@gnu.org>
* dispnew.c (adjust_glyph_matrix, realloc_glyph_pool): Verify that

View file

@ -3175,9 +3175,10 @@ allocate_pseudovector (int memlen, int lisplen,
eassert (lisplen <= (1 << PSEUDOVECTOR_SIZE_BITS) - 1);
/* Only the first LISPLEN slots will be traced normally by the GC.
But since Qnil == 0, we can memset Lisp_Object slots as well. */
verify (NIL_IS_ZERO);
memset (v->contents, 0, zerolen * word_size);
If Qnil is nonzero, clear the non-Lisp data separately. */
memsetnil (v->contents, zerolen);
if (NIL_IS_NONZERO)
memset (v->contents + lisplen, 0, (zerolen - lisplen) * word_size);
XSETPVECTYPESIZE (v, tag, lisplen, memlen - lisplen);
return v;

View file

@ -509,8 +509,9 @@ 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));
if (NIL_IS_NONZERO)
memsetnil (args, nargs * 2);
GCPRO5 (prefix_arg, function, *args, *visargs, up_event);
gcpro3.nvars = nargs;

View file

@ -11272,8 +11272,8 @@ internal character representation. */);
Vtranslation_table_for_input = Qnil;
{
verify (NIL_IS_ZERO);
Lisp_Object args[coding_arg_undecided_max] = { LISP_INITIALLY_ZERO, };
Lisp_Object args[coding_arg_undecided_max];
memsetnil (args, ARRAYELTS (args));
Lisp_Object plist[16];
plist[0] = intern_c_string (":name");

View file

@ -418,7 +418,6 @@ adjust_glyph_matrix (struct window *w, struct glyph_matrix *matrix, int x, int y
relies on the object of special glyphs (truncation and
continuation glyps and also blanks used to extend each line
on a TTY) to be nil. */
verify (NIL_IS_ZERO);
memset (matrix->rows + old_alloc, 0,
(matrix->rows_allocated - old_alloc) * sizeof *matrix->rows);
}
@ -1345,14 +1344,15 @@ 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);
/* As a side effect, this sets the object of each glyph to nil,
so verify we will indeed get that. Redisplay relies on the
object of special glyphs (truncation and continuation glyps
and also blanks used to extend each line on a TTY) to be
nil. */
verify (NIL_IS_ZERO);
memset (pool->glyphs + old_nglyphs, 0,
(pool->nglyphs - old_nglyphs) * sizeof *pool->glyphs);
/* Set the object of each glyph to nil. Redisplay relies on
this for objects of special glyphs (truncation and continuation
glyphs and also blanks used to extend each line on a TTY). */
if (NIL_IS_NONZERO)
for (ptrdiff_t i = old_nglyphs; i < pool->nglyphs; i++)
pool->glyphs[i].object = Qnil;
}
/* Remember the number of rows and columns because (a) we use them

View file

@ -1727,8 +1727,9 @@ init_fringe (void)
fringe_bitmaps = xzalloc (max_fringe_bitmaps * sizeof *fringe_bitmaps);
verify (NIL_IS_ZERO);
fringe_faces = xzalloc (max_fringe_bitmaps * sizeof *fringe_faces);
if (NIL_IS_NONZERO)
memsetnil (fringe_faces, max_fringe_bitmaps);
}
#ifdef HAVE_NTGUI

View file

@ -1503,18 +1503,22 @@ gc_aset (Lisp_Object array, ptrdiff_t idx, Lisp_Object val)
XVECTOR (array)->contents[idx] = val;
}
/* True, since Qnil's representation is zero. Every place in the code
that assumes Qnil is zero should verify (NIL_IS_ZERO), to make it easy
to find such assumptions later if we change Qnil to be nonzero. */
enum { NIL_IS_ZERO = XLI_BUILTIN_LISPSYM (iQnil) == 0 };
/* True if Qnil's representation is nonzero. This is always false currently,
but there is fallback code for hypothetical alternative implementations.
Compile with -DNIL_IS_NONZERO to test the fallback code. */
#ifndef NIL_IS_NONZERO
enum { NIL_IS_NONZERO = XLI_BUILTIN_LISPSYM (iQnil) != 0 };
#endif
/* Set a Lisp_Object array V's SIZE entries to nil. */
/* Set a Lisp_Object array V's N entries to nil. */
INLINE void
memsetnil (Lisp_Object *v, ptrdiff_t size)
memsetnil (Lisp_Object *v, ptrdiff_t n)
{
eassert (0 <= size);
verify (NIL_IS_ZERO);
memset (v, 0, size * sizeof *v);
eassert (0 <= n);
memset (v, 0, n * sizeof *v);
if (NIL_IS_NONZERO)
for (ptrdiff_t i = 0; i < n; i++)
v[i] = Qnil;
}
/* If a struct is made to look like a vector, this macro returns the length

View file

@ -2747,19 +2747,22 @@ init_iterator (struct it *it, struct window *w,
}
/* Clear IT. */
/* As a side effect, this sets it->object to nil, so verify we will
indeed get that. */
verify (NIL_IS_ZERO);
memset (it, 0, sizeof *it);
if (NIL_IS_NONZERO)
{
it->string = Qnil;
it->from_overlay = Qnil;
it->slice.x = it->slice.y = it->slice.width = it->slice.height = Qnil;
it->space_width = Qnil;
it->font_height = Qnil;
it->object = Qnil;
it->bidi_it.string.lstring = Qnil;
}
it->current.overlay_string_index = -1;
it->current.dpvec_index = -1;
it->base_face_id = remapped_base_face_id;
it->string = Qnil;
IT_STRING_CHARPOS (*it) = IT_STRING_BYTEPOS (*it) = -1;
it->paragraph_embedding = L2R;
it->bidi_it.string.lstring = Qnil;
it->bidi_it.string.s = NULL;
it->bidi_it.string.bufpos = 0;
it->bidi_it.w = w;
/* The window in which we iterate over current_buffer: */
@ -2780,7 +2783,6 @@ init_iterator (struct it *it, struct window *w,
* FRAME_LINE_HEIGHT (it->f));
else if (it->f->extra_line_spacing > 0)
it->extra_line_spacing = it->f->extra_line_spacing;
it->max_extra_line_spacing = 0;
}
/* If realized faces have been removed, e.g. because of face
@ -2792,10 +2794,6 @@ init_iterator (struct it *it, struct window *w,
if (FRAME_FACE_CACHE (it->f)->used == 0)
recompute_basic_faces (it->f);
/* Current value of the `slice', `space-width', and 'height' properties. */
it->slice.x = it->slice.y = it->slice.width = it->slice.height = Qnil;
it->space_width = Qnil;
it->font_height = Qnil;
it->override_ascent = -1;
/* Are control characters displayed as `^C'? */
@ -2833,21 +2831,19 @@ init_iterator (struct it *it, struct window *w,
it->tab_width = SANE_TAB_WIDTH (current_buffer);
/* Are lines in the display truncated? */
if (base_face_id != DEFAULT_FACE_ID
|| it->w->hscroll
|| (! WINDOW_FULL_WIDTH_P (it->w)
&& ((!NILP (Vtruncate_partial_width_windows)
&& !INTEGERP (Vtruncate_partial_width_windows))
if (TRUNCATE != 0)
it->line_wrap = TRUNCATE;
if (base_face_id == DEFAULT_FACE_ID
&& !it->w->hscroll
&& (WINDOW_FULL_WIDTH_P (it->w)
|| NILP (Vtruncate_partial_width_windows)
|| (INTEGERP (Vtruncate_partial_width_windows)
/* PXW: Shall we do something about this? */
&& (WINDOW_TOTAL_COLS (it->w)
< XINT (Vtruncate_partial_width_windows))))))
it->line_wrap = TRUNCATE;
else if (NILP (BVAR (current_buffer, truncate_lines)))
&& (XINT (Vtruncate_partial_width_windows)
<= WINDOW_TOTAL_COLS (it->w))))
&& NILP (BVAR (current_buffer, truncate_lines)))
it->line_wrap = NILP (BVAR (current_buffer, word_wrap))
? WINDOW_WRAP : WORD_WRAP;
else
it->line_wrap = TRUNCATE;
/* Get dimensions of truncation and continuation glyphs. These are
displayed as fringe bitmaps under X, but we need them for such