diff options
Diffstat (limited to 'src/alloc.c')
| -rw-r--r-- | src/alloc.c | 85 |
1 files changed, 82 insertions, 3 deletions
diff --git a/src/alloc.c b/src/alloc.c index 17ca5c725d0..c77bdc6372d 100644 --- a/src/alloc.c +++ b/src/alloc.c | |||
| @@ -50,6 +50,10 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ | |||
| 50 | #include TERM_HEADER | 50 | #include TERM_HEADER |
| 51 | #endif /* HAVE_WINDOW_SYSTEM */ | 51 | #endif /* HAVE_WINDOW_SYSTEM */ |
| 52 | 52 | ||
| 53 | #if defined HAVE_ANDROID && !defined ANDROID_STUBIFY | ||
| 54 | #include "sfntfont.h" | ||
| 55 | #endif | ||
| 56 | |||
| 53 | #ifdef HAVE_TREE_SITTER | 57 | #ifdef HAVE_TREE_SITTER |
| 54 | #include "treesit.h" | 58 | #include "treesit.h" |
| 55 | #endif | 59 | #endif |
| @@ -3346,6 +3350,15 @@ cleanup_vector (struct Lisp_Vector *vector) | |||
| 3346 | drv->close_font (font); | 3350 | drv->close_font (font); |
| 3347 | } | 3351 | } |
| 3348 | } | 3352 | } |
| 3353 | |||
| 3354 | #if defined HAVE_ANDROID && !defined ANDROID_STUBIFY | ||
| 3355 | /* The Android font driver needs the ability to associate extra | ||
| 3356 | information with font entities. */ | ||
| 3357 | if (((vector->header.size & PSEUDOVECTOR_SIZE_MASK) | ||
| 3358 | == FONT_ENTITY_MAX) | ||
| 3359 | && PSEUDOVEC_STRUCT (vector, font_entity)->is_android) | ||
| 3360 | android_finalize_font_entity (PSEUDOVEC_STRUCT (vector, font_entity)); | ||
| 3361 | #endif | ||
| 3349 | } | 3362 | } |
| 3350 | else if (PSEUDOVECTOR_TYPEP (&vector->header, PVEC_THREAD)) | 3363 | else if (PSEUDOVECTOR_TYPEP (&vector->header, PVEC_THREAD)) |
| 3351 | finalize_one_thread (PSEUDOVEC_STRUCT (vector, thread_state)); | 3364 | finalize_one_thread (PSEUDOVEC_STRUCT (vector, thread_state)); |
| @@ -5645,6 +5658,22 @@ find_string_data_in_pure (const char *data, ptrdiff_t nbytes) | |||
| 5645 | if (pure_bytes_used_non_lisp <= nbytes) | 5658 | if (pure_bytes_used_non_lisp <= nbytes) |
| 5646 | return NULL; | 5659 | return NULL; |
| 5647 | 5660 | ||
| 5661 | /* The Android GCC generates code like: | ||
| 5662 | |||
| 5663 | 0xa539e755 <+52>: lea 0x430(%esp),%esi | ||
| 5664 | => 0xa539e75c <+59>: movdqa %xmm0,0x0(%ebp) | ||
| 5665 | 0xa539e761 <+64>: add $0x10,%ebp | ||
| 5666 | |||
| 5667 | but data is not aligned appropriately, so a GP fault results. */ | ||
| 5668 | |||
| 5669 | #if defined __i386__ \ | ||
| 5670 | && defined HAVE_ANDROID \ | ||
| 5671 | && !defined ANDROID_STUBIFY \ | ||
| 5672 | && !defined (__clang__) | ||
| 5673 | if ((intptr_t) data & 15) | ||
| 5674 | return NULL; | ||
| 5675 | #endif | ||
| 5676 | |||
| 5648 | /* Set up the Boyer-Moore table. */ | 5677 | /* Set up the Boyer-Moore table. */ |
| 5649 | skip = nbytes + 1; | 5678 | skip = nbytes + 1; |
| 5650 | for (i = 0; i < 256; i++) | 5679 | for (i = 0; i < 256; i++) |
| @@ -6155,16 +6184,45 @@ mark_pinned_objects (void) | |||
| 6155 | mark_object (pobj->object); | 6184 | mark_object (pobj->object); |
| 6156 | } | 6185 | } |
| 6157 | 6186 | ||
| 6187 | #if defined HAVE_ANDROID && !defined (__clang__) | ||
| 6188 | |||
| 6189 | /* The Android gcc is broken and needs the following version of | ||
| 6190 | make_lisp_symbol. Otherwise a mysterious ICE pops up. */ | ||
| 6191 | |||
| 6192 | #define make_lisp_symbol android_make_lisp_symbol | ||
| 6193 | |||
| 6194 | static Lisp_Object | ||
| 6195 | android_make_lisp_symbol (struct Lisp_Symbol *sym) | ||
| 6196 | { | ||
| 6197 | intptr_t symoffset; | ||
| 6198 | |||
| 6199 | symoffset = (intptr_t) sym; | ||
| 6200 | INT_SUBTRACT_WRAPV (symoffset, (intptr_t) &lispsym, | ||
| 6201 | &symoffset); | ||
| 6202 | |||
| 6203 | { | ||
| 6204 | Lisp_Object a = TAG_PTR (Lisp_Symbol, symoffset); | ||
| 6205 | return a; | ||
| 6206 | } | ||
| 6207 | } | ||
| 6208 | |||
| 6209 | #endif | ||
| 6210 | |||
| 6158 | static void | 6211 | static void |
| 6159 | mark_pinned_symbols (void) | 6212 | mark_pinned_symbols (void) |
| 6160 | { | 6213 | { |
| 6161 | struct symbol_block *sblk; | 6214 | struct symbol_block *sblk; |
| 6162 | int lim = (symbol_block_pinned == symbol_block | 6215 | int lim; |
| 6163 | ? symbol_block_index : SYMBOL_BLOCK_SIZE); | 6216 | struct Lisp_Symbol *sym, *end; |
| 6217 | |||
| 6218 | if (symbol_block_pinned == symbol_block) | ||
| 6219 | lim = symbol_block_index; | ||
| 6220 | else | ||
| 6221 | lim = SYMBOL_BLOCK_SIZE; | ||
| 6164 | 6222 | ||
| 6165 | for (sblk = symbol_block_pinned; sblk; sblk = sblk->next) | 6223 | for (sblk = symbol_block_pinned; sblk; sblk = sblk->next) |
| 6166 | { | 6224 | { |
| 6167 | struct Lisp_Symbol *sym = sblk->symbols, *end = sym + lim; | 6225 | sym = sblk->symbols, end = sym + lim; |
| 6168 | for (; sym < end; ++sym) | 6226 | for (; sym < end; ++sym) |
| 6169 | if (sym->u.s.pinned) | 6227 | if (sym->u.s.pinned) |
| 6170 | mark_object (make_lisp_symbol (sym)); | 6228 | mark_object (make_lisp_symbol (sym)); |
| @@ -6463,6 +6521,13 @@ garbage_collect (void) | |||
| 6463 | mark_xselect (); | 6521 | mark_xselect (); |
| 6464 | #endif | 6522 | #endif |
| 6465 | 6523 | ||
| 6524 | #ifdef HAVE_ANDROID | ||
| 6525 | mark_androidterm (); | ||
| 6526 | #ifndef ANDROID_STUBIFY | ||
| 6527 | mark_sfntfont (); | ||
| 6528 | #endif | ||
| 6529 | #endif | ||
| 6530 | |||
| 6466 | #ifdef HAVE_NS | 6531 | #ifdef HAVE_NS |
| 6467 | mark_nsterm (); | 6532 | mark_nsterm (); |
| 6468 | #endif | 6533 | #endif |
| @@ -6871,6 +6936,11 @@ static void | |||
| 6871 | mark_frame (struct Lisp_Vector *ptr) | 6936 | mark_frame (struct Lisp_Vector *ptr) |
| 6872 | { | 6937 | { |
| 6873 | struct frame *f = (struct frame *) ptr; | 6938 | struct frame *f = (struct frame *) ptr; |
| 6939 | #ifdef HAVE_TEXT_CONVERSION | ||
| 6940 | struct text_conversion_action *tem; | ||
| 6941 | #endif | ||
| 6942 | |||
| 6943 | |||
| 6874 | mark_vectorlike (&ptr->header); | 6944 | mark_vectorlike (&ptr->header); |
| 6875 | mark_face_cache (f->face_cache); | 6945 | mark_face_cache (f->face_cache); |
| 6876 | #ifdef HAVE_WINDOW_SYSTEM | 6946 | #ifdef HAVE_WINDOW_SYSTEM |
| @@ -6882,6 +6952,15 @@ mark_frame (struct Lisp_Vector *ptr) | |||
| 6882 | mark_vectorlike (&font->header); | 6952 | mark_vectorlike (&font->header); |
| 6883 | } | 6953 | } |
| 6884 | #endif | 6954 | #endif |
| 6955 | |||
| 6956 | #ifdef HAVE_TEXT_CONVERSION | ||
| 6957 | mark_object (f->conversion.compose_region_start); | ||
| 6958 | mark_object (f->conversion.compose_region_end); | ||
| 6959 | mark_object (f->conversion.compose_region_overlay); | ||
| 6960 | |||
| 6961 | for (tem = f->conversion.actions; tem; tem = tem->next) | ||
| 6962 | mark_object (tem->data); | ||
| 6963 | #endif | ||
| 6885 | } | 6964 | } |
| 6886 | 6965 | ||
| 6887 | static void | 6966 | static void |