diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2012-10-11 16:32:11 -0400 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2012-10-11 16:32:11 -0400 |
commit | 389a94a53dfc947c5dc9964b5617e0098513bbe0 (patch) | |
tree | 362bd061a49ac61ef83eb38d0df9a33ae1545cb6 /src | |
parent | d8cc4c00eaf27d0151ed4f0f4c40100c099ae0ef (diff) | |
download | emacs-389a94a53dfc947c5dc9964b5617e0098513bbe0.tar.gz |
* src/buffer.c (Fkill_buffer): Null out the overlay list(s) as well.
Diffstat (limited to 'src')
-rw-r--r-- | src/ChangeLog | 2 | ||||
-rw-r--r-- | 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 <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 |