From: Stefan Monnier Date: Thu, 11 Oct 2012 20:32:11 +0000 (-0400) Subject: * src/buffer.c (Fkill_buffer): Null out the overlay list(s) as well. X-Git-Tag: emacs-24.2.90~235^2~24 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=389a94a53dfc947c5dc9964b5617e0098513bbe0;p=emacs.git * src/buffer.c (Fkill_buffer): Null out the overlay list(s) as well. --- 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