Commit 7b7ae965 authored by Dmitry Antipov's avatar Dmitry Antipov

* buffer.c (unchain_overlay): Simplify. Add comment.

* marker.c (unchain_marker): Simplify.  Fix comments.
parent a358bac2
2012-07-06 Dmitry Antipov <dmantipov@yandex.ru>
* buffer.c (unchain_overlay): Simplify. Add comment.
* marker.c (unchain_marker): Simplify. Fix comments.
2012-07-06 Dmitry Antipov <dmantipov@yandex.ru>
Introduce fast path for the widely used marker operation.
......
......@@ -3672,18 +3672,17 @@ modify_overlay (struct buffer *buf, ptrdiff_t start, ptrdiff_t end)
++BUF_OVERLAY_MODIFF (buf);
}
/* Remove OVERLAY from LIST. */
static struct Lisp_Overlay *
unchain_overlay (struct Lisp_Overlay *list, struct Lisp_Overlay *overlay)
{
struct Lisp_Overlay *tmp, *prev;
for (tmp = list, prev = NULL; tmp; prev = tmp, tmp = tmp->next)
if (tmp == overlay)
register struct Lisp_Overlay *tail, **prev = &list;
for (tail = list; tail; prev = &tail->next, tail = *prev)
if (tail == overlay)
{
if (prev)
prev->next = tmp->next;
else
list = tmp->next;
*prev = overlay->next;
overlay->next = NULL;
break;
}
......
......@@ -672,59 +672,47 @@ set_marker_restricted_both (Lisp_Object marker, Lisp_Object buffer, ptrdiff_t ch
return marker;
}
/* Remove MARKER from the chain of whatever buffer it is in.
Leave it "in no buffer".
This is called during garbage collection,
so we must be careful to ignore and preserve mark bits,
including those in chain fields of markers. */
/* Remove MARKER from the chain of whatever buffer it is in,
leaving it points to nowhere. This is called during garbage
collection, so we must be careful to ignore and preserve
mark bits, including those in chain fields of markers. */
void
unchain_marker (register struct Lisp_Marker *marker)
{
register struct Lisp_Marker *tail, *prev, *next;
register struct buffer *b;
b = marker->buffer;
if (b == 0)
return;
if (EQ (BVAR (b, name), Qnil))
abort ();
register struct buffer *b = marker->buffer;
marker->buffer = 0;
tail = BUF_MARKERS (b);
prev = NULL;
while (tail)
if (b)
{
next = tail->next;
if (marker == tail)
{
if (!prev)
{
BUF_MARKERS (b) = next;
/* Deleting first marker from the buffer's chain. Crash
if new first marker in chain does not say it belongs
to the same buffer, or at least that they have the same
base buffer. */
if (next && b->text != next->buffer->text)
abort ();
}
else
prev->next = next;
/* We have removed the marker from the chain;
no need to scan the rest of the chain. */
return;
}
else
prev = tail;
tail = next;
register struct Lisp_Marker *tail, **prev;
/* No dead buffers here. */
eassert (!NILP (BVAR (b, name)));
marker->buffer = NULL;
prev = &BUF_MARKERS (b);
for (tail = BUF_MARKERS (b); tail; prev = &tail->next, tail = *prev)
if (marker == tail)
{
if (*prev == BUF_MARKERS (b))
{
/* Deleting first marker from the buffer's chain. Crash
if new first marker in chain does not say it belongs
to the same buffer, or at least that they have the same
base buffer. */
if (tail->next && b->text != tail->next->buffer->text)
abort ();
}
*prev = tail->next;
/* We have removed the marker from the chain;
no need to scan the rest of the chain. */
break;
}
/* Error if marker was not in it's chain. */
eassert (tail != NULL);
}
/* Marker was not in its chain. */
abort ();
}
/* Return the char position of marker MARKER, as a C integer. */
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment