Mercurial > emacs
diff src/buffer.c @ 12076:ee38e93ccf7e
(Fkill_buffer): When killing indirect buffer,
unchain that buffer's markers (only) from the common chain.
Don't rekill this buffer's indirect buffers that are dead.
Do nothing if this buffer is already dead.
| author | Karl Heuer <kwzh@gnu.org> |
|---|---|
| date | Mon, 05 Jun 1995 17:32:51 +0000 |
| parents | 1067ddd12dfc |
| children | 30adadd79bf9 |
line wrap: on
line diff
--- a/src/buffer.c Mon Jun 05 17:30:47 1995 +0000 +++ b/src/buffer.c Mon Jun 05 17:32:51 1995 +0000 @@ -889,6 +889,10 @@ b = XBUFFER (buf); + /* Avoid trouble for buffer already dead. */ + if (NILP (b->name)) + return Qnil; + /* Query if the buffer is still modified. */ if (INTERACTIVE && !NILP (b->filename) && BUF_MODIFF (b) > BUF_SAVE_MODIFF (b)) @@ -946,7 +950,9 @@ GCPRO1 (buf); for (other = all_buffers; other; other = other->next) - if (other->base_buffer == b) + /* all_buffers contains dead buffers too; + don't re-kill them. */ + if (other->base_buffer == b && !NILP (other->name)) { Lisp_Object buf; XSETBUFFER (buf, other); @@ -992,11 +998,26 @@ internal_delete_file (b->auto_save_file_name); } - if (! b->base_buffer) + if (b->base_buffer) { - /* Unchain all markers of this 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 (tem = BUF_MARKERS (b); !NILP (tem); ) + { + Lisp_Object next; + m = XMARKER (tem); + next = m->chain; + if (m->buffer == b) + unchain_marker (tem); + tem = next; + } + } + else + { + /* Unchain all markers of this buffer and its indirect buffers. and leave them pointing nowhere. */ - for (tem = BUF_MARKERS (b); !EQ (tem, Qnil); ) + for (tem = BUF_MARKERS (b); !NILP (tem); ) { m = XMARKER (tem); m->buffer = 0;
