# HG changeset patch # User Richard M. Stallman # Date 716925149 0 # Node ID 2b07af77d7ec93725041d0feb41305a2d49c2120 # Parent a9aeeaa9da8f56f06b5993fb043849953b96786c (mark_object): Save last 500 values of objptr. Check for clobberage of ptr, when marking a vector. diff -r a9aeeaa9da8f -r 2b07af77d7ec src/alloc.c --- a/src/alloc.c Sat Sep 19 17:52:07 1992 +0000 +++ b/src/alloc.c Sat Sep 19 17:52:29 1992 +0000 @@ -1269,6 +1269,10 @@ 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 @@ && (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 @@ { 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;