]> git.eshelyaron.com Git - emacs.git/commitdiff
Prevent GC of window referenced from EmacsScroller
authorGerd Moellmann <gerd.moellmann@gmail.com>
Tue, 21 Jun 2022 13:49:44 +0000 (15:49 +0200)
committerEli Zaretskii <eliz@gnu.org>
Tue, 19 Jul 2022 13:04:13 +0000 (16:04 +0300)
* src/nsterm.m (EmacsScroller.mark, mark_nsterm): New functions.
* src/nsterm.h (EmacsScroller.mark, mark_nsterm): Declare.
* src/alloc.c (garbage_collect) [MAVE_NS]: Call mark_nsterm.
(Bug#56095)

(cherry picked from commit 5f1bd872478927ad4bc635502e74628d39885286)

src/alloc.c
src/nsterm.h
src/nsterm.m

index 5ad809739495b085a9eb0dfc09245226a25dbf9c..1fe5b8f3fbd33f55595444925b7ce453aa5ee6cd 100644 (file)
@@ -6145,6 +6145,11 @@ garbage_collect (void)
   mark_fringe_data ();
 #endif
 
+
+#ifdef HAVE_NS
+  mark_nsterm ();
+#endif
+
   /* Everything is now marked, except for the data in font caches,
      undo lists, and finalizers.  The first two are compacted by
      removing an items which aren't reachable otherwise.  */
index 911539844a0cda086a6ed990ba3859d849ccadc7..4cfed10982767f58f6feb92d494708f23b40f109 100644 (file)
@@ -683,6 +683,7 @@ typedef id instancetype;
    int em_whole;
    }
 
+- (void) mark;
 - (instancetype) initFrame: (NSRect )r window: (Lisp_Object)win;
 - (void)setFrame: (NSRect)r;
 
@@ -1347,4 +1348,7 @@ enum NSWindowTabbingMode
 #define NSControlStateValueOff NSOffState
 #define NSBezelStyleRounded NSRoundedBezelStyle
 #endif
+
+extern void mark_nsterm (void);
+
 #endif /* HAVE_NS */
index 40540c47be14b570fd952772b8ba1652ea6713fa..1643ba5427c175a9b7e7a7740eeaabff4a5a42d9 100644 (file)
@@ -9039,6 +9039,16 @@ nswindow_orderedIndex_sort (id w1, id w2, void *c)
   return ret;
 }
 
+- (void) mark
+{
+  if (window)
+    {
+      Lisp_Object win;
+      XSETWINDOW (win, window);
+      mark_object (win);
+    }
+}
+
 
 - (void)resetCursorRects
 {
@@ -9780,6 +9790,26 @@ ns_xlfd_to_fontname (const char *xlfd)
   return ret;
 }
 
+void
+mark_nsterm (void)
+{
+  NSTRACE ("mark_nsterm");
+  Lisp_Object tail, frame;
+  FOR_EACH_FRAME (tail, frame)
+    {
+      struct frame *f = XFRAME (frame);
+      if (FRAME_NS_P (f))
+       {
+         NSArray *subviews = [[FRAME_NS_VIEW (f) superview] subviews];
+         for (int i = [subviews count] - 1; i >= 0; --i)
+           {
+             id scroller = [subviews objectAtIndex: i];
+             if ([scroller isKindOfClass: [EmacsScroller class]])
+                  [scroller mark];
+           }
+       }
+    }
+}
 
 void
 syms_of_nsterm (void)