Remove redundant checks for the empty overlay tree

* src/alloc.c (mark_buffer): Remove b->overlays check.
* src/buffer.c (copy_overlays): Also.
* src/buffer.c (swap_buffer_overlays, overlays_in): Also.
  (next_overlay_change, previous_overlay_change): Also.
  (overlay_touches_p, Foverlay_lists): Also.
  (evaporate_overlays): Also.
* src/xdisp.c (load_overlay_strings): Also.
This commit is contained in:
Andreas Politz 2017-10-09 08:22:43 +02:00
parent a38c38c052
commit 8869332684
3 changed files with 55 additions and 90 deletions

View file

@ -6306,15 +6306,11 @@ mark_buffer (struct buffer *buffer)
a special way just before the sweep phase, and after stripping
some of its elements that are not needed any more. */
if (buffer->overlays)
{
struct interval_node *node;
buffer_overlay_iter_start (buffer, PTRDIFF_MIN, PTRDIFF_MAX, ITREE_ASCENDING);
while ((node = buffer_overlay_iter_next (buffer)))
mark_overlay (XOVERLAY (node->data));
buffer_overlay_iter_finish (buffer);
}
struct interval_node *node;
buffer_overlay_iter_start (buffer, PTRDIFF_MIN, PTRDIFF_MAX, ITREE_ASCENDING);
while ((node = buffer_overlay_iter_next (buffer)))
mark_overlay (XOVERLAY (node->data));
buffer_overlay_iter_finish (buffer);
/* If this is an indirect buffer, mark its base buffer. */
if (buffer->base_buffer && !VECTOR_MARKED_P (buffer->base_buffer))

View file

