diff options
| author | Richard M. Stallman | 1992-09-19 17:52:29 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 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.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 () | |||
| 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 | ||
| 1273 | Lisp_Object *last_marked[LAST_MARKED_SIZE]; | ||
| 1274 | int last_marked_index; | ||
| 1275 | |||
| 1272 | static void | 1276 | static void |
| 1273 | mark_object (objptr) | 1277 | mark_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 | ||