diff options
| author | Stefan Monnier | 2003-06-27 21:54:38 +0000 |
|---|---|---|
| committer | Stefan Monnier | 2003-06-27 21:54:38 +0000 |
| commit | 3ef06d12cd6e9d8a0d74397a8e3f73d9609f5eeb (patch) | |
| tree | 7cfb2b9db649d5aa35ab7df0cb7c8bb438905f86 /src | |
| parent | 356d2ee4664f65562125a2414d8149ce7fb01321 (diff) | |
| download | emacs-3ef06d12cd6e9d8a0d74397a8e3f73d9609f5eeb.tar.gz emacs-3ef06d12cd6e9d8a0d74397a8e3f73d9609f5eeb.zip | |
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
(GC_STRING_BYTES): Don't mask markbit (it's only used on `size').
(allocate_buffer): Move.
(string_bytes): Don't mask markbit of `size_byte'.
(mark_maybe_object, mark_maybe_pointer, Fgarbage_collect)
(mark_object, mark_buffer, survives_gc_p, gc_sweep):
Use the `size' field of buffers (rather than the `name' field) for
the mark bit, as is done for all other vectorlike objects.
Use the new macros to access the mark bit of vectorlike objects.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 12 | ||||
| -rw-r--r-- | src/alloc.c | 101 |
2 files changed, 59 insertions, 54 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 33dbe6c8a2f..84facf45775 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,15 @@ | |||
| 1 | 2003-06-27 Stefan Monnier <monnier@cs.yale.edu> | ||
| 2 | |||
| 3 | * alloc.c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros. | ||
| 4 | (GC_STRING_BYTES): Don't mask markbit (it's only used on `size'). | ||
| 5 | (allocate_buffer): Move. | ||
| 6 | (string_bytes): Don't mask markbit of `size_byte'. | ||
| 7 | (mark_maybe_object, mark_maybe_pointer, Fgarbage_collect) | ||
| 8 | (mark_object, mark_buffer, survives_gc_p, gc_sweep): | ||
| 9 | Use the `size' field of buffers (rather than the `name' field) for | ||
| 10 | the mark bit, as is done for all other vectorlike objects. | ||
| 11 | Use the new macros to access the mark bit of vectorlike objects. | ||
| 12 | |||
| 1 | 2003-06-26 Richard M. Stallman <rms@gnu.org> | 13 | 2003-06-26 Richard M. Stallman <rms@gnu.org> |
| 2 | 14 | ||
| 3 | * puresize.h (BASE_PURESIZE): Increment base size. | 15 | * puresize.h (BASE_PURESIZE): Increment base size. |
diff --git a/src/alloc.c b/src/alloc.c index 886c489e21f..fabc1280fa8 100644 --- a/src/alloc.c +++ b/src/alloc.c | |||
| @@ -95,12 +95,16 @@ static __malloc_size_t bytes_used_when_full; | |||
| 95 | #define UNMARK_STRING(S) ((S)->size &= ~MARKBIT) | 95 | #define UNMARK_STRING(S) ((S)->size &= ~MARKBIT) |
| 96 | #define STRING_MARKED_P(S) ((S)->size & MARKBIT) | 96 | #define STRING_MARKED_P(S) ((S)->size & MARKBIT) |
| 97 | 97 | ||
| 98 | #define VECTOR_MARK(V) ((V)->size |= ARRAY_MARK_FLAG) | ||
| 99 | #define VECTOR_UNMARK(V) ((V)->size &= ~ARRAY_MARK_FLAG) | ||
| 100 | #define VECTOR_MARKED_P(V) ((V)->size & ARRAY_MARK_FLAG) | ||
| 101 | |||
| 98 | /* Value is the number of bytes/chars of S, a pointer to a struct | 102 | /* Value is the number of bytes/chars of S, a pointer to a struct |
| 99 | Lisp_String. This must be used instead of STRING_BYTES (S) or | 103 | Lisp_String. This must be used instead of STRING_BYTES (S) or |
| 100 | S->size during GC, because S->size contains the mark bit for | 104 | S->size during GC, because S->size contains the mark bit for |
| 101 | strings. */ | 105 | strings. */ |
| 102 | 106 | ||
| 103 | #define GC_STRING_BYTES(S) (STRING_BYTES (S) & ~MARKBIT) | 107 | #define GC_STRING_BYTES(S) (STRING_BYTES (S)) |
| 104 | #define GC_STRING_CHARS(S) ((S)->size & ~MARKBIT) | 108 | #define GC_STRING_CHARS(S) ((S)->size & ~MARKBIT) |
| 105 | 109 | ||
| 106 | /* Number of bytes of consing done since the last gc. */ | 110 | /* Number of bytes of consing done since the last gc. */ |
| @@ -616,20 +620,6 @@ lisp_malloc (nbytes, type) | |||
| 616 | return val; | 620 | return val; |
| 617 | } | 621 | } |
| 618 | 622 | ||
| 619 | |||
| 620 | /* Return a new buffer structure allocated from the heap with | ||
| 621 | a call to lisp_malloc. */ | ||
| 622 | |||
| 623 | struct buffer * | ||
| 624 | allocate_buffer () | ||
| 625 | { | ||
| 626 | struct buffer *b | ||
| 627 | = (struct buffer *) lisp_malloc (sizeof (struct buffer), | ||
| 628 | MEM_TYPE_BUFFER); | ||
| 629 | return b; | ||
| 630 | } | ||
| 631 | |||
| 632 | |||
| 633 | /* Free BLOCK. This must be called to free memory allocated with a | 623 | /* Free BLOCK. This must be called to free memory allocated with a |
| 634 | call to lisp_malloc. */ | 624 | call to lisp_malloc. */ |
| 635 | 625 | ||
| @@ -645,6 +635,19 @@ lisp_free (block) | |||
| 645 | UNBLOCK_INPUT; | 635 | UNBLOCK_INPUT; |
| 646 | } | 636 | } |
| 647 | 637 | ||
| 638 | |||
| 639 | /* Return a new buffer structure allocated from the heap with | ||
| 640 | a call to lisp_malloc. */ | ||
| 641 | |||
| 642 | struct buffer * | ||
| 643 | allocate_buffer () | ||
| 644 | { | ||
| 645 | struct buffer *b | ||
| 646 | = (struct buffer *) lisp_malloc (sizeof (struct buffer), | ||
| 647 | MEM_TYPE_BUFFER); | ||
| 648 | return b; | ||
| 649 | } | ||
| 650 | |||
| 648 | 651 | ||
| 649 | /* Arranging to disable input signals while we're in malloc. | 652 | /* Arranging to disable input signals while we're in malloc. |
| 650 | 653 | ||
| @@ -1223,7 +1226,7 @@ int | |||
| 1223 | string_bytes (s) | 1226 | string_bytes (s) |
| 1224 | struct Lisp_String *s; | 1227 | struct Lisp_String *s; |
| 1225 | { | 1228 | { |
| 1226 | int nbytes = (s->size_byte < 0 ? s->size : s->size_byte) & ~MARKBIT; | 1229 | int nbytes = (s->size_byte < 0 ? s->size & ~MARKBIT : s->size_byte); |
| 1227 | if (!PURE_POINTER_P (s) | 1230 | if (!PURE_POINTER_P (s) |
| 1228 | && s->data | 1231 | && s->data |
| 1229 | && nbytes != SDATA_NBYTES (SDATA_OF_STRING (s))) | 1232 | && nbytes != SDATA_NBYTES (SDATA_OF_STRING (s))) |
| @@ -3400,10 +3403,9 @@ mark_maybe_object (obj) | |||
| 3400 | buffer because checking that dereferences the pointer | 3403 | buffer because checking that dereferences the pointer |
| 3401 | PO which might point anywhere. */ | 3404 | PO which might point anywhere. */ |
| 3402 | if (live_vector_p (m, po)) | 3405 | if (live_vector_p (m, po)) |
| 3403 | mark_p = (!GC_SUBRP (obj) | 3406 | mark_p = !GC_SUBRP (obj) && !VECTOR_MARKED_P (XVECTOR (obj)); |
| 3404 | && !(XVECTOR (obj)->size & ARRAY_MARK_FLAG)); | ||
| 3405 | else if (live_buffer_p (m, po)) | 3407 | else if (live_buffer_p (m, po)) |
| 3406 | mark_p = GC_BUFFERP (obj) && !XMARKBIT (XBUFFER (obj)->name); | 3408 | mark_p = GC_BUFFERP (obj) && !VECTOR_MARKED_P (XBUFFER (obj)); |
| 3407 | break; | 3409 | break; |
| 3408 | 3410 | ||
| 3409 | case Lisp_Misc: | 3411 | case Lisp_Misc: |
| @@ -3454,8 +3456,7 @@ mark_maybe_pointer (p) | |||
| 3454 | break; | 3456 | break; |
| 3455 | 3457 | ||
| 3456 | case MEM_TYPE_BUFFER: | 3458 | case MEM_TYPE_BUFFER: |
| 3457 | if (live_buffer_p (m, p) | 3459 | if (live_buffer_p (m, p) && !VECTOR_MARKED_P((struct buffer *)p)) |
| 3458 | && !XMARKBIT (((struct buffer *) p)->name)) | ||
| 3459 | XSETVECTOR (obj, p); | 3460 | XSETVECTOR (obj, p); |
| 3460 | break; | 3461 | break; |
| 3461 | 3462 | ||
| @@ -3496,8 +3497,7 @@ mark_maybe_pointer (p) | |||
| 3496 | { | 3497 | { |
| 3497 | Lisp_Object tem; | 3498 | Lisp_Object tem; |
| 3498 | XSETVECTOR (tem, p); | 3499 | XSETVECTOR (tem, p); |
| 3499 | if (!GC_SUBRP (tem) | 3500 | if (!GC_SUBRP (tem) && !VECTOR_MARKED_P (XVECTOR (tem))) |
| 3500 | && !(XVECTOR (tem)->size & ARRAY_MARK_FLAG)) | ||
| 3501 | obj = tem; | 3501 | obj = tem; |
| 3502 | } | 3502 | } |
| 3503 | break; | 3503 | break; |
| @@ -4286,8 +4286,8 @@ Garbage collection happens automatically if you cons more than | |||
| 4286 | for (; i >= 0; i--) | 4286 | for (; i >= 0; i--) |
| 4287 | XUNMARK (backlist->args[i]); | 4287 | XUNMARK (backlist->args[i]); |
| 4288 | } | 4288 | } |
| 4289 | XUNMARK (buffer_defaults.name); | 4289 | VECTOR_UNMARK (&buffer_defaults); |
| 4290 | XUNMARK (buffer_local_symbols.name); | 4290 | VECTOR_UNMARK (&buffer_local_symbols); |
| 4291 | 4291 | ||
| 4292 | #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES && 0 | 4292 | #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES && 0 |
| 4293 | dump_zombies (); | 4293 | dump_zombies (); |
| @@ -4548,7 +4548,7 @@ mark_object (argptr) | |||
| 4548 | 4548 | ||
| 4549 | if (GC_BUFFERP (obj)) | 4549 | if (GC_BUFFERP (obj)) |
| 4550 | { | 4550 | { |
| 4551 | if (!XMARKBIT (XBUFFER (obj)->name)) | 4551 | if (!VECTOR_MARKED_P (XBUFFER (obj))) |
| 4552 | { | 4552 | { |
| 4553 | #ifdef GC_CHECK_MARKED_OBJECTS | 4553 | #ifdef GC_CHECK_MARKED_OBJECTS |
| 4554 | if (po != &buffer_defaults && po != &buffer_local_symbols) | 4554 | if (po != &buffer_defaults && po != &buffer_local_symbols) |
| @@ -4574,11 +4574,11 @@ mark_object (argptr) | |||
| 4574 | register EMACS_INT size = ptr->size; | 4574 | register EMACS_INT size = ptr->size; |
| 4575 | register int i; | 4575 | register int i; |
| 4576 | 4576 | ||
| 4577 | if (size & ARRAY_MARK_FLAG) | 4577 | if (VECTOR_MARKED_P (ptr)) |
| 4578 | break; /* Already marked */ | 4578 | break; /* Already marked */ |
| 4579 | 4579 | ||
| 4580 | CHECK_LIVE (live_vector_p); | 4580 | CHECK_LIVE (live_vector_p); |
| 4581 | ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ | 4581 | VECTOR_MARK (ptr); /* Else mark it */ |
| 4582 | size &= PSEUDOVECTOR_SIZE_MASK; | 4582 | size &= PSEUDOVECTOR_SIZE_MASK; |
| 4583 | for (i = 0; i < size; i++) /* and then mark its elements */ | 4583 | for (i = 0; i < size; i++) /* and then mark its elements */ |
| 4584 | { | 4584 | { |
| @@ -4593,10 +4593,9 @@ mark_object (argptr) | |||
| 4593 | else if (GC_FRAMEP (obj)) | 4593 | else if (GC_FRAMEP (obj)) |
| 4594 | { | 4594 | { |
| 4595 | register struct frame *ptr = XFRAME (obj); | 4595 | register struct frame *ptr = XFRAME (obj); |
| 4596 | register EMACS_INT size = ptr->size; | ||
| 4597 | 4596 | ||
| 4598 | if (size & ARRAY_MARK_FLAG) break; /* Already marked */ | 4597 | if (VECTOR_MARKED_P (ptr)) break; /* Already marked */ |
| 4599 | ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ | 4598 | VECTOR_MARK (ptr); /* Else mark it */ |
| 4600 | 4599 | ||
| 4601 | CHECK_LIVE (live_vector_p); | 4600 | CHECK_LIVE (live_vector_p); |
| 4602 | mark_object (&ptr->name); | 4601 | mark_object (&ptr->name); |
| @@ -4627,25 +4626,24 @@ mark_object (argptr) | |||
| 4627 | { | 4626 | { |
| 4628 | register struct Lisp_Vector *ptr = XVECTOR (obj); | 4627 | register struct Lisp_Vector *ptr = XVECTOR (obj); |
| 4629 | 4628 | ||
| 4630 | if (ptr->size & ARRAY_MARK_FLAG) | 4629 | if (VECTOR_MARKED_P (ptr)) |
| 4631 | break; /* Already marked */ | 4630 | break; /* Already marked */ |
| 4632 | CHECK_LIVE (live_vector_p); | 4631 | CHECK_LIVE (live_vector_p); |
| 4633 | ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ | 4632 | VECTOR_MARK (ptr); /* Else mark it */ |
| 4634 | } | 4633 | } |
| 4635 | else if (GC_WINDOWP (obj)) | 4634 | else if (GC_WINDOWP (obj)) |
| 4636 | { | 4635 | { |
| 4637 | register struct Lisp_Vector *ptr = XVECTOR (obj); | 4636 | register struct Lisp_Vector *ptr = XVECTOR (obj); |
| 4638 | struct window *w = XWINDOW (obj); | 4637 | struct window *w = XWINDOW (obj); |
| 4639 | register EMACS_INT size = ptr->size; | ||
| 4640 | register int i; | 4638 | register int i; |
| 4641 | 4639 | ||
| 4642 | /* Stop if already marked. */ | 4640 | /* Stop if already marked. */ |
| 4643 | if (size & ARRAY_MARK_FLAG) | 4641 | if (VECTOR_MARKED_P (ptr)) |
| 4644 | break; | 4642 | break; |
| 4645 | 4643 | ||
| 4646 | /* Mark it. */ | 4644 | /* Mark it. */ |
| 4647 | CHECK_LIVE (live_vector_p); | 4645 | CHECK_LIVE (live_vector_p); |
| 4648 | ptr->size |= ARRAY_MARK_FLAG; | 4646 | VECTOR_MARK (ptr); |
| 4649 | 4647 | ||
| 4650 | /* There is no Lisp data above The member CURRENT_MATRIX in | 4648 | /* There is no Lisp data above The member CURRENT_MATRIX in |
| 4651 | struct WINDOW. Stop marking when that slot is reached. */ | 4649 | struct WINDOW. Stop marking when that slot is reached. */ |
| @@ -4668,15 +4666,14 @@ mark_object (argptr) | |||
| 4668 | else if (GC_HASH_TABLE_P (obj)) | 4666 | else if (GC_HASH_TABLE_P (obj)) |
| 4669 | { | 4667 | { |
| 4670 | struct Lisp_Hash_Table *h = XHASH_TABLE (obj); | 4668 | struct Lisp_Hash_Table *h = XHASH_TABLE (obj); |
| 4671 | EMACS_INT size = h->size; | ||
| 4672 | 4669 | ||
| 4673 | /* Stop if already marked. */ | 4670 | /* Stop if already marked. */ |
| 4674 | if (size & ARRAY_MARK_FLAG) | 4671 | if (VECTOR_MARKED_P (h)) |
| 4675 | break; | 4672 | break; |
| 4676 | 4673 | ||
| 4677 | /* Mark it. */ | 4674 | /* Mark it. */ |
| 4678 | CHECK_LIVE (live_vector_p); | 4675 | CHECK_LIVE (live_vector_p); |
| 4679 | h->size |= ARRAY_MARK_FLAG; | 4676 | VECTOR_MARK (h); |
| 4680 | 4677 | ||
| 4681 | /* Mark contents. */ | 4678 | /* Mark contents. */ |
| 4682 | /* Do not mark next_free or next_weak. | 4679 | /* Do not mark next_free or next_weak. |
| @@ -4698,8 +4695,7 @@ mark_object (argptr) | |||
| 4698 | if (GC_NILP (h->weak)) | 4695 | if (GC_NILP (h->weak)) |
| 4699 | mark_object (&h->key_and_value); | 4696 | mark_object (&h->key_and_value); |
| 4700 | else | 4697 | else |
| 4701 | XVECTOR (h->key_and_value)->size |= ARRAY_MARK_FLAG; | 4698 | VECTOR_MARK (XVECTOR (h->key_and_value)); |
| 4702 | |||
| 4703 | } | 4699 | } |
| 4704 | else | 4700 | else |
| 4705 | { | 4701 | { |
| @@ -4707,9 +4703,9 @@ mark_object (argptr) | |||
| 4707 | register EMACS_INT size = ptr->size; | 4703 | register EMACS_INT size = ptr->size; |
| 4708 | register int i; | 4704 | register int i; |
| 4709 | 4705 | ||
| 4710 | if (size & ARRAY_MARK_FLAG) break; /* Already marked */ | 4706 | if (VECTOR_MARKED_P (ptr)) break; /* Already marked */ |
| 4711 | CHECK_LIVE (live_vector_p); | 4707 | CHECK_LIVE (live_vector_p); |
| 4712 | ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ | 4708 | VECTOR_MARK (ptr); /* Else mark it */ |
| 4713 | if (size & PSEUDOVECTOR_FLAG) | 4709 | if (size & PSEUDOVECTOR_FLAG) |
| 4714 | size &= PSEUDOVECTOR_SIZE_MASK; | 4710 | size &= PSEUDOVECTOR_SIZE_MASK; |
| 4715 | 4711 | ||
| @@ -4854,9 +4850,7 @@ mark_buffer (buf) | |||
| 4854 | register Lisp_Object *ptr; | 4850 | register Lisp_Object *ptr; |
| 4855 | Lisp_Object base_buffer; | 4851 | Lisp_Object base_buffer; |
| 4856 | 4852 | ||
| 4857 | /* This is the buffer's markbit */ | 4853 | VECTOR_MARK (buffer); |
| 4858 | mark_object (&buffer->name); | ||
| 4859 | XMARK (buffer->name); | ||
| 4860 | 4854 | ||
| 4861 | MARK_INTERVAL_TREE (BUF_INTERVALS (buffer)); | 4855 | MARK_INTERVAL_TREE (BUF_INTERVALS (buffer)); |
| 4862 | 4856 | ||
| @@ -4896,7 +4890,7 @@ mark_buffer (buf) | |||
| 4896 | else | 4890 | else |
| 4897 | mark_object (&buffer->undo_list); | 4891 | mark_object (&buffer->undo_list); |
| 4898 | 4892 | ||
| 4899 | for (ptr = &buffer->name + 1; | 4893 | for (ptr = &buffer->name; |
| 4900 | (char *)ptr < (char *)buffer + sizeof (struct buffer); | 4894 | (char *)ptr < (char *)buffer + sizeof (struct buffer); |
| 4901 | ptr++) | 4895 | ptr++) |
| 4902 | mark_object (ptr); | 4896 | mark_object (ptr); |
| @@ -4942,11 +4936,11 @@ survives_gc_p (obj) | |||
| 4942 | 4936 | ||
| 4943 | case Lisp_Vectorlike: | 4937 | case Lisp_Vectorlike: |
| 4944 | if (GC_BUFFERP (obj)) | 4938 | if (GC_BUFFERP (obj)) |
| 4945 | survives_p = XMARKBIT (XBUFFER (obj)->name); | 4939 | survives_p = VECTOR_MARKED_P (XBUFFER (obj)); |
| 4946 | else if (GC_SUBRP (obj)) | 4940 | else if (GC_SUBRP (obj)) |
| 4947 | survives_p = 1; | 4941 | survives_p = 1; |
| 4948 | else | 4942 | else |
| 4949 | survives_p = XVECTOR (obj)->size & ARRAY_MARK_FLAG; | 4943 | survives_p = VECTOR_MARKED_P (XVECTOR (obj)); |
| 4950 | break; | 4944 | break; |
| 4951 | 4945 | ||
| 4952 | case Lisp_Cons: | 4946 | case Lisp_Cons: |
| @@ -5212,7 +5206,6 @@ gc_sweep () | |||
| 5212 | { | 5206 | { |
| 5213 | if (!mblk->markers[i].u_marker.gcmarkbit) | 5207 | if (!mblk->markers[i].u_marker.gcmarkbit) |
| 5214 | { | 5208 | { |
| 5215 | Lisp_Object tem; | ||
| 5216 | if (mblk->markers[i].u_marker.type == Lisp_Misc_Marker) | 5209 | if (mblk->markers[i].u_marker.type == Lisp_Misc_Marker) |
| 5217 | unchain_marker (&mblk->markers[i].u_marker); | 5210 | unchain_marker (&mblk->markers[i].u_marker); |
| 5218 | /* Set the type of the freed object to Lisp_Misc_Free. | 5211 | /* Set the type of the freed object to Lisp_Misc_Free. |
| @@ -5257,7 +5250,7 @@ gc_sweep () | |||
| 5257 | register struct buffer *buffer = all_buffers, *prev = 0, *next; | 5250 | register struct buffer *buffer = all_buffers, *prev = 0, *next; |
| 5258 | 5251 | ||
| 5259 | while (buffer) | 5252 | while (buffer) |
| 5260 | if (!XMARKBIT (buffer->name)) | 5253 | if (!VECTOR_MARKED_P (buffer)) |
| 5261 | { | 5254 | { |
| 5262 | if (prev) | 5255 | if (prev) |
| 5263 | prev->next = buffer->next; | 5256 | prev->next = buffer->next; |
| @@ -5269,7 +5262,7 @@ gc_sweep () | |||
| 5269 | } | 5262 | } |
| 5270 | else | 5263 | else |
| 5271 | { | 5264 | { |
| 5272 | XUNMARK (buffer->name); | 5265 | VECTOR_UNMARK (buffer); |
| 5273 | UNMARK_BALANCE_INTERVALS (BUF_INTERVALS (buffer)); | 5266 | UNMARK_BALANCE_INTERVALS (BUF_INTERVALS (buffer)); |
| 5274 | prev = buffer, buffer = buffer->next; | 5267 | prev = buffer, buffer = buffer->next; |
| 5275 | } | 5268 | } |
| @@ -5281,7 +5274,7 @@ gc_sweep () | |||
| 5281 | total_vector_size = 0; | 5274 | total_vector_size = 0; |
| 5282 | 5275 | ||
| 5283 | while (vector) | 5276 | while (vector) |
| 5284 | if (!(vector->size & ARRAY_MARK_FLAG)) | 5277 | if (!VECTOR_MARKED_P (vector)) |
| 5285 | { | 5278 | { |
| 5286 | if (prev) | 5279 | if (prev) |
| 5287 | prev->next = vector->next; | 5280 | prev->next = vector->next; |
| @@ -5295,7 +5288,7 @@ gc_sweep () | |||
| 5295 | } | 5288 | } |
| 5296 | else | 5289 | else |
| 5297 | { | 5290 | { |
| 5298 | vector->size &= ~ARRAY_MARK_FLAG; | 5291 | VECTOR_UNMARK (vector); |
| 5299 | if (vector->size & PSEUDOVECTOR_FLAG) | 5292 | if (vector->size & PSEUDOVECTOR_FLAG) |
| 5300 | total_vector_size += (PSEUDOVECTOR_SIZE_MASK & vector->size); | 5293 | total_vector_size += (PSEUDOVECTOR_SIZE_MASK & vector->size); |
| 5301 | else | 5294 | else |