From: YAMAMOTO Mitsuharu Date: Mon, 13 Nov 2006 08:20:48 +0000 (+0000) Subject: (mark_memory): New argument OFFSET. All uses changed. X-Git-Tag: emacs-pretest-22.0.91~94 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=55a314a5c2c62d5059e10b844af34d17726c0d02;p=emacs.git (mark_memory): New argument OFFSET. All uses changed. Fix address calculations for case END < START. (mark_stack): Impose Lisp_Object alignment on jmp_buf. --- diff --git a/src/ChangeLog b/src/ChangeLog index c3fde3fac82..ddc50a6877b 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2006-11-13 Nozomu Ando + + * 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 * coding.c (Fencode_sjis_char, Fencode_big5_char): diff --git a/src/alloc.c b/src/alloc.c index 2fd50009649..f3ca3e71a29 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -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