aboutsummaryrefslogtreecommitdiffstats
path: root/src/alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/alloc.c')
-rw-r--r--src/alloc.c49
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
3837Lisp_Object 3838Lisp_Object
3838build_overlay (Lisp_Object start, Lisp_Object end, Lisp_Object plist) 3839build_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
3850DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0, 3854DEFUN ("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
6282static void 6286static void
6283mark_overlay (struct Lisp_Overlay *ptr) 6287mark_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