aboutsummaryrefslogtreecommitdiffstats
path: root/src/alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/alloc.c')
-rw-r--r--src/alloc.c93
1 files changed, 66 insertions, 27 deletions
diff --git a/src/alloc.c b/src/alloc.c
index bee7cd1758d..fe55cde49c9 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -406,24 +406,37 @@ ALIGN (void *ptr, int alignment)
406 If A is a symbol, extract the hidden pointer's offset from lispsym, 406 If A is a symbol, extract the hidden pointer's offset from lispsym,
407 converted to void *. */ 407 converted to void *. */
408 408
409static void * 409#define macro_XPNTR_OR_SYMBOL_OFFSET(a) \
410XPNTR_OR_SYMBOL_OFFSET (Lisp_Object a) 410 ((void *) (intptr_t) (USE_LSB_TAG ? XLI (a) - XTYPE (a) : XLI (a) & VALMASK))
411{
412 intptr_t i = USE_LSB_TAG ? XLI (a) - XTYPE (a) : XLI (a) & VALMASK;
413 return (void *) i;
414}
415 411
416/* Extract the pointer hidden within A. */ 412/* Extract the pointer hidden within A. */
417 413
418static void * 414#define macro_XPNTR(a) \
415 ((void *) ((intptr_t) XPNTR_OR_SYMBOL_OFFSET (a) \
416 + (SYMBOLP (a) ? (char *) lispsym : NULL)))
417
418/* For pointer access, define XPNTR and XPNTR_OR_SYMBOL_OFFSET as
419 functions, as functions are cleaner and can be used in debuggers.
420 Also, define them as macros if being compiled with GCC without
421 optimization, for performance in that case. The macro_* names are
422 private to this section of code. */
423
424static ATTRIBUTE_UNUSED void *
425XPNTR_OR_SYMBOL_OFFSET (Lisp_Object a)
426{
427 return macro_XPNTR_OR_SYMBOL_OFFSET (a);
428}
429static ATTRIBUTE_UNUSED void *
419XPNTR (Lisp_Object a) 430XPNTR (Lisp_Object a)
420{ 431{
421 void *p = XPNTR_OR_SYMBOL_OFFSET (a); 432 return macro_XPNTR (a);
422 if (SYMBOLP (a))
423 p = (intptr_t) p + (char *) lispsym;
424 return p;
425} 433}
426 434
435#if DEFINE_KEY_OPS_AS_MACROS
436# define XPNTR_OR_SYMBOL_OFFSET(a) macro_XPNTR_OR_SYMBOL_OFFSET (a)
437# define XPNTR(a) macro_XPNTR (a)
438#endif
439
427static void 440static void
428XFLOAT_INIT (Lisp_Object f, double n) 441XFLOAT_INIT (Lisp_Object f, double n)
429{ 442{
@@ -3711,6 +3724,23 @@ make_event_array (ptrdiff_t nargs, Lisp_Object *args)
3711 } 3724 }
3712} 3725}
3713 3726
3727#ifdef HAVE_MODULES
3728/* Create a new module user ptr object. */
3729Lisp_Object
3730make_user_ptr (void (*finalizer) (void*), void *p)
3731{
3732 Lisp_Object obj;
3733 struct Lisp_User_Ptr *uptr;
3734
3735 obj = allocate_misc (Lisp_Misc_User_Ptr);
3736 uptr = XUSER_PTR (obj);
3737 uptr->finalizer = finalizer;
3738 uptr->p = p;
3739 return obj;
3740}
3741
3742#endif
3743
3714static void 3744static void
3715init_finalizer_list (struct Lisp_Finalizer *head) 3745init_finalizer_list (struct Lisp_Finalizer *head)
3716{ 3746{
@@ -5300,10 +5330,6 @@ total_bytes_of_live_objects (void)
5300 5330
5301#ifdef HAVE_WINDOW_SYSTEM 5331#ifdef HAVE_WINDOW_SYSTEM
5302 5332
5303/* This code has a few issues on MS-Windows, see Bug#15876 and Bug#16140. */
5304
5305#if !defined (HAVE_NTGUI)
5306
5307/* Remove unmarked font-spec and font-entity objects from ENTRY, which is 5333/* Remove unmarked font-spec and font-entity objects from ENTRY, which is
5308 (DRIVER-TYPE NUM-FRAMES FONT-CACHE-DATA ...), and return changed entry. */ 5334 (DRIVER-TYPE NUM-FRAMES FONT-CACHE-DATA ...), and return changed entry. */
5309 5335
@@ -5318,11 +5344,15 @@ compact_font_cache_entry (Lisp_Object entry)
5318 Lisp_Object obj = XCAR (tail); 5344 Lisp_Object obj = XCAR (tail);
5319 5345
5320 /* Consider OBJ if it is (font-spec . [font-entity font-entity ...]). */ 5346 /* Consider OBJ if it is (font-spec . [font-entity font-entity ...]). */
5321 if (CONSP (obj) && FONT_SPEC_P (XCAR (obj)) 5347 if (CONSP (obj) && GC_FONT_SPEC_P (XCAR (obj))
5322 && !VECTOR_MARKED_P (XFONT_SPEC (XCAR (obj))) 5348 && !VECTOR_MARKED_P (GC_XFONT_SPEC (XCAR (obj)))
5323 && VECTORP (XCDR (obj))) 5349 /* Don't use VECTORP here, as that calls ASIZE, which could
5350 hit assertion violation during GC. */
5351 && (VECTORLIKEP (XCDR (obj))
5352 && ! (gc_asize (XCDR (obj)) & PSEUDOVECTOR_FLAG)))
5324 { 5353 {
5325 ptrdiff_t i, size = ASIZE (XCDR (obj)) & ~ARRAY_MARK_FLAG; 5354 ptrdiff_t i, size = gc_asize (XCDR (obj));
5355 Lisp_Object obj_cdr = XCDR (obj);
5326 5356
5327 /* If font-spec is not marked, most likely all font-entities 5357 /* If font-spec is not marked, most likely all font-entities
5328 are not marked too. But we must be sure that nothing is 5358 are not marked too. But we must be sure that nothing is
@@ -5331,14 +5361,14 @@ compact_font_cache_entry (Lisp_Object entry)
5331 { 5361 {
5332 Lisp_Object objlist; 5362 Lisp_Object objlist;
5333 5363
5334 if (VECTOR_MARKED_P (XFONT_ENTITY (AREF (XCDR (obj), i)))) 5364 if (VECTOR_MARKED_P (GC_XFONT_ENTITY (AREF (obj_cdr, i))))
5335 break; 5365 break;
5336 5366
5337 objlist = AREF (AREF (XCDR (obj), i), FONT_OBJLIST_INDEX); 5367 objlist = AREF (AREF (obj_cdr, i), FONT_OBJLIST_INDEX);
5338 for (; CONSP (objlist); objlist = XCDR (objlist)) 5368 for (; CONSP (objlist); objlist = XCDR (objlist))
5339 { 5369 {
5340 Lisp_Object val = XCAR (objlist); 5370 Lisp_Object val = XCAR (objlist);
5341 struct font *font = XFONT_OBJECT (val); 5371 struct font *font = GC_XFONT_OBJECT (val);
5342 5372
5343 if (!NILP (AREF (val, FONT_TYPE_INDEX)) 5373 if (!NILP (AREF (val, FONT_TYPE_INDEX))
5344 && VECTOR_MARKED_P(font)) 5374 && VECTOR_MARKED_P(font))
@@ -5366,8 +5396,6 @@ compact_font_cache_entry (Lisp_Object entry)
5366 return entry; 5396 return entry;
5367} 5397}
5368 5398
5369#endif /* not HAVE_NTGUI */
5370
5371/* Compact font caches on all terminals and mark 5399/* Compact font caches on all terminals and mark
5372 everything which is still here after compaction. */ 5400 everything which is still here after compaction. */
5373 5401
@@ -5379,7 +5407,6 @@ compact_font_caches (void)
5379 for (t = terminal_list; t; t = t->next_terminal) 5407 for (t = terminal_list; t; t = t->next_terminal)
5380 { 5408 {
5381 Lisp_Object cache = TERMINAL_FONT_CACHE (t); 5409 Lisp_Object cache = TERMINAL_FONT_CACHE (t);
5382#if !defined (HAVE_NTGUI)
5383 if (CONSP (cache)) 5410 if (CONSP (cache))
5384 { 5411 {
5385 Lisp_Object entry; 5412 Lisp_Object entry;
@@ -5387,7 +5414,6 @@ compact_font_caches (void)
5387 for (entry = XCDR (cache); CONSP (entry); entry = XCDR (entry)) 5414 for (entry = XCDR (cache); CONSP (entry); entry = XCDR (entry))
5388 XSETCAR (entry, compact_font_cache_entry (XCAR (entry))); 5415 XSETCAR (entry, compact_font_cache_entry (XCAR (entry)));
5389 } 5416 }
5390#endif /* not HAVE_NTGUI */
5391 mark_object (cache); 5417 mark_object (cache);
5392 } 5418 }
5393} 5419}
@@ -6301,6 +6327,12 @@ mark_object (Lisp_Object arg)
6301 mark_object (XFINALIZER (obj)->function); 6327 mark_object (XFINALIZER (obj)->function);
6302 break; 6328 break;
6303 6329
6330#ifdef HAVE_MODULES
6331 case Lisp_Misc_User_Ptr:
6332 XMISCANY (obj)->gcmarkbit = true;
6333 break;
6334#endif
6335
6304 default: 6336 default:
6305 emacs_abort (); 6337 emacs_abort ();
6306 } 6338 }
@@ -6677,8 +6709,15 @@ sweep_misc (void)
6677 { 6709 {
6678 if (mblk->markers[i].m.u_any.type == Lisp_Misc_Marker) 6710 if (mblk->markers[i].m.u_any.type == Lisp_Misc_Marker)
6679 unchain_marker (&mblk->markers[i].m.u_marker); 6711 unchain_marker (&mblk->markers[i].m.u_marker);
6680 if (mblk->markers[i].m.u_any.type == Lisp_Misc_Finalizer) 6712 else if (mblk->markers[i].m.u_any.type == Lisp_Misc_Finalizer)
6681 unchain_finalizer (&mblk->markers[i].m.u_finalizer); 6713 unchain_finalizer (&mblk->markers[i].m.u_finalizer);
6714#ifdef HAVE_MODULES
6715 else if (mblk->markers[i].m.u_any.type == Lisp_Misc_User_Ptr)
6716 {
6717 struct Lisp_User_Ptr *uptr = &mblk->markers[i].m.u_user_ptr;
6718 uptr->finalizer (uptr->p);
6719 }
6720#endif
6682 /* Set the type of the freed object to Lisp_Misc_Free. 6721 /* Set the type of the freed object to Lisp_Misc_Free.
6683 We could leave the type alone, since nobody checks it, 6722 We could leave the type alone, since nobody checks it,
6684 but this might catch bugs faster. */ 6723 but this might catch bugs faster. */