diff options
author | Richard M. Stallman <rms@gnu.org> | 1992-09-19 17:52:29 +0000 |
---|---|---|
committer | Richard M. Stallman <rms@gnu.org> | 1992-09-19 17:52:29 +0000 |
commit | 785cd37f2bde1eca830825bbfa8129f26cdc0e02 (patch) | |
tree | 58668e911f4f2df027222cf215674670358c929a /src/alloc.c | |
parent | 37bef2308fa614efa3b89d9f000cd0272c8955e6 (diff) | |
download | emacs-785cd37f2bde1eca830825bbfa8129f26cdc0e02.tar.gz emacs-785cd37f2bde1eca830825bbfa8129f26cdc0e02.tar.bz2 emacs-785cd37f2bde1eca830825bbfa8129f26cdc0e02.zip |
(mark_object): Save last 500 values of objptr.
Check for clobberage of ptr, when marking a vector.
Diffstat (limited to 'src/alloc.c')
-rw-r--r-- | src/alloc.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/src/alloc.c b/src/alloc.c index 8b8b1d3bd7d..495c702d038 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -1269,6 +1269,10 @@ clear_marks () lives in the last slot in the chain. We recognize the end because it is < (unsigned) STRING_BLOCK_SIZE. */ +#define LAST_MARKED_SIZE 500 +Lisp_Object *last_marked[LAST_MARKED_SIZE]; +int last_marked_index; + static void mark_object (objptr) Lisp_Object *objptr; @@ -1284,6 +1288,10 @@ mark_object (objptr) && (PNTR_COMPARISON_TYPE) XPNTR (obj) >= (PNTR_COMPARISON_TYPE) pure) return; + last_marked[last_marked_index++] = objptr; + if (last_marked_index == LAST_MARKED_SIZE) + last_marked_index = 0; + #ifdef SWITCH_ENUM_BUG switch ((int) XGCTYPE (obj)) #else @@ -1328,12 +1336,17 @@ mark_object (objptr) { register struct Lisp_Vector *ptr = XVECTOR (obj); register int size = ptr->size; + struct Lisp_Vector *volatile ptr1 = ptr; register int i; if (size & ARRAY_MARK_FLAG) break; /* Already marked */ ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ for (i = 0; i < size; i++) /* and then mark its elements */ - mark_object (&ptr->contents[i]); + { + if (ptr != ptr1) + abort (); + mark_object (&ptr->contents[i]); + } } break; |