emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master d1f848f: Refactor pointer-to-integer conversion


From: Paul Eggert
Subject: [Emacs-diffs] master d1f848f: Refactor pointer-to-integer conversion
Date: Fri, 09 Jan 2015 16:22:39 +0000

branch: master
commit d1f848ffb9896fe2bd8eb9e7d70a49ca9ff9522f
Author: Paul Eggert <address@hidden>
Commit: Paul Eggert <address@hidden>

    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.
---
 src/ChangeLog     |    9 +++++++++
 src/gfilenotify.c |   24 ++++--------------------
 src/lisp.h        |   19 +++++++++++++++++++
 3 files changed, 32 insertions(+), 20 deletions(-)

diff --git a/src/ChangeLog b/src/ChangeLog
index c302f95..c11ba11 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,12 @@
+2015-01-09  Paul Eggert  <address@hidden>
+
+       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  <address@hidden>
 
        * dispnew.c (buffer_posn_from_coords): Fix the value of the column
diff --git a/src/gfilenotify.c b/src/gfilenotify.c
index 88222b5..e03bec9 100644
--- a/src/gfilenotify.c
+++ b/src/gfilenotify.c
@@ -31,22 +31,6 @@ along with GNU Emacs.  If not, see 
<http://www.gnu.org/licenses/>.  */
 
 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 5a4198e..4571c45 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,



reply via email to

[Prev in Thread] Current Thread [Next in Thread]