diff options
| author | K. Handa | 2016-01-03 17:53:43 +0900 |
|---|---|---|
| committer | K. Handa | 2016-01-03 17:53:43 +0900 |
| commit | fb6d826c69939c2d016c1b824d4e9bcb53d9e643 (patch) | |
| tree | b9ce862d6cbe25e740203421984df21e4cbadbf4 /src/alloc.c | |
| parent | 536f48e9a2251b9e654ea974bd90ff2f40218753 (diff) | |
| parent | 91917dd58ec5278e555b9c693a830749083e8f89 (diff) | |
| download | emacs-fb6d826c69939c2d016c1b824d4e9bcb53d9e643.tar.gz emacs-fb6d826c69939c2d016c1b824d4e9bcb53d9e643.zip | |
Merge branch 'master' of git.sv.gnu.org:/srv/git/emacs
Diffstat (limited to 'src/alloc.c')
| -rw-r--r-- | src/alloc.c | 93 |
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 | ||
| 409 | static void * | 409 | #define macro_XPNTR_OR_SYMBOL_OFFSET(a) \ |
| 410 | XPNTR_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 | ||
| 418 | static 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 | |||
| 424 | static ATTRIBUTE_UNUSED void * | ||
| 425 | XPNTR_OR_SYMBOL_OFFSET (Lisp_Object a) | ||
| 426 | { | ||
| 427 | return macro_XPNTR_OR_SYMBOL_OFFSET (a); | ||
| 428 | } | ||
| 429 | static ATTRIBUTE_UNUSED void * | ||
| 419 | XPNTR (Lisp_Object a) | 430 | XPNTR (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 | |||
| 427 | static void | 440 | static void |
| 428 | XFLOAT_INIT (Lisp_Object f, double n) | 441 | XFLOAT_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. */ | ||
| 3729 | Lisp_Object | ||
| 3730 | make_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 | |||
| 3714 | static void | 3744 | static void |
| 3715 | init_finalizer_list (struct Lisp_Finalizer *head) | 3745 | init_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. */ |