aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/alloc.c15
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 ()
1269 lives in the last slot in the chain. We recognize the end 1269 lives in the last slot in the chain. We recognize the end
1270 because it is < (unsigned) STRING_BLOCK_SIZE. */ 1270 because it is < (unsigned) STRING_BLOCK_SIZE. */
1271 1271
1272#define LAST_MARKED_SIZE 500
1273Lisp_Object *last_marked[LAST_MARKED_SIZE];
1274int last_marked_index;
1275
1272static void 1276static void
1273mark_object (objptr) 1277mark_object (objptr)
1274 Lisp_Object *objptr; 1278 Lisp_Object *objptr;
@@ -1284,6 +1288,10 @@ mark_object (objptr)
1284 && (PNTR_COMPARISON_TYPE) XPNTR (obj) >= (PNTR_COMPARISON_TYPE) pure) 1288 && (PNTR_COMPARISON_TYPE) XPNTR (obj) >= (PNTR_COMPARISON_TYPE) pure)
1285 return; 1289 return;
1286 1290
1291 last_marked[last_marked_index++] = objptr;
1292 if (last_marked_index == LAST_MARKED_SIZE)
1293 last_marked_index = 0;
1294
1287#ifdef SWITCH_ENUM_BUG 1295#ifdef SWITCH_ENUM_BUG
1288 switch ((int) XGCTYPE (obj)) 1296 switch ((int) XGCTYPE (obj))
1289#else 1297#else
@@ -1328,12 +1336,17 @@ mark_object (objptr)
1328 { 1336 {
1329 register struct Lisp_Vector *ptr = XVECTOR (obj); 1337 register struct Lisp_Vector *ptr = XVECTOR (obj);
1330 register int size = ptr->size; 1338 register int size = ptr->size;
1339 struct Lisp_Vector *volatile ptr1 = ptr;
1331 register int i; 1340 register int i;
1332 1341
1333 if (size & ARRAY_MARK_FLAG) break; /* Already marked */ 1342 if (size & ARRAY_MARK_FLAG) break; /* Already marked */
1334 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ 1343 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */
1335 for (i = 0; i < size; i++) /* and then mark its elements */ 1344 for (i = 0; i < size; i++) /* and then mark its elements */
1336 mark_object (&ptr->contents[i]); 1345 {
1346 if (ptr != ptr1)
1347 abort ();
1348 mark_object (&ptr->contents[i]);
1349 }
1337 } 1350 }
1338 break; 1351 break;
1339 1352