summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2012-10-11 16:32:11 -0400
committerStefan Monnier <monnier@iro.umontreal.ca>2012-10-11 16:32:11 -0400
commit389a94a53dfc947c5dc9964b5617e0098513bbe0 (patch)
tree362bd061a49ac61ef83eb38d0df9a33ae1545cb6 /src
parentd8cc4c00eaf27d0151ed4f0f4c40100c099ae0ef (diff)
downloademacs-389a94a53dfc947c5dc9964b5617e0098513bbe0.tar.gz
* src/buffer.c (Fkill_buffer): Null out the overlay list(s) as well.
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog2
-rw-r--r--src/buffer.c31
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 <monnier@iro.umontreal.ca>
+ * 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 <eggert@cs.ucla.edu>
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