From 389a94a53dfc947c5dc9964b5617e0098513bbe0 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Thu, 11 Oct 2012 16:32:11 -0400 Subject: [PATCH] * src/buffer.c (Fkill_buffer): Null out the overlay list(s) as well. --- src/ChangeLog | 2 ++ src/buffer.c | 31 ++++++++++++++++++++----------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 839e7e52e00..6b9af293112 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,7 @@ 2012-10-11 Stefan Monnier + * buffer.c (Fkill_buffer): Null out the overlay list(s) as well. + * eval.c (Fautoload): Remember previous autoload status in load-history. 2012-10-11 Paul Eggert diff --git a/src/buffer.c b/src/buffer.c index 425d05ca790..9564e91c10c 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -897,6 +897,8 @@ delete_all_overlays (struct buffer *b) { struct Lisp_Overlay *ov, *next; + /* FIXME: Since each drop_overlay will scan BUF_MARKERS to unlink its + markers, we have an unneeded O(N^2) behavior here. */ for (ov = b->overlays_before; ov; ov = next) { drop_overlay (b, ov); @@ -1886,16 +1888,19 @@ cleaning up all windows currently displaying the buffer to be killed. */) if (b->base_buffer) { - /* Unchain all markers that belong to this indirect buffer. - Don't unchain the markers that belong to the base buffer - or its other indirect buffers. */ - for (m = BUF_MARKERS (b); m; ) - { - struct Lisp_Marker *next = m->next; - if (m->buffer == b) - unchain_marker (m); - m = next; - } + { /* Unchain all markers that belong to this indirect buffer. + Don't unchain the markers that belong to the base buffer + or its other indirect buffers. */ + struct Lisp_Marker **mp; + for (mp = &BUF_MARKERS (b); *mp; ) + { + struct Lisp_Marker *m = *mp; + if (m->buffer == b) + *mp = m->next; + else + mp = &m->next; + } + } } else { @@ -1911,8 +1916,12 @@ cleaning up all windows currently displaying the buffer to be killed. */) BUF_MARKERS (b) = NULL; set_buffer_intervals (b, NULL); - /* Perhaps we should explicitly free the interval tree here... */ + /* Perhaps we should explicitly free the interval tree here... */ } + /* Since we've unlinked the markers, the overlays can't be here any more + either. */ + b->overlays_before = NULL; + b->overlays_after = NULL; /* Reset the local variables, so that this buffer's local values won't be protected from GC. They would be protected -- 2.39.2