diff options
author | Miles Bader <miles@gnu.org> | 2006-11-21 08:56:38 +0000 |
---|---|---|
committer | Miles Bader <miles@gnu.org> | 2006-11-21 08:56:38 +0000 |
commit | eeb7eaa88482114822730380196f4e7a3c0870dd (patch) | |
tree | e8c3861b628ad53c6b8f158b74d1be8bd8590aeb /src/alloc.c | |
parent | b15d6f4265b10fbc413caca03246feff9c87d53e (diff) | |
parent | a98d0b8e8948293de119c4cdd7a8c79318ad82fa (diff) | |
download | emacs-eeb7eaa88482114822730380196f4e7a3c0870dd.tar.gz |
Merge from emacs--devo--0
Patches applied:
* emacs--devo--0 (patch 505-522)
- Update from CVS
- Merge from gnus--rel--5.10
- Update from CVS: etc/TUTORIAL.cn: Updated.
- Merge from erc--emacs--22
* gnus--rel--5.10 (patch 164-167)
- Update from CVS
Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-137
Diffstat (limited to 'src/alloc.c')
-rw-r--r-- | src/alloc.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/src/alloc.c b/src/alloc.c index 94be9fa6132..8ebaac74c08 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 *)); @@ -4284,11 +4284,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; @@ -4307,7 +4309,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 @@ -4328,7 +4330,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); } @@ -4507,7 +4509,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; @@ -4538,7 +4544,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 */ @@ -4553,7 +4559,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 |