diff options
| author | Gerd Moellmann | 2022-06-21 15:49:44 +0200 |
|---|---|---|
| committer | Eli Zaretskii | 2022-07-19 16:04:13 +0300 |
| commit | f02944f5a1ad18ceed4ae40a0fbbdddc981b4893 (patch) | |
| tree | 864a209c5f9186bf08f56c71bfc1ddf075701bbe /src | |
| parent | cb911febc6c7a7c0ad451eb5514b3e32dac4af44 (diff) | |
| download | emacs-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.c | 5 | ||||
| -rw-r--r-- | src/nsterm.h | 4 | ||||
| -rw-r--r-- | src/nsterm.m | 30 |
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 | |||
| 1352 | extern 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 | ||
| 9793 | void | ||
| 9794 | mark_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 | ||
| 9784 | void | 9814 | void |
| 9785 | syms_of_nsterm (void) | 9815 | syms_of_nsterm (void) |