From f02944f5a1ad18ceed4ae40a0fbbdddc981b4893 Mon Sep 17 00:00:00 2001 From: Gerd Moellmann Date: Tue, 21 Jun 2022 15:49:44 +0200 Subject: [PATCH] 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) --- src/alloc.c | 5 +++++ src/nsterm.h | 4 ++++ src/nsterm.m | 30 ++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+) 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) 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. */ 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; 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 */ 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 @@ -(bool)judge return ret; } +- (void) mark +{ + if (window) + { + Lisp_Object win; + XSETWINDOW (win, window); + mark_object (win); + } +} + - (void)resetCursorRects { @@ -9780,6 +9790,26 @@ Convert an X font name (XLFD) to an NS font name. 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)