Mercurial > emacs
comparison src/alloc.c @ 21306:dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
don't mark a marker just cause it is in this list.
(Fgarbage_collect): Discard from all undo-lists
all elements that adjust markers that were not marked.
| author | Richard M. Stallman <rms@gnu.org> |
|---|---|
| date | Sat, 28 Mar 1998 21:50:59 +0000 |
| parents | 693573ac0944 |
| children | 1701bf5b9dec |
comparison
equal
deleted
inserted
replaced
| 21305:c26bceb68019 | 21306:dc2cbd40703c |
|---|---|
| 1813 mark_object (&backlist->args[i]); | 1813 mark_object (&backlist->args[i]); |
| 1814 XMARK (backlist->args[i]); | 1814 XMARK (backlist->args[i]); |
| 1815 } | 1815 } |
| 1816 } | 1816 } |
| 1817 mark_kboards (); | 1817 mark_kboards (); |
| 1818 | |
| 1819 /* Look thru every buffer's undo list | |
| 1820 for elements that update markers that were not marked, | |
| 1821 and delete them. */ | |
| 1822 { | |
| 1823 register struct buffer *nextb = all_buffers; | |
| 1824 | |
| 1825 while (nextb) | |
| 1826 { | |
| 1827 /* If a buffer's undo list is Qt, that means that undo is | |
| 1828 turned off in that buffer. Calling truncate_undo_list on | |
| 1829 Qt tends to return NULL, which effectively turns undo back on. | |
| 1830 So don't call truncate_undo_list if undo_list is Qt. */ | |
| 1831 if (! EQ (nextb->undo_list, Qt)) | |
| 1832 { | |
| 1833 Lisp_Object tail, prev; | |
| 1834 tail = nextb->undo_list; | |
| 1835 prev = Qnil; | |
| 1836 while (CONSP (tail)) | |
| 1837 { | |
| 1838 if (GC_CONSP (XCONS (tail)->car) | |
| 1839 && GC_MARKERP (XCONS (XCONS (tail)->car)->car) | |
| 1840 && ! XMARKBIT (XMARKER (XCONS (XCONS (tail)->car)->car)->chain)) | |
| 1841 { | |
| 1842 if (NILP (prev)) | |
| 1843 nextb->undo_list = tail = XCONS (tail)->cdr; | |
| 1844 else | |
| 1845 tail = XCONS (prev)->cdr = XCONS (tail)->cdr; | |
| 1846 } | |
| 1847 else | |
| 1848 { | |
| 1849 prev = tail; | |
| 1850 tail = XCONS (tail)->cdr; | |
| 1851 } | |
| 1852 } | |
| 1853 } | |
| 1854 | |
| 1855 nextb = nextb->next; | |
| 1856 } | |
| 1857 } | |
| 1818 | 1858 |
| 1819 gc_sweep (); | 1859 gc_sweep (); |
| 1820 | 1860 |
| 1821 /* Clear the mark bits that we set in certain root slots. */ | 1861 /* Clear the mark bits that we set in certain root slots. */ |
| 1822 | 1862 |
| 2225 /* This is the buffer's markbit */ | 2265 /* This is the buffer's markbit */ |
| 2226 mark_object (&buffer->name); | 2266 mark_object (&buffer->name); |
| 2227 XMARK (buffer->name); | 2267 XMARK (buffer->name); |
| 2228 | 2268 |
| 2229 MARK_INTERVAL_TREE (BUF_INTERVALS (buffer)); | 2269 MARK_INTERVAL_TREE (BUF_INTERVALS (buffer)); |
| 2270 | |
| 2271 if (CONSP (buffer->undo_list)) | |
| 2272 { | |
| 2273 Lisp_Object tail; | |
| 2274 tail = buffer->undo_list; | |
| 2275 | |
| 2276 while (CONSP (tail)) | |
| 2277 { | |
| 2278 register struct Lisp_Cons *ptr = XCONS (tail); | |
| 2279 | |
| 2280 if (XMARKBIT (ptr->car)) | |
| 2281 break; | |
| 2282 XMARK (ptr->car); | |
| 2283 if (GC_CONSP (ptr->car) | |
| 2284 && ! XMARKBIT (XCONS (ptr->car)->car) | |
| 2285 && GC_MARKERP (XCONS (ptr->car)->car)) | |
| 2286 { | |
| 2287 XMARK (XCONS (ptr->car)->car); | |
| 2288 mark_object (&XCONS (ptr->car)->cdr); | |
| 2289 } | |
| 2290 else | |
| 2291 mark_object (&ptr->car); | |
| 2292 | |
| 2293 if (CONSP (ptr->cdr)) | |
| 2294 tail = ptr->cdr; | |
| 2295 else | |
| 2296 break; | |
| 2297 } | |
| 2298 | |
| 2299 mark_object (&XCONS (tail)->cdr); | |
| 2300 } | |
| 2301 else | |
| 2302 mark_object (&buffer->undo_list); | |
| 2230 | 2303 |
| 2231 #if 0 | 2304 #if 0 |
| 2232 mark_object (buffer->syntax_table); | 2305 mark_object (buffer->syntax_table); |
| 2233 | 2306 |
| 2234 /* Mark the various string-pointers in the buffer object. | 2307 /* Mark the various string-pointers in the buffer object. |
