]> git.eshelyaron.com Git - emacs.git/commitdiff
* src/alloc.c (mark_maybe_pointer): Also check wide-int's emacs_value
authorStefan Monnier <monnier@iro.umontreal.ca>
Sun, 10 Jan 2016 02:15:12 +0000 (21:15 -0500)
committerStefan Monnier <monnier@iro.umontreal.ca>
Sun, 10 Jan 2016 02:15:12 +0000 (21:15 -0500)
(mark_memory): Simplify loop.  Don't assume a pointer-sized word can be
cast to Lisp_Object.

src/alloc.c

index 9ec44b8a2c35fee16fc257e4b1ec587bbebe4975..e1b0d2e4a6053c813829d1477d0a40e573e003de 100644 (file)
@@ -4607,8 +4607,15 @@ mark_maybe_pointer (void *p)
     VALGRIND_MAKE_MEM_DEFINED (&p, sizeof (p));
 #endif
 
-  if (!maybe_lisp_pointer (p))
-    return;
+  if (sizeof (Lisp_Object) == sizeof (void *) || !HAVE_MODULES)
+    {
+      if (!maybe_lisp_pointer (p))
+        return;
+    }
+  else
+    /* For the wide-int case, we also have to accept emacs_value "tagged
+       pointers", which can be generated by emacs-module.c's value_to_lisp.  */
+    p = (void*)((uintptr_t) p & ~(GCALIGNMENT - 1));
 
   m = mem_find (p);
   if (m != MEM_NIL)
@@ -4685,8 +4692,7 @@ mark_maybe_pointer (void *p)
 static void ATTRIBUTE_NO_SANITIZE_ADDRESS
 mark_memory (void *start, void *end)
 {
-  void **pp;
-  int i;
+  char *pp;
 
   /* Make START the pointer to the start of the memory region,
      if it isn't already.  */
@@ -4697,6 +4703,8 @@ mark_memory (void *start, void *end)
       end = tem;
     }
 
+  eassert (((uintptr_t) start) % GC_POINTER_ALIGNMENT == 0);
+
   /* Mark Lisp data pointed to.  This is necessary because, in some
      situations, the C compiler optimizes Lisp objects away, so that
      only a pointer to them remains.  Example:
@@ -4715,13 +4723,11 @@ mark_memory (void *start, void *end)
      away.  The only reference to the life string is through the
      pointer `s'.  */
 
-  for (pp = start; (void *) pp < end; pp++)
-    for (i = 0; i < sizeof *pp; i += GC_POINTER_ALIGNMENT)
-      {
-       void *p = *(void **) ((char *) pp + i);
-       mark_maybe_pointer (p);
-       mark_maybe_object (XIL ((intptr_t) p));
-      }
+  for (pp = start; (void*)pp < end; pp = pp + GC_POINTER_ALIGNMENT)
+    {
+      mark_maybe_pointer (*(void **) pp);
+      mark_maybe_object (*(Lisp_Object *) pp);
+    }
 }
 
 #if !defined GC_SAVE_REGISTERS_ON_STACK && !defined GC_SETJMP_WORKS