aboutsummaryrefslogtreecommitdiffstats
path: root/src/alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/alloc.c')
-rw-r--r--src/alloc.c85
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
6194static Lisp_Object
6195android_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
6158static void 6211static void
6159mark_pinned_symbols (void) 6212mark_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
6871mark_frame (struct Lisp_Vector *ptr) 6936mark_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
6887static void 6966static void