]> git.eshelyaron.com Git - emacs.git/commitdiff
(mark_memory): New argument OFFSET. All uses changed.
authorYAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
Mon, 13 Nov 2006 08:20:48 +0000 (08:20 +0000)
committerYAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
Mon, 13 Nov 2006 08:20:48 +0000 (08:20 +0000)
Fix address calculations for case END < START.
(mark_stack): Impose Lisp_Object alignment on jmp_buf.

src/ChangeLog
src/alloc.c

index c3fde3fac82628f9f2adfd5f63f9d41094a2dbce..ddc50a6877becd2f4ced7de12bb0a1d1a7d0d5d1 100644 (file)
@@ -1,3 +1,9 @@
+2006-11-13  Nozomu Ando  <nand@mac.com>
+
+       * alloc.c (mark_memory): New argument OFFSET.  All uses changed.
+       Fix address calculations for case END < START.
+       (mark_stack): Impose Lisp_Object alignment on jmp_buf.
+
 2006-11-12  Juanma Barranquero  <lekktu@gmail.com>
 
        * coding.c (Fencode_sjis_char, Fencode_big5_char):
index 2fd50009649a5af131fe3f7f5531a02d02271b8e..f3ca3e71a2926f7ac8ae3d819f6d338018f63963 100644 (file)
@@ -478,7 +478,7 @@ static int live_symbol_p P_ ((struct mem_node *, void *));
 static int live_float_p P_ ((struct mem_node *, void *));
 static int live_misc_p P_ ((struct mem_node *, void *));
 static void mark_maybe_object P_ ((Lisp_Object));
-static void mark_memory P_ ((void *, void *));
+static void mark_memory P_ ((void *, void *, int));
 static void mem_init P_ ((void));
 static struct mem_node *mem_insert P_ ((void *, void *, enum mem_type));
 static void mem_insert_fixup P_ ((struct mem_node *));
@@ -4327,11 +4327,13 @@ mark_maybe_pointer (p)
 }
 
 
-/* Mark Lisp objects referenced from the address range START..END.  */
+/* Mark Lisp objects referenced from the address range START+OFFSET..END
+   or END+OFFSET..START. */
 
 static void
-mark_memory (start, end)
+mark_memory (start, end, offset)
      void *start, *end;
+     int offset;
 {
   Lisp_Object *p;
   void **pp;
@@ -4350,7 +4352,7 @@ mark_memory (start, end)
     }
 
   /* Mark Lisp_Objects.  */
-  for (p = (Lisp_Object *) start; (void *) p < end; ++p)
+  for (p = (Lisp_Object *) ((char *) start + offset); (void *) p < end; ++p)
     mark_maybe_object (*p);
 
   /* Mark Lisp data pointed to.  This is necessary because, in some
@@ -4371,7 +4373,7 @@ mark_memory (start, end)
      away.  The only reference to the life string is through the
      pointer `s'.  */
 
-  for (pp = (void **) start; (void *) pp < end; ++pp)
+  for (pp = (void **) ((char *) start + offset); (void *) pp < end; ++pp)
     mark_maybe_pointer (*pp);
 }
 
@@ -4550,7 +4552,11 @@ static void
 mark_stack ()
 {
   int i;
-  jmp_buf j;
+  /* jmp_buf may not be aligned enough on darwin-ppc64 */
+  union aligned_jmpbuf {
+    Lisp_Object o;
+    jmp_buf j;
+  } j;
   volatile int stack_grows_down_p = (char *) &j > (char *) stack_base;
   void *end;
 
@@ -4581,7 +4587,7 @@ mark_stack ()
     }
 #endif /* GC_SETJMP_WORKS */
 
-  setjmp (j);
+  setjmp (j.j);
   end = stack_grows_down_p ? (char *) &j + sizeof j : (char *) &j;
 #endif /* not GC_SAVE_REGISTERS_ON_STACK */
 
@@ -4596,7 +4602,7 @@ mark_stack ()
 #endif
 #endif
   for (i = 0; i < sizeof (Lisp_Object); i += GC_LISP_OBJECT_ALIGNMENT)
-    mark_memory ((char *) stack_base + i, end);
+    mark_memory (stack_base, end, i);
   /* Allow for marking a secondary stack, like the register stack on the
      ia64.  */
 #ifdef GC_MARK_SECONDARY_STACK