From: Paul Eggert Date: Fri, 9 Jan 2015 16:04:36 +0000 (-0800) Subject: Refactor pointer-to-integer conversion X-Git-Tag: emacs-25.0.90~2605^2~17 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=d1f848ffb9896fe2bd8eb9e7d70a49ca9ff9522f;p=emacs.git Refactor pointer-to-integer conversion * gfilenotify.c (monitor_to_lisp, lisp_to_monitor): Rename and move to lisp.h. All uses changed. * lisp.h (XINTPTR, make_pointer_integer): New inline functions, which are renamed from gfilenotify.c's lisp_to_monitor and monitor_to_lisp, and with more-generic void * signatures. --- diff --git a/src/ChangeLog b/src/ChangeLog index c302f95d3fa..c11ba11715b 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,12 @@ +2015-01-09 Paul Eggert + + Refactor pointer-to-integer conversion + * gfilenotify.c (monitor_to_lisp, lisp_to_monitor): + Rename and move to lisp.h. All uses changed. + * lisp.h (XINTPTR, make_pointer_integer): New inline functions, + which are renamed from gfilenotify.c's lisp_to_monitor and + monitor_to_lisp, and with more-generic void * signatures. + 2015-01-08 Eli Zaretskii * dispnew.c (buffer_posn_from_coords): Fix the value of the column diff --git a/src/gfilenotify.c b/src/gfilenotify.c index 88222b5bf05..e03bec93541 100644 --- a/src/gfilenotify.c +++ b/src/gfilenotify.c @@ -31,22 +31,6 @@ along with GNU Emacs. If not, see . */ static Lisp_Object watch_list; -/* Convert a monitor to a Lisp integer and back. On all known glib - platforms, converting the sum of MONITOR and Lisp_Int0 directly to - a Lisp_Object value results in a Lisp integer, which is safe. */ - -static Lisp_Object -monitor_to_lisp (GFileMonitor *monitor) -{ - return XIL (TAG_PTR (Lisp_Int0, monitor)); -} - -static GFileMonitor * -lisp_to_monitor (Lisp_Object watch_descriptor) -{ - return XUNTAG (watch_descriptor, Lisp_Int0); -} - /* This is the callback function for arriving signals from g_file_monitor. It shall create a Lisp event, and put it into Emacs input queue. */ @@ -93,7 +77,7 @@ dir_monitor_callback (GFileMonitor *monitor, } /* Determine callback function. */ - monitor_object = monitor_to_lisp (monitor); + monitor_object = make_pointer_integer (monitor); eassert (INTEGERP (monitor_object)); watch_object = assq_no_quit (monitor_object, watch_list); @@ -192,9 +176,9 @@ will be reported only in case of the 'moved' event. */) if (! monitor) xsignal2 (Qfile_notify_error, build_string ("Cannot watch file"), file); - Lisp_Object watch_descriptor = monitor_to_lisp (monitor); + Lisp_Object watch_descriptor = make_pointer_integer (monitor); - /* Check the dicey assumption that monitor_to_lisp is safe. */ + /* Check the dicey assumption that make_pointer_integer is safe. */ if (! INTEGERP (watch_descriptor)) { g_object_unref (monitor); @@ -225,7 +209,7 @@ WATCH-DESCRIPTOR should be an object returned by `gfile-add-watch'. */) watch_descriptor); eassert (INTEGERP (watch_descriptor)); - GFileMonitor *monitor = lisp_to_monitor (watch_descriptor); + GFileMonitor *monitor = XINTPTR (watch_descriptor); if (!g_file_monitor_cancel (monitor)) xsignal2 (Qfile_notify_error, build_string ("Could not rm watch"), watch_descriptor); diff --git a/src/lisp.h b/src/lisp.h index 5a4198ef683..4571c455a7b 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -1112,6 +1112,25 @@ make_lisp_proc (struct Lisp_Process *p) #define XSETBOOL_VECTOR(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_BOOL_VECTOR)) #define XSETSUB_CHAR_TABLE(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_SUB_CHAR_TABLE)) +/* Efficiently convert a pointer to a Lisp object and back. The + pointer is represented as a Lisp integer, so the garbage collector + does not know about it. The pointer should not have both Lisp_Int1 + bits set, which makes this conversion inherently unportable. */ + +INLINE void * +XINTPTR (Lisp_Object a) +{ + return XUNTAG (a, Lisp_Int0); +} + +INLINE Lisp_Object +make_pointer_integer (void *p) +{ + Lisp_Object a = XIL (TAG_PTR (Lisp_Int0, p)); + eassert (INTEGERP (a) && XINTPTR (a) == p); + return a; +} + /* Type checking. */ LISP_MACRO_DEFUN_VOID (CHECK_TYPE,