aboutsummaryrefslogtreecommitdiffstats
path: root/src/alloc.c
diff options
context:
space:
mode:
authorRichard M. Stallman1995-04-12 17:53:01 +0000
committerRichard M. Stallman1995-04-12 17:53:01 +0000
commitfa05e2537208a8d0d7c44a6b1d0bc3289db9b04e (patch)
tree0b802ed38dd336e4c2fd2856f20d6552bafac799 /src/alloc.c
parentcce7b8a03846872cbf9b41a3585536a6860df840 (diff)
downloademacs-fa05e2537208a8d0d7c44a6b1d0bc3289db9b04e.tar.gz
emacs-fa05e2537208a8d0d7c44a6b1d0bc3289db9b04e.zip
(gc_sweep): If a misc has type Lisp_Misc_Free,
keep it on the free list. Sum pseudovector sizes properly.
Diffstat (limited to 'src/alloc.c')
-rw-r--r--src/alloc.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/alloc.c b/src/alloc.c
index 32c5a569fcb..e5134950a1a 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -2045,6 +2045,8 @@ gc_sweep ()
2045 for (mblk = marker_block; mblk; mblk = mblk->next) 2045 for (mblk = marker_block; mblk; mblk = mblk->next)
2046 { 2046 {
2047 register int i; 2047 register int i;
2048 int already_free = -1;
2049
2048 for (i = 0; i < lim; i++) 2050 for (i = 0; i < lim; i++)
2049 { 2051 {
2050 Lisp_Object *markword; 2052 Lisp_Object *markword;
@@ -2060,6 +2062,11 @@ gc_sweep ()
2060 case Lisp_Misc_Overlay: 2062 case Lisp_Misc_Overlay:
2061 markword = &mblk->markers[i].u_overlay.plist; 2063 markword = &mblk->markers[i].u_overlay.plist;
2062 break; 2064 break;
2065 case Lisp_Misc_Free:
2066 /* If the object was already free, keep it
2067 on the free list. */
2068 markword = &already_free;
2069 break;
2063 default: 2070 default:
2064 markword = 0; 2071 markword = 0;
2065 break; 2072 break;
@@ -2074,7 +2081,8 @@ gc_sweep ()
2074 XSETMARKER (tem, tem1); 2081 XSETMARKER (tem, tem1);
2075 unchain_marker (tem); 2082 unchain_marker (tem);
2076 } 2083 }
2077 /* We could leave the type alone, since nobody checks it, 2084 /* Set the type of the freed object to Lisp_Misc_Free.
2085 We could leave the type alone, since nobody checks it,
2078 but this might catch bugs faster. */ 2086 but this might catch bugs faster. */
2079 mblk->markers[i].u_marker.type = Lisp_Misc_Free; 2087 mblk->markers[i].u_marker.type = Lisp_Misc_Free;
2080 mblk->markers[i].u_free.chain = marker_free_list; 2088 mblk->markers[i].u_free.chain = marker_free_list;
@@ -2154,7 +2162,10 @@ gc_sweep ()
2154 else 2162 else
2155 { 2163 {
2156 vector->size &= ~ARRAY_MARK_FLAG; 2164 vector->size &= ~ARRAY_MARK_FLAG;
2157 total_vector_size += vector->size; 2165 if (vector->size & PSEUDOVECTOR_FLAG)
2166 total_vector_size += (PSEUDOVECTOR_SIZE_MASK & vector->size);
2167 else
2168 total_vector_size += vector->size;
2158 prev = vector, vector = vector->next; 2169 prev = vector, vector = vector->next;
2159 } 2170 }
2160 } 2171 }