@ -607,14 +607,9 @@ static void
copy_overlays (struct buffer *from, struct buffer *to)
{
eassert (to && ! to->overlays);
struct interval_node *node;
if (! from->overlays)
return;
buffer_overlay_iter_start (from, PTRDIFF_MIN, PTRDIFF_MAX, ITREE_ASCENDING);
while ((node = buffer_overlay_iter_next (from)))
{
Lisp_Object ov = node->data;
@ -2277,20 +2272,16 @@ swap_buffer_overlays (struct buffer *buffer, struct buffer *other)
{
struct interval_node *node;
if (buffer->overlays)
{
buffer_overlay_iter_start (buffer, PTRDIFF_MIN, PTRDIFF_MAX, ITREE_ASCENDING);
while ((node = buffer_overlay_iter_next (buffer)))
XOVERLAY (node->data)->buffer = other;
buffer_overlay_iter_finish (buffer);
}
if (other->overlays)
{
buffer_overlay_iter_start (other, PTRDIFF_MIN, PTRDIFF_MAX, ITREE_ASCENDING);
while ((node = buffer_overlay_iter_next (other)))
XOVERLAY (node->data)->buffer = buffer;
buffer_overlay_iter_finish (other);
}
buffer_overlay_iter_start (buffer, PTRDIFF_MIN, PTRDIFF_MAX, ITREE_ASCENDING);
while ((node = buffer_overlay_iter_next (buffer)))
XOVERLAY (node->data)->buffer = other;
buffer_overlay_iter_finish (buffer);
buffer_overlay_iter_start (other, PTRDIFF_MIN, PTRDIFF_MAX, ITREE_ASCENDING);
while ((node = buffer_overlay_iter_next (other)))
XOVERLAY (node->data)->buffer = buffer;
buffer_overlay_iter_finish (other);
/* Swap the interval trees. */
void *tmp = buffer->overlays;
buffer->overlays = other->overlays;
@ -2837,12 +2828,8 @@ overlays_in (ptrdiff_t beg, ptrdiff_t end, bool extend,
ptrdiff_t len = *len_ptr;
ptrdiff_t next = ZV;
Lisp_Object *vec = *vec_ptr;
struct interval_node *node;
if (! current_buffer->overlays)
return idx;
buffer_overlay_iter_start (current_buffer, beg,
/* Find empty OV at Z ? */
(end >= Z && empty) ? Z + 1 : ZV,
@ -2904,9 +2891,6 @@ next_overlay_change (ptrdiff_t pos)
ptrdiff_t next = ZV;
struct interval_node *node;
if (! current_buffer->overlays)
return next;
buffer_overlay_iter_start (current_buffer, pos, ZV, ITREE_ASCENDING);
while ((node = buffer_overlay_iter_next (current_buffer)))
{
@ -2935,9 +2919,6 @@ previous_overlay_change (ptrdiff_t pos)
struct interval_node *node;
ptrdiff_t prev = BEGV;
if (! current_buffer->overlays)
return prev;
buffer_overlay_iter_start (current_buffer, BEGV, pos, ITREE_DESCENDING);
while ((node = buffer_overlay_iter_next (current_buffer)))
{
@ -3023,9 +3004,6 @@ overlay_touches_p (ptrdiff_t pos)
struct interval_node *node;
bool result = false;
if (! current_buffer->overlays)
return false;
/* We need to find overlays ending in pos, as well as empty ones at
pos. */
buffer_overlay_iter_start (current_buffer,
@ -3729,16 +3707,13 @@ However, the overlays you get are the real objects that the buffer uses. */)
(void)
{
Lisp_Object overlays = Qnil;
struct interval_node *node;
if (current_buffer->overlays)
{
struct interval_node *node;
buffer_overlay_iter_start (current_buffer, BEG, Z, ITREE_DESCENDING);
while ((node = buffer_overlay_iter_next (current_buffer)))
overlays = Fcons (node->data, overlays);
buffer_overlay_iter_finish (current_buffer);
buffer_overlay_iter_start (current_buffer, BEG, Z, ITREE_DESCENDING);
while ((node = buffer_overlay_iter_next (current_buffer)))
overlays = Fcons (node->data, overlays);
buffer_overlay_iter_finish (current_buffer);
}
return Fcons (overlays, Qnil);
}
@ -3972,15 +3947,10 @@ call_overlay_mod_hooks (Lisp_Object list, Lisp_Object overlay, bool after,
void
evaporate_overlays (ptrdiff_t pos)
{
Lisp_Object hit_list;
Lisp_Object hit_list = Qnil;
struct interval_node *node;
if (! current_buffer->overlays)
return;
hit_list = Qnil;
buffer_overlay_iter_start (current_buffer, pos, pos, ITREE_ASCENDING);
while ((node = buffer_overlay_iter_next (current_buffer)))
{
if (node->end == pos
@ -3988,6 +3958,7 @@ evaporate_overlays (ptrdiff_t pos)
hit_list = Fcons (node->data, hit_list);
}
buffer_overlay_iter_finish (current_buffer);
for (; CONSP (hit_list); hit_list = XCDR (hit_list))
Fdelete_overlay (XCAR (hit_list));
}

View file

@ -5790,48 +5790,46 @@ load_overlay_strings (struct it *it, ptrdiff_t charpos)
} \
while (false)
if (current_buffer->overlays)
buffer_overlay_iter_start (current_buffer,
charpos - 1, charpos + 1, ITREE_DESCENDING);
/* Process overlays. */
while ((node = buffer_overlay_iter_next (current_buffer)))
{
buffer_overlay_iter_start (current_buffer,
charpos - 1, charpos + 1, ITREE_DESCENDING);
/* Process overlays. */
while ((node = buffer_overlay_iter_next (current_buffer)))
{
overlay = node->data;
eassert (OVERLAYP (overlay));
start = node->begin;
end = node->end;
overlay = node->data;
eassert (OVERLAYP (overlay));
start = node->begin;
end = node->end;
/* Skip this overlay if it doesn't start or end at IT's current
position. */
if (end != charpos && start != charpos)
continue;
/* Skip this overlay if it doesn't start or end at IT's current
position. */
if (end != charpos && start != charpos)
continue;
/* Skip this overlay if it doesn't apply to IT->w. */
window = Foverlay_get (overlay, Qwindow);
if (WINDOWP (window) && XWINDOW (window) != it->w)
continue;
/* Skip this overlay if it doesn't apply to IT->w. */
window = Foverlay_get (overlay, Qwindow);
if (WINDOWP (window) && XWINDOW (window) != it->w)
continue;
/* If the text ``under'' the overlay is invisible, both before-
and after-strings from this overlay are visible; start and
end position are indistinguishable. */
invisible = Foverlay_get (overlay, Qinvisible);
invis = TEXT_PROP_MEANS_INVISIBLE (invisible);
/* If the text ``under'' the overlay is invisible, both before-
and after-strings from this overlay are visible; start and
end position are indistinguishable. */
invisible = Foverlay_get (overlay, Qinvisible);
invis = TEXT_PROP_MEANS_INVISIBLE (invisible);
/* If overlay has a non-empty before-string, record it. */
if ((start == charpos || (end == charpos && invis != 0))
&& (str = Foverlay_get (overlay, Qbefore_string), STRINGP (str))
&& SCHARS (str))
RECORD_OVERLAY_STRING (overlay, str, false);
/* If overlay has a non-empty before-string, record it. */
if ((start == charpos || (end == charpos && invis != 0))
&& (str = Foverlay_get (overlay, Qbefore_string), STRINGP (str))
&& SCHARS (str))
RECORD_OVERLAY_STRING (overlay, str, false);
/* If overlay has a non-empty after-string, record it. */
if ((end == charpos || (start == charpos && invis != 0))
&& (str = Foverlay_get (overlay, Qafter_string), STRINGP (str))
&& SCHARS (str))
RECORD_OVERLAY_STRING (overlay, str, true);
}
buffer_overlay_iter_finish (current_buffer);
/* If overlay has a non-empty after-string, record it. */
if ((end == charpos || (start == charpos && invis != 0))
&& (str = Foverlay_get (overlay, Qafter_string), STRINGP (str))
&& SCHARS (str))
RECORD_OVERLAY_STRING (overlay, str, true);
}
buffer_overlay_iter_finish (current_buffer);
#undef RECORD_OVERLAY_STRING