aboutsummaryrefslogtreecommitdiffstats
path: root/src/alloc.c
diff options
context:
space:
mode:
authorAurélien Aptel2015-11-16 00:42:14 +0100
committerTed Zlatanov2015-11-18 14:24:06 -0500
commitf69cd6bfa114ea02f3d10ddb2fe809a26eafb9a4 (patch)
tree05788868cfcc5fda30d37a83e18de6aab8b1735b /src/alloc.c
parent435cf35bcc28ab4220764dff7874f477310d9a48 (diff)
downloademacs-f69cd6bfa114ea02f3d10ddb2fe809a26eafb9a4.tar.gz
emacs-f69cd6bfa114ea02f3d10ddb2fe809a26eafb9a4.zip
Add new User Pointer (User_Ptr) type
* src/lisp.h: Add new Lisp_Misc_User_Ptr type. (XUSER_PTR): New User_Ptr accessor. * src/alloc.c (make_user_ptr): New function. (mark_object, sweep_misc): Handle Lisp_Misc_User_Ptr. * src/data.c (Ftype_of): Return 'user-ptr' for user pointer. (Fuser-ptrp): New user pointer type predicate function. (syms_of_data): New 'user-ptrp', 'user-ptr' symbol. New 'user-ptrp' subr. * src/print.c (print_object): Add printer for User_Ptr type.
Diffstat (limited to 'src/alloc.c')
-rw-r--r--src/alloc.c32
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. */
3716Lisp_Object
3717make_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
3714static void 3731static void
3715init_finalizer_list (struct Lisp_Finalizer *head) 3732init_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. */