From 7b7ae96547e53a8ba059186fd0b3fd583e8d41cd Mon Sep 17 00:00:00 2001 From: Dmitry Antipov Date: Fri, 6 Jul 2012 11:34:37 +0400 Subject: [PATCH] * buffer.c (unchain_overlay): Simplify. Add comment. * marker.c (unchain_marker): Simplify. Fix comments. --- src/ChangeLog | 5 ++++ src/buffer.c | 15 +++++----- src/marker.c | 80 ++++++++++++++++++++++----------------------------- 3 files changed, 46 insertions(+), 54 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 460bdaa198c..72355fc682f 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2012-07-06 Dmitry Antipov + + * buffer.c (unchain_overlay): Simplify. Add comment. + * marker.c (unchain_marker): Simplify. Fix comments. + 2012-07-06 Dmitry Antipov Introduce fast path for the widely used marker operation. diff --git a/src/buffer.c b/src/buffer.c index a37a61c0fc8..a40270c945c 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -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; } diff --git a/src/marker.c b/src/marker.c index 3b0adc7de8d..0a1dd41b498 100644 --- a/src/marker.c +++ b/src/marker.c @@ -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. */ -- 2.39.2