+2015-01-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ 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 <eliz@gnu.org>
* dispnew.c (buffer_posn_from_coords): Fix the value of the column
\f
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. */
}
/* 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);
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);
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);
#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,