diff options
Diffstat (limited to 'src/alloc.c')
| -rw-r--r-- | src/alloc.c | 49 |
1 files changed, 30 insertions, 19 deletions
diff --git a/src/alloc.c b/src/alloc.c index 2e6399e7f8d..15a6fc43b72 100644 --- a/src/alloc.c +++ b/src/alloc.c | |||
| @@ -43,6 +43,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ | |||
| 43 | #include "frame.h" | 43 | #include "frame.h" |
| 44 | #include "blockinput.h" | 44 | #include "blockinput.h" |
| 45 | #include "termhooks.h" /* For struct terminal. */ | 45 | #include "termhooks.h" /* For struct terminal. */ |
| 46 | #include "itree.h" | ||
| 46 | #ifdef HAVE_WINDOW_SYSTEM | 47 | #ifdef HAVE_WINDOW_SYSTEM |
| 47 | #include TERM_HEADER | 48 | #include TERM_HEADER |
| 48 | #endif /* HAVE_WINDOW_SYSTEM */ | 49 | #endif /* HAVE_WINDOW_SYSTEM */ |
| @@ -3835,16 +3836,19 @@ free_save_value (Lisp_Object save) | |||
| 3835 | /* Return a Lisp_Misc_Overlay object with specified START, END and PLIST. */ | 3836 | /* Return a Lisp_Misc_Overlay object with specified START, END and PLIST. */ |
| 3836 | 3837 | ||
| 3837 | Lisp_Object | 3838 | Lisp_Object |
| 3838 | build_overlay (Lisp_Object start, Lisp_Object end, Lisp_Object plist) | 3839 | build_overlay (ptrdiff_t begin, ptrdiff_t end, |
| 3840 | bool front_advance, bool rear_advance, | ||
| 3841 | Lisp_Object plist) | ||
| 3839 | { | 3842 | { |
| 3840 | register Lisp_Object overlay; | 3843 | Lisp_Object ov = allocate_misc (Lisp_Misc_Overlay); |
| 3844 | struct interval_node *node = xmalloc (sizeof (*node)); | ||
| 3841 | 3845 | ||
| 3842 | overlay = allocate_misc (Lisp_Misc_Overlay); | 3846 | interval_node_init (node, begin, end, front_advance, |
| 3843 | OVERLAY_START (overlay) = start; | 3847 | rear_advance, ov); |
| 3844 | OVERLAY_END (overlay) = end; | 3848 | XOVERLAY (ov)->interval = node; |
| 3845 | set_overlay_plist (overlay, plist); | 3849 | XOVERLAY (ov)->buffer = NULL; |
| 3846 | XOVERLAY (overlay)->next = NULL; | 3850 | set_overlay_plist (ov, plist); |
| 3847 | return overlay; | 3851 | return ov; |
| 3848 | } | 3852 | } |
| 3849 | 3853 | ||
| 3850 | DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0, | 3854 | DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0, |
| @@ -6280,16 +6284,10 @@ mark_compiled (struct Lisp_Vector *ptr) | |||
| 6280 | /* Mark the chain of overlays starting at PTR. */ | 6284 | /* Mark the chain of overlays starting at PTR. */ |
| 6281 | 6285 | ||
| 6282 | static void | 6286 | static void |
| 6283 | mark_overlay (struct Lisp_Overlay *ptr) | 6287 | mark_overlay (struct Lisp_Overlay *ov) |
| 6284 | { | 6288 | { |
| 6285 | for (; ptr && !ptr->gcmarkbit; ptr = ptr->next) | 6289 | ov->gcmarkbit = 1; |
| 6286 | { | 6290 | mark_object (ov->plist); |
| 6287 | ptr->gcmarkbit = 1; | ||
| 6288 | /* These two are always markers and can be marked fast. */ | ||
| 6289 | XMARKER (ptr->start)->gcmarkbit = 1; | ||
| 6290 | XMARKER (ptr->end)->gcmarkbit = 1; | ||
| 6291 | mark_object (ptr->plist); | ||
| 6292 | } | ||
| 6293 | } | 6291 | } |
| 6294 | 6292 | ||
| 6295 | /* Mark Lisp_Objects and special pointers in BUFFER. */ | 6293 | /* Mark Lisp_Objects and special pointers in BUFFER. */ |
| @@ -6308,8 +6306,15 @@ mark_buffer (struct buffer *buffer) | |||
| 6308 | a special way just before the sweep phase, and after stripping | 6306 | a special way just before the sweep phase, and after stripping |
| 6309 | some of its elements that are not needed any more. */ | 6307 | some of its elements that are not needed any more. */ |
| 6310 | 6308 | ||
| 6311 | mark_overlay (buffer->overlays_before); | 6309 | if (buffer->overlays) |
| 6312 | mark_overlay (buffer->overlays_after); | 6310 | { |
| 6311 | struct interval_node *node; | ||
| 6312 | buffer_overlay_iter_start (buffer, PTRDIFF_MIN, PTRDIFF_MAX, ITREE_ASCENDING); | ||
| 6313 | |||
| 6314 | while ((node = buffer_overlay_iter_next (buffer))) | ||
| 6315 | mark_overlay (XOVERLAY (node->data)); | ||
| 6316 | buffer_overlay_iter_finish (buffer); | ||
| 6317 | } | ||
| 6313 | 6318 | ||
| 6314 | /* If this is an indirect buffer, mark its base buffer. */ | 6319 | /* If this is an indirect buffer, mark its base buffer. */ |
| 6315 | if (buffer->base_buffer && !VECTOR_MARKED_P (buffer->base_buffer)) | 6320 | if (buffer->base_buffer && !VECTOR_MARKED_P (buffer->base_buffer)) |
| @@ -7090,6 +7095,11 @@ sweep_misc (void) | |||
| 7090 | unchain_marker (&mblk->markers[i].m.u_marker); | 7095 | unchain_marker (&mblk->markers[i].m.u_marker); |
| 7091 | else if (mblk->markers[i].m.u_any.type == Lisp_Misc_Finalizer) | 7096 | else if (mblk->markers[i].m.u_any.type == Lisp_Misc_Finalizer) |
| 7092 | unchain_finalizer (&mblk->markers[i].m.u_finalizer); | 7097 | unchain_finalizer (&mblk->markers[i].m.u_finalizer); |
| 7098 | else if (mblk->markers[i].m.u_any.type == Lisp_Misc_Overlay) | ||
| 7099 | { | ||
| 7100 | xfree (mblk->markers[i].m.u_overlay.interval); | ||
| 7101 | mblk->markers[i].m.u_overlay.interval = NULL; | ||
| 7102 | } | ||
| 7093 | #ifdef HAVE_MODULES | 7103 | #ifdef HAVE_MODULES |
| 7094 | else if (mblk->markers[i].m.u_any.type == Lisp_Misc_User_Ptr) | 7104 | else if (mblk->markers[i].m.u_any.type == Lisp_Misc_User_Ptr) |
| 7095 | { | 7105 | { |
| @@ -7145,6 +7155,7 @@ sweep_buffers (void) | |||
| 7145 | if (!VECTOR_MARKED_P (buffer)) | 7155 | if (!VECTOR_MARKED_P (buffer)) |
| 7146 | { | 7156 | { |
| 7147 | *bprev = buffer->next; | 7157 | *bprev = buffer->next; |
| 7158 | free_buffer_overlays (buffer); | ||
| 7148 | lisp_free (buffer); | 7159 | lisp_free (buffer); |
| 7149 | } | 7160 | } |
| 7150 | else | 7161 | else |