diff options
Diffstat (limited to 'src/alloc.c')
| -rw-r--r-- | src/alloc.c | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/src/alloc.c b/src/alloc.c index bee7cd1758d..48ce3f120f5 100644 --- a/src/alloc.c +++ b/src/alloc.c | |||
| @@ -3711,6 +3711,23 @@ make_event_array (ptrdiff_t nargs, Lisp_Object *args) | |||
| 3711 | } | 3711 | } |
| 3712 | } | 3712 | } |
| 3713 | 3713 | ||
| 3714 | #ifdef HAVE_MODULES | ||
| 3715 | /* Create a new module user ptr object. */ | ||
| 3716 | Lisp_Object | ||
| 3717 | make_user_ptr (void (*finalizer) (void*), void *p) | ||
| 3718 | { | ||
| 3719 | Lisp_Object obj; | ||
| 3720 | struct Lisp_User_Ptr *uptr; | ||
| 3721 | |||
| 3722 | obj = allocate_misc (Lisp_Misc_User_Ptr); | ||
| 3723 | uptr = XUSER_PTR (obj); | ||
| 3724 | uptr->finalizer = finalizer; | ||
| 3725 | uptr->p = p; | ||
| 3726 | return obj; | ||
| 3727 | } | ||
| 3728 | |||
| 3729 | #endif | ||
| 3730 | |||
| 3714 | static void | 3731 | static void |
| 3715 | init_finalizer_list (struct Lisp_Finalizer *head) | 3732 | init_finalizer_list (struct Lisp_Finalizer *head) |
| 3716 | { | 3733 | { |
| @@ -6301,6 +6318,12 @@ mark_object (Lisp_Object arg) | |||
| 6301 | mark_object (XFINALIZER (obj)->function); | 6318 | mark_object (XFINALIZER (obj)->function); |
| 6302 | break; | 6319 | break; |
| 6303 | 6320 | ||
| 6321 | #ifdef HAVE_MODULES | ||
| 6322 | case Lisp_Misc_User_Ptr: | ||
| 6323 | XMISCANY (obj)->gcmarkbit = true; | ||
| 6324 | break; | ||
| 6325 | #endif | ||
| 6326 | |||
| 6304 | default: | 6327 | default: |
| 6305 | emacs_abort (); | 6328 | emacs_abort (); |
| 6306 | } | 6329 | } |
| @@ -6677,8 +6700,15 @@ sweep_misc (void) | |||
| 6677 | { | 6700 | { |
| 6678 | if (mblk->markers[i].m.u_any.type == Lisp_Misc_Marker) | 6701 | if (mblk->markers[i].m.u_any.type == Lisp_Misc_Marker) |
| 6679 | unchain_marker (&mblk->markers[i].m.u_marker); | 6702 | unchain_marker (&mblk->markers[i].m.u_marker); |
| 6680 | if (mblk->markers[i].m.u_any.type == Lisp_Misc_Finalizer) | 6703 | else if (mblk->markers[i].m.u_any.type == Lisp_Misc_Finalizer) |
| 6681 | unchain_finalizer (&mblk->markers[i].m.u_finalizer); | 6704 | unchain_finalizer (&mblk->markers[i].m.u_finalizer); |
| 6705 | #ifdef HAVE_MODULES | ||
| 6706 | else if (mblk->markers[i].m.u_any.type == Lisp_Misc_User_Ptr) | ||
| 6707 | { | ||
| 6708 | struct Lisp_User_Ptr *uptr = &mblk->markers[i].m.u_user_ptr; | ||
| 6709 | uptr->finalizer (uptr->p); | ||
| 6710 | } | ||
| 6711 | #endif | ||
| 6682 | /* Set the type of the freed object to Lisp_Misc_Free. | 6712 | /* Set the type of the freed object to Lisp_Misc_Free. |
| 6683 | We could leave the type alone, since nobody checks it, | 6713 | We could leave the type alone, since nobody checks it, |
| 6684 | but this might catch bugs faster. */ | 6714 | but this might catch bugs faster. */ |