diff options
| author | Richard M. Stallman | 1995-04-12 17:53:01 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 1995-04-12 17:53:01 +0000 |
| commit | fa05e2537208a8d0d7c44a6b1d0bc3289db9b04e (patch) | |
| tree | 0b802ed38dd336e4c2fd2856f20d6552bafac799 /src/alloc.c | |
| parent | cce7b8a03846872cbf9b41a3585536a6860df840 (diff) | |
| download | emacs-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.c | 15 |
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 | } |