aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGerd Moellmann2022-06-21 15:49:44 +0200
committerEli Zaretskii2022-07-19 16:04:13 +0300
commitf02944f5a1ad18ceed4ae40a0fbbdddc981b4893 (patch)
tree864a209c5f9186bf08f56c71bfc1ddf075701bbe /src
parentcb911febc6c7a7c0ad451eb5514b3e32dac4af44 (diff)
downloademacs-f02944f5a1ad18ceed4ae40a0fbbdddc981b4893.tar.gz
emacs-f02944f5a1ad18ceed4ae40a0fbbdddc981b4893.zip
Prevent GC of window referenced from EmacsScroller
* 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)
Diffstat (limited to 'src')
-rw-r--r--src/alloc.c5
-rw-r--r--src/nsterm.h4
-rw-r--r--src/nsterm.m30
3 files changed, 39 insertions, 0 deletions
diff --git a/src/alloc.c b/src/alloc.c
index 5ad80973949..1fe5b8f3fbd 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -6145,6 +6145,11 @@ garbage_collect (void)
6145 mark_fringe_data (); 6145 mark_fringe_data ();
6146#endif 6146#endif
6147 6147
6148
6149#ifdef HAVE_NS
6150 mark_nsterm ();
6151#endif
6152
6148 /* Everything is now marked, except for the data in font caches, 6153 /* Everything is now marked, except for the data in font caches,
6149 undo lists, and finalizers. The first two are compacted by 6154 undo lists, and finalizers. The first two are compacted by
6150 removing an items which aren't reachable otherwise. */ 6155 removing an items which aren't reachable otherwise. */
diff --git a/src/nsterm.h b/src/nsterm.h
index 911539844a0..4cfed109827 100644
--- a/src/nsterm.h
+++ b/src/nsterm.h
@@ -683,6 +683,7 @@ typedef id instancetype;
683 int em_whole; 683 int em_whole;
684 } 684 }
685 685
686- (void) mark;
686- (instancetype) initFrame: (NSRect )r window: (Lisp_Object)win; 687- (instancetype) initFrame: (NSRect )r window: (Lisp_Object)win;
687- (void)setFrame: (NSRect)r; 688- (void)setFrame: (NSRect)r;
688 689
@@ -1347,4 +1348,7 @@ enum NSWindowTabbingMode
1347#define NSControlStateValueOff NSOffState 1348#define NSControlStateValueOff NSOffState
1348#define NSBezelStyleRounded NSRoundedBezelStyle 1349#define NSBezelStyleRounded NSRoundedBezelStyle
1349#endif 1350#endif
1351
1352extern void mark_nsterm (void);
1353
1350#endif /* HAVE_NS */ 1354#endif /* HAVE_NS */
diff --git a/src/nsterm.m b/src/nsterm.m
index 40540c47be1..1643ba5427c 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -9039,6 +9039,16 @@ nswindow_orderedIndex_sort (id w1, id w2, void *c)
9039 return ret; 9039 return ret;
9040} 9040}
9041 9041
9042- (void) mark
9043{
9044 if (window)
9045 {
9046 Lisp_Object win;
9047 XSETWINDOW (win, window);
9048 mark_object (win);
9049 }
9050}
9051
9042 9052
9043- (void)resetCursorRects 9053- (void)resetCursorRects
9044{ 9054{
@@ -9780,6 +9790,26 @@ ns_xlfd_to_fontname (const char *xlfd)
9780 return ret; 9790 return ret;
9781} 9791}
9782 9792
9793void
9794mark_nsterm (void)
9795{
9796 NSTRACE ("mark_nsterm");
9797 Lisp_Object tail, frame;
9798 FOR_EACH_FRAME (tail, frame)
9799 {
9800 struct frame *f = XFRAME (frame);
9801 if (FRAME_NS_P (f))
9802 {
9803 NSArray *subviews = [[FRAME_NS_VIEW (f) superview] subviews];
9804 for (int i = [subviews count] - 1; i >= 0; --i)
9805 {
9806 id scroller = [subviews objectAtIndex: i];
9807 if ([scroller isKindOfClass: [EmacsScroller class]])
9808 [scroller mark];
9809 }
9810 }
9811 }
9812}
9783 9813
9784void 9814void
9785syms_of_nsterm (void) 9815syms_of_nsterm (void)