]> 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>
Wed, 22 Jun 2022 13:50:24 +0000 (16:50 +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)

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

index 55e18ecd77e174566cc510cbf996b1f5f7da70b7..f115a3cebaaa821dc69822b702e5850db1f63bd1 100644 (file)
@@ -6204,6 +6204,10 @@ garbage_collect (void)
   mark_xterm ();
 #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 c4fdc7054f7a4c7f3860004861c4878ef44c4cad..7a097b324892e82e5f580a900d9406888ec29163 100644 (file)
@@ -724,6 +724,7 @@ enum ns_return_frame_mode
    int em_whole;
    }
 
+- (void) mark;
 - (instancetype) initFrame: (NSRect )r window: (Lisp_Object)win;
 - (void)setFrame: (NSRect)r;
 
@@ -1373,4 +1374,7 @@ enum NSWindowTabbingMode
 #define NSBezelStyleRounded NSRoundedBezelStyle
 #define NSButtonTypeMomentaryPushIn NSMomentaryPushInButton
 #endif
+
+extern void mark_nsterm (void);
+
 #endif /* HAVE_NS */
index 891d52ea3f099944e0950d8b0dd85e8c268d9585..ae44f8084593c22da6bf07a4145b8a168f9f8f75 100644 (file)
@@ -9924,6 +9924,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
 {
@@ -10665,6 +10675,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)