aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRichard M. Stallman <[email protected]>1995-04-12 17:53:01 +0000
committerRichard M. Stallman <[email protected]>1995-04-12 17:53:01 +0000
commitfa05e2537208a8d0d7c44a6b1d0bc3289db9b04e (patch)
tree0b802ed38dd336e4c2fd2856f20d6552bafac799 /src
parentcce7b8a03846872cbf9b41a3585536a6860df840 (diff)
(gc_sweep): If a misc has type Lisp_Misc_Free,
keep it on the free list. Sum pseudovector sizes properly.
Diffstat (limited to 'src')
-rw-r--r--src/alloc.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/alloc.c b/src/alloc.c
index 32c5a569fc..e5134950a1 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -2045,6 +2045,8 @@ gc_sweep ()
for (mblk = marker_block; mblk; mblk = mblk->next)
{
register int i;
+ int already_free = -1;
+
for (i = 0; i < lim; i++)
{
Lisp_Object *markword;
@@ -2060,6 +2062,11 @@ gc_sweep ()
case Lisp_Misc_Overlay:
markword = &mblk->markers[i].u_overlay.plist;
break;
+ case Lisp_Misc_Free:
+ /* If the object was already free, keep it
+ on the free list. */
+ markword = &already_free;
+ break;
default:
markword = 0;
break;
@@ -2074,7 +2081,8 @@ gc_sweep ()
XSETMARKER (tem, tem1);
unchain_marker (tem);
}
- /* We could leave the type alone, since nobody checks it,
+ /* Set the type of the freed object to Lisp_Misc_Free.
+ We could leave the type alone, since nobody checks it,
but this might catch bugs faster. */
mblk->markers[i].u_marker.type = Lisp_Misc_Free;
mblk->markers[i].u_free.chain = marker_free_list;
@@ -2154,7 +2162,10 @@ gc_sweep ()
else
{
vector->size &= ~ARRAY_MARK_FLAG;
- total_vector_size += vector->size;
+ if (vector->size & PSEUDOVECTOR_FLAG)
+ total_vector_size += (PSEUDOVECTOR_SIZE_MASK & vector->size);
+ else
+ total_vector_size += vector->size;
prev = vector, vector = vector->next;
}
}