diff options
| author | Stefan Monnier | 2003-06-25 23:28:14 +0000 |
|---|---|---|
| committer | Stefan Monnier | 2003-06-25 23:28:14 +0000 |
| commit | 2336fe58df3a6ac56822b592d55d95013a9c6218 (patch) | |
| tree | 482a6564bf3cefb977fb784cd7640bf615bebbab /src | |
| parent | a84f89d5101aba7a431b98a844a54032dd74a1af (diff) | |
| download | emacs-2336fe58df3a6ac56822b592d55d95013a9c6218.tar.gz emacs-2336fe58df3a6ac56822b592d55d95013a9c6218.zip | |
(make_interval, Fmake_symbol, allocate_misc):
Initialize the new field `gcmarkbit'.
(mark_interval, MARK_INTERVAL_TREE): Use the new `gcmarkbit' field.
(mark_interval_tree): Don't mark the tree separately from the nodes.
(UNMARK_BALANCE_INTERVALS): Don't unmark the tree.
(mark_maybe_object, mark_maybe_pointer, Fgarbage_collect, mark_object)
(survives_gc_p, gc_sweep): Use new `gcmarkbit' fields.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 16 | ||||
| -rw-r--r-- | src/alloc.c | 159 |
2 files changed, 57 insertions, 118 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index e13d55bbb69..627f0d2b0f7 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,19 @@ | |||
| 1 | 2003-06-25 Stefan Monnier <monnier@cs.yale.edu> | ||
| 2 | |||
| 3 | * alloc.c (make_interval, Fmake_symbol, allocate_misc): | ||
| 4 | Initialize the new field `gcmarkbit'. | ||
| 5 | (mark_interval, MARK_INTERVAL_TREE): Use the new `gcmarkbit' field. | ||
| 6 | (mark_interval_tree): Don't mark the tree separately from the nodes. | ||
| 7 | (UNMARK_BALANCE_INTERVALS): Don't unmark the tree. | ||
| 8 | (mark_maybe_object, mark_maybe_pointer, Fgarbage_collect) | ||
| 9 | (mark_object, survives_gc_p, gc_sweep): Use new `gcmarkbit' fields. | ||
| 10 | |||
| 11 | * lisp.h (struct interval, struct Lisp_Symbol, struct Lisp_Free) | ||
| 12 | (struct Lisp_Marker, struct Lisp_Intfwd, struct Lisp_Boolfwd) | ||
| 13 | (struct Lisp_Kboard_Objfwd, struct Lisp_Save_Value) | ||
| 14 | (struct Lisp_Buffer_Local_Value, struct Lisp_Overlay) | ||
| 15 | (struct Lisp_Objfwd, struct Lisp_Buffer_Objfwd): Add `gcmarkbit' field. | ||
| 16 | |||
| 1 | 2003-06-24 Dave Love <fx@gnu.org> | 17 | 2003-06-24 Dave Love <fx@gnu.org> |
| 2 | 18 | ||
| 3 | * xterm.c (xim_initialize): Use XRegisterIMInstantiateCallback_arg6. | 19 | * xterm.c (xim_initialize): Use XRegisterIMInstantiateCallback_arg6. |
diff --git a/src/alloc.c b/src/alloc.c index 53513a722b9..184edf8417f 100644 --- a/src/alloc.c +++ b/src/alloc.c | |||
| @@ -947,6 +947,7 @@ make_interval () | |||
| 947 | consing_since_gc += sizeof (struct interval); | 947 | consing_since_gc += sizeof (struct interval); |
| 948 | intervals_consed++; | 948 | intervals_consed++; |
| 949 | RESET_INTERVAL (val); | 949 | RESET_INTERVAL (val); |
| 950 | val->gcmarkbit = 0; | ||
| 950 | return val; | 951 | return val; |
| 951 | } | 952 | } |
| 952 | 953 | ||
| @@ -958,10 +959,9 @@ mark_interval (i, dummy) | |||
| 958 | register INTERVAL i; | 959 | register INTERVAL i; |
| 959 | Lisp_Object dummy; | 960 | Lisp_Object dummy; |
| 960 | { | 961 | { |
| 961 | if (XMARKBIT (i->plist)) | 962 | eassert (!i->gcmarkbit); /* Intervals are never shared. */ |
| 962 | abort (); | 963 | i->gcmarkbit = 1; |
| 963 | mark_object (&i->plist); | 964 | mark_object (&i->plist); |
| 964 | XMARK (i->plist); | ||
| 965 | } | 965 | } |
| 966 | 966 | ||
| 967 | 967 | ||
| @@ -976,10 +976,6 @@ mark_interval_tree (tree) | |||
| 976 | function is always called through the MARK_INTERVAL_TREE macro, | 976 | function is always called through the MARK_INTERVAL_TREE macro, |
| 977 | which takes care of that. */ | 977 | which takes care of that. */ |
| 978 | 978 | ||
| 979 | /* XMARK expands to an assignment; the LHS of an assignment can't be | ||
| 980 | a cast. */ | ||
| 981 | XMARK (tree->up.obj); | ||
| 982 | |||
| 983 | traverse_intervals_noorder (tree, mark_interval, Qnil); | 979 | traverse_intervals_noorder (tree, mark_interval, Qnil); |
| 984 | } | 980 | } |
| 985 | 981 | ||
| @@ -988,23 +984,15 @@ mark_interval_tree (tree) | |||
| 988 | 984 | ||
| 989 | #define MARK_INTERVAL_TREE(i) \ | 985 | #define MARK_INTERVAL_TREE(i) \ |
| 990 | do { \ | 986 | do { \ |
| 991 | if (!NULL_INTERVAL_P (i) \ | 987 | if (!NULL_INTERVAL_P (i) && !i->gcmarkbit) \ |
| 992 | && ! XMARKBIT (i->up.obj)) \ | ||
| 993 | mark_interval_tree (i); \ | 988 | mark_interval_tree (i); \ |
| 994 | } while (0) | 989 | } while (0) |
| 995 | 990 | ||
| 996 | 991 | ||
| 997 | /* The oddity in the call to XUNMARK is necessary because XUNMARK | ||
| 998 | expands to an assignment to its argument, and most C compilers | ||
| 999 | don't support casts on the left operand of `='. */ | ||
| 1000 | |||
| 1001 | #define UNMARK_BALANCE_INTERVALS(i) \ | 992 | #define UNMARK_BALANCE_INTERVALS(i) \ |
| 1002 | do { \ | 993 | do { \ |
| 1003 | if (! NULL_INTERVAL_P (i)) \ | 994 | if (! NULL_INTERVAL_P (i)) \ |
| 1004 | { \ | 995 | (i) = balance_intervals (i); \ |
| 1005 | XUNMARK ((i)->up.obj); \ | ||
| 1006 | (i) = balance_intervals (i); \ | ||
| 1007 | } \ | ||
| 1008 | } while (0) | 996 | } while (0) |
| 1009 | 997 | ||
| 1010 | 998 | ||
| @@ -2568,6 +2556,7 @@ Its value and function definition are void, and its property list is nil. */) | |||
| 2568 | p->value = Qunbound; | 2556 | p->value = Qunbound; |
| 2569 | p->function = Qunbound; | 2557 | p->function = Qunbound; |
| 2570 | p->next = NULL; | 2558 | p->next = NULL; |
| 2559 | p->gcmarkbit = 0; | ||
| 2571 | p->interned = SYMBOL_UNINTERNED; | 2560 | p->interned = SYMBOL_UNINTERNED; |
| 2572 | p->constant = 0; | 2561 | p->constant = 0; |
| 2573 | p->indirect_variable = 0; | 2562 | p->indirect_variable = 0; |
| @@ -2644,6 +2633,7 @@ allocate_misc () | |||
| 2644 | 2633 | ||
| 2645 | consing_since_gc += sizeof (union Lisp_Misc); | 2634 | consing_since_gc += sizeof (union Lisp_Misc); |
| 2646 | misc_objects_consed++; | 2635 | misc_objects_consed++; |
| 2636 | XMARKER (val)->gcmarkbit = 0; | ||
| 2647 | return val; | 2637 | return val; |
| 2648 | } | 2638 | } |
| 2649 | 2639 | ||
| @@ -3302,7 +3292,7 @@ live_vector_p (m, p) | |||
| 3302 | } | 3292 | } |
| 3303 | 3293 | ||
| 3304 | 3294 | ||
| 3305 | /* Value is non-zero of P is a pointer to a live buffer. M is a | 3295 | /* Value is non-zero if P is a pointer to a live buffer. M is a |
| 3306 | pointer to the mem_block for P. */ | 3296 | pointer to the mem_block for P. */ |
| 3307 | 3297 | ||
| 3308 | static INLINE int | 3298 | static INLINE int |
| @@ -3397,8 +3387,7 @@ mark_maybe_object (obj) | |||
| 3397 | break; | 3387 | break; |
| 3398 | 3388 | ||
| 3399 | case Lisp_Symbol: | 3389 | case Lisp_Symbol: |
| 3400 | mark_p = (live_symbol_p (m, po) | 3390 | mark_p = (live_symbol_p (m, po) && !XSYMBOL (obj)->gcmarkbit); |
| 3401 | && !XMARKBIT (XSYMBOL (obj)->plist)); | ||
| 3402 | break; | 3391 | break; |
| 3403 | 3392 | ||
| 3404 | case Lisp_Float: | 3393 | case Lisp_Float: |
| @@ -3418,24 +3407,7 @@ mark_maybe_object (obj) | |||
| 3418 | break; | 3407 | break; |
| 3419 | 3408 | ||
| 3420 | case Lisp_Misc: | 3409 | case Lisp_Misc: |
| 3421 | if (live_misc_p (m, po)) | 3410 | mark_p = (live_misc_p (m, po) && !XMARKER (obj)->gcmarkbit); |
| 3422 | { | ||
| 3423 | switch (XMISCTYPE (obj)) | ||
| 3424 | { | ||
| 3425 | case Lisp_Misc_Marker: | ||
| 3426 | mark_p = !XMARKBIT (XMARKER (obj)->chain); | ||
| 3427 | break; | ||
| 3428 | |||
| 3429 | case Lisp_Misc_Buffer_Local_Value: | ||
| 3430 | case Lisp_Misc_Some_Buffer_Local_Value: | ||
| 3431 | mark_p = !XMARKBIT (XBUFFER_LOCAL_VALUE (obj)->realvalue); | ||
| 3432 | break; | ||
| 3433 | |||
| 3434 | case Lisp_Misc_Overlay: | ||
| 3435 | mark_p = !XMARKBIT (XOVERLAY (obj)->plist); | ||
| 3436 | break; | ||
| 3437 | } | ||
| 3438 | } | ||
| 3439 | break; | 3411 | break; |
| 3440 | 3412 | ||
| 3441 | case Lisp_Int: | 3413 | case Lisp_Int: |
| @@ -3500,35 +3472,12 @@ mark_maybe_pointer (p) | |||
| 3500 | break; | 3472 | break; |
| 3501 | 3473 | ||
| 3502 | case MEM_TYPE_MISC: | 3474 | case MEM_TYPE_MISC: |
| 3503 | if (live_misc_p (m, p)) | 3475 | if (live_misc_p (m, p) && !((struct Lisp_Free *) p)->gcmarkbit) |
| 3504 | { | 3476 | XSETMISC (obj, p); |
| 3505 | Lisp_Object tem; | ||
| 3506 | XSETMISC (tem, p); | ||
| 3507 | |||
| 3508 | switch (XMISCTYPE (tem)) | ||
| 3509 | { | ||
| 3510 | case Lisp_Misc_Marker: | ||
| 3511 | if (!XMARKBIT (XMARKER (tem)->chain)) | ||
| 3512 | obj = tem; | ||
| 3513 | break; | ||
| 3514 | |||
| 3515 | case Lisp_Misc_Buffer_Local_Value: | ||
| 3516 | case Lisp_Misc_Some_Buffer_Local_Value: | ||
| 3517 | if (!XMARKBIT (XBUFFER_LOCAL_VALUE (tem)->realvalue)) | ||
| 3518 | obj = tem; | ||
| 3519 | break; | ||
| 3520 | |||
| 3521 | case Lisp_Misc_Overlay: | ||
| 3522 | if (!XMARKBIT (XOVERLAY (tem)->plist)) | ||
| 3523 | obj = tem; | ||
| 3524 | break; | ||
| 3525 | } | ||
| 3526 | } | ||
| 3527 | break; | 3477 | break; |
| 3528 | 3478 | ||
| 3529 | case MEM_TYPE_SYMBOL: | 3479 | case MEM_TYPE_SYMBOL: |
| 3530 | if (live_symbol_p (m, p) | 3480 | if (live_symbol_p (m, p) && !((struct Lisp_Symbol *) p)->gcmarkbit) |
| 3531 | && !XMARKBIT (((struct Lisp_Symbol *) p)->plist)) | ||
| 3532 | XSETSYMBOL (obj, p); | 3481 | XSETSYMBOL (obj, p); |
| 3533 | break; | 3482 | break; |
| 3534 | 3483 | ||
| @@ -4278,7 +4227,7 @@ Garbage collection happens automatically if you cons more than | |||
| 4278 | { | 4227 | { |
| 4279 | if (GC_CONSP (XCAR (tail)) | 4228 | if (GC_CONSP (XCAR (tail)) |
| 4280 | && GC_MARKERP (XCAR (XCAR (tail))) | 4229 | && GC_MARKERP (XCAR (XCAR (tail))) |
| 4281 | && ! XMARKBIT (XMARKER (XCAR (XCAR (tail)))->chain)) | 4230 | && !XMARKER (XCAR (XCAR (tail)))->gcmarkbit) |
| 4282 | { | 4231 | { |
| 4283 | if (NILP (prev)) | 4232 | if (NILP (prev)) |
| 4284 | nextb->undo_list = tail = XCDR (tail); | 4233 | nextb->undo_list = tail = XCDR (tail); |
| @@ -4774,9 +4723,9 @@ mark_object (argptr) | |||
| 4774 | register struct Lisp_Symbol *ptr = XSYMBOL (obj); | 4723 | register struct Lisp_Symbol *ptr = XSYMBOL (obj); |
| 4775 | struct Lisp_Symbol *ptrx; | 4724 | struct Lisp_Symbol *ptrx; |
| 4776 | 4725 | ||
| 4777 | if (XMARKBIT (ptr->plist)) break; | 4726 | if (ptr->gcmarkbit) break; |
| 4778 | CHECK_ALLOCATED_AND_LIVE (live_symbol_p); | 4727 | CHECK_ALLOCATED_AND_LIVE (live_symbol_p); |
| 4779 | XMARK (ptr->plist); | 4728 | ptr->gcmarkbit = 1; |
| 4780 | mark_object ((Lisp_Object *) &ptr->value); | 4729 | mark_object ((Lisp_Object *) &ptr->value); |
| 4781 | mark_object (&ptr->function); | 4730 | mark_object (&ptr->function); |
| 4782 | mark_object (&ptr->plist); | 4731 | mark_object (&ptr->plist); |
| @@ -4804,22 +4753,16 @@ mark_object (argptr) | |||
| 4804 | 4753 | ||
| 4805 | case Lisp_Misc: | 4754 | case Lisp_Misc: |
| 4806 | CHECK_ALLOCATED_AND_LIVE (live_misc_p); | 4755 | CHECK_ALLOCATED_AND_LIVE (live_misc_p); |
| 4756 | if (XMARKER (obj)->gcmarkbit) | ||
| 4757 | break; | ||
| 4758 | XMARKER (obj)->gcmarkbit = 1; | ||
| 4807 | switch (XMISCTYPE (obj)) | 4759 | switch (XMISCTYPE (obj)) |
| 4808 | { | 4760 | { |
| 4809 | case Lisp_Misc_Marker: | ||
| 4810 | XMARK (XMARKER (obj)->chain); | ||
| 4811 | /* DO NOT mark thru the marker's chain. | ||
| 4812 | The buffer's markers chain does not preserve markers from gc; | ||
| 4813 | instead, markers are removed from the chain when freed by gc. */ | ||
| 4814 | break; | ||
| 4815 | |||
| 4816 | case Lisp_Misc_Buffer_Local_Value: | 4761 | case Lisp_Misc_Buffer_Local_Value: |
| 4817 | case Lisp_Misc_Some_Buffer_Local_Value: | 4762 | case Lisp_Misc_Some_Buffer_Local_Value: |
| 4818 | { | 4763 | { |
| 4819 | register struct Lisp_Buffer_Local_Value *ptr | 4764 | register struct Lisp_Buffer_Local_Value *ptr |
| 4820 | = XBUFFER_LOCAL_VALUE (obj); | 4765 | = XBUFFER_LOCAL_VALUE (obj); |
| 4821 | if (XMARKBIT (ptr->realvalue)) break; | ||
| 4822 | XMARK (ptr->realvalue); | ||
| 4823 | /* If the cdr is nil, avoid recursion for the car. */ | 4766 | /* If the cdr is nil, avoid recursion for the car. */ |
| 4824 | if (EQ (ptr->cdr, Qnil)) | 4767 | if (EQ (ptr->cdr, Qnil)) |
| 4825 | { | 4768 | { |
| @@ -4833,6 +4776,10 @@ mark_object (argptr) | |||
| 4833 | goto loop; | 4776 | goto loop; |
| 4834 | } | 4777 | } |
| 4835 | 4778 | ||
| 4779 | case Lisp_Misc_Marker: | ||
| 4780 | /* DO NOT mark thru the marker's chain. | ||
| 4781 | The buffer's markers chain does not preserve markers from gc; | ||
| 4782 | instead, markers are removed from the chain when freed by gc. */ | ||
| 4836 | case Lisp_Misc_Intfwd: | 4783 | case Lisp_Misc_Intfwd: |
| 4837 | case Lisp_Misc_Boolfwd: | 4784 | case Lisp_Misc_Boolfwd: |
| 4838 | case Lisp_Misc_Objfwd: | 4785 | case Lisp_Misc_Objfwd: |
| @@ -4847,14 +4794,10 @@ mark_object (argptr) | |||
| 4847 | case Lisp_Misc_Overlay: | 4794 | case Lisp_Misc_Overlay: |
| 4848 | { | 4795 | { |
| 4849 | struct Lisp_Overlay *ptr = XOVERLAY (obj); | 4796 | struct Lisp_Overlay *ptr = XOVERLAY (obj); |
| 4850 | if (!XMARKBIT (ptr->plist)) | 4797 | mark_object (&ptr->start); |
| 4851 | { | 4798 | mark_object (&ptr->end); |
| 4852 | XMARK (ptr->plist); | 4799 | objptr = &ptr->plist; |
| 4853 | mark_object (&ptr->start); | 4800 | goto loop; |
| 4854 | mark_object (&ptr->end); | ||
| 4855 | objptr = &ptr->plist; | ||
| 4856 | goto loop; | ||
| 4857 | } | ||
| 4858 | } | 4801 | } |
| 4859 | break; | 4802 | break; |
| 4860 | 4803 | ||
| @@ -4922,6 +4865,9 @@ mark_buffer (buf) | |||
| 4922 | Lisp_Object tail; | 4865 | Lisp_Object tail; |
| 4923 | tail = buffer->undo_list; | 4866 | tail = buffer->undo_list; |
| 4924 | 4867 | ||
| 4868 | /* We mark the undo list specially because | ||
| 4869 | its pointers to markers should be weak. */ | ||
| 4870 | |||
| 4925 | while (CONSP (tail)) | 4871 | while (CONSP (tail)) |
| 4926 | { | 4872 | { |
| 4927 | register struct Lisp_Cons *ptr = XCONS (tail); | 4873 | register struct Lisp_Cons *ptr = XCONS (tail); |
| @@ -4980,19 +4926,20 @@ survives_gc_p (obj) | |||
| 4980 | break; | 4926 | break; |
| 4981 | 4927 | ||
| 4982 | case Lisp_Symbol: | 4928 | case Lisp_Symbol: |
| 4983 | survives_p = XMARKBIT (XSYMBOL (obj)->plist); | 4929 | survives_p = XSYMBOL (obj)->gcmarkbit; |
| 4984 | break; | 4930 | break; |
| 4985 | 4931 | ||
| 4986 | case Lisp_Misc: | 4932 | case Lisp_Misc: |
| 4933 | /* FIXME: Maybe we should just use obj->mark for all? */ | ||
| 4987 | switch (XMISCTYPE (obj)) | 4934 | switch (XMISCTYPE (obj)) |
| 4988 | { | 4935 | { |
| 4989 | case Lisp_Misc_Marker: | 4936 | case Lisp_Misc_Marker: |
| 4990 | survives_p = XMARKBIT (obj); | 4937 | survives_p = XMARKER (obj)->gcmarkbit; |
| 4991 | break; | 4938 | break; |
| 4992 | 4939 | ||
| 4993 | case Lisp_Misc_Buffer_Local_Value: | 4940 | case Lisp_Misc_Buffer_Local_Value: |
| 4994 | case Lisp_Misc_Some_Buffer_Local_Value: | 4941 | case Lisp_Misc_Some_Buffer_Local_Value: |
| 4995 | survives_p = XMARKBIT (XBUFFER_LOCAL_VALUE (obj)->realvalue); | 4942 | survives_p = XBUFFER_LOCAL_VALUE (obj)->gcmarkbit; |
| 4996 | break; | 4943 | break; |
| 4997 | 4944 | ||
| 4998 | case Lisp_Misc_Intfwd: | 4945 | case Lisp_Misc_Intfwd: |
| @@ -5004,7 +4951,7 @@ survives_gc_p (obj) | |||
| 5004 | break; | 4951 | break; |
| 5005 | 4952 | ||
| 5006 | case Lisp_Misc_Overlay: | 4953 | case Lisp_Misc_Overlay: |
| 5007 | survives_p = XMARKBIT (XOVERLAY (obj)->plist); | 4954 | survives_p = XOVERLAY (obj)->gcmarkbit; |
| 5008 | break; | 4955 | break; |
| 5009 | 4956 | ||
| 5010 | default: | 4957 | default: |
| @@ -5176,7 +5123,7 @@ gc_sweep () | |||
| 5176 | 5123 | ||
| 5177 | for (i = 0; i < lim; i++) | 5124 | for (i = 0; i < lim; i++) |
| 5178 | { | 5125 | { |
| 5179 | if (! XMARKBIT (iblk->intervals[i].plist)) | 5126 | if (!iblk->intervals[i].gcmarkbit) |
| 5180 | { | 5127 | { |
| 5181 | SET_INTERVAL_PARENT (&iblk->intervals[i], interval_free_list); | 5128 | SET_INTERVAL_PARENT (&iblk->intervals[i], interval_free_list); |
| 5182 | interval_free_list = &iblk->intervals[i]; | 5129 | interval_free_list = &iblk->intervals[i]; |
| @@ -5185,7 +5132,7 @@ gc_sweep () | |||
| 5185 | else | 5132 | else |
| 5186 | { | 5133 | { |
| 5187 | num_used++; | 5134 | num_used++; |
| 5188 | XUNMARK (iblk->intervals[i].plist); | 5135 | iblk->intervals[i].gcmarkbit = 0; |
| 5189 | } | 5136 | } |
| 5190 | } | 5137 | } |
| 5191 | lim = INTERVAL_BLOCK_SIZE; | 5138 | lim = INTERVAL_BLOCK_SIZE; |
| @@ -5232,7 +5179,7 @@ gc_sweep () | |||
| 5232 | so we conservatively assume that it is live. */ | 5179 | so we conservatively assume that it is live. */ |
| 5233 | int pure_p = PURE_POINTER_P (XSTRING (sym->xname)); | 5180 | int pure_p = PURE_POINTER_P (XSTRING (sym->xname)); |
| 5234 | 5181 | ||
| 5235 | if (!XMARKBIT (sym->plist) && !pure_p) | 5182 | if (!sym->gcmarkbit && !pure_p) |
| 5236 | { | 5183 | { |
| 5237 | *(struct Lisp_Symbol **) &sym->value = symbol_free_list; | 5184 | *(struct Lisp_Symbol **) &sym->value = symbol_free_list; |
| 5238 | symbol_free_list = sym; | 5185 | symbol_free_list = sym; |
| @@ -5246,7 +5193,7 @@ gc_sweep () | |||
| 5246 | ++num_used; | 5193 | ++num_used; |
| 5247 | if (!pure_p) | 5194 | if (!pure_p) |
| 5248 | UNMARK_STRING (XSTRING (sym->xname)); | 5195 | UNMARK_STRING (XSTRING (sym->xname)); |
| 5249 | XUNMARK (sym->plist); | 5196 | sym->gcmarkbit = 0; |
| 5250 | } | 5197 | } |
| 5251 | } | 5198 | } |
| 5252 | 5199 | ||
| @@ -5286,33 +5233,10 @@ gc_sweep () | |||
| 5286 | { | 5233 | { |
| 5287 | register int i; | 5234 | register int i; |
| 5288 | int this_free = 0; | 5235 | int this_free = 0; |
| 5289 | EMACS_INT already_free = -1; | ||
| 5290 | 5236 | ||
| 5291 | for (i = 0; i < lim; i++) | 5237 | for (i = 0; i < lim; i++) |
| 5292 | { | 5238 | { |
| 5293 | Lisp_Object *markword; | 5239 | if (!mblk->markers[i].u_marker.gcmarkbit) |
| 5294 | switch (mblk->markers[i].u_marker.type) | ||
| 5295 | { | ||
| 5296 | case Lisp_Misc_Marker: | ||
| 5297 | markword = &mblk->markers[i].u_marker.chain; | ||
| 5298 | break; | ||
| 5299 | case Lisp_Misc_Buffer_Local_Value: | ||
| 5300 | case Lisp_Misc_Some_Buffer_Local_Value: | ||
| 5301 | markword = &mblk->markers[i].u_buffer_local_value.realvalue; | ||
| 5302 | break; | ||
| 5303 | case Lisp_Misc_Overlay: | ||
| 5304 | markword = &mblk->markers[i].u_overlay.plist; | ||
| 5305 | break; | ||
| 5306 | case Lisp_Misc_Free: | ||
| 5307 | /* If the object was already free, keep it | ||
| 5308 | on the free list. */ | ||
| 5309 | markword = (Lisp_Object *) &already_free; | ||
| 5310 | break; | ||
| 5311 | default: | ||
| 5312 | markword = 0; | ||
| 5313 | break; | ||
| 5314 | } | ||
| 5315 | if (markword && !XMARKBIT (*markword)) | ||
| 5316 | { | 5240 | { |
| 5317 | Lisp_Object tem; | 5241 | Lisp_Object tem; |
| 5318 | if (mblk->markers[i].u_marker.type == Lisp_Misc_Marker) | 5242 | if (mblk->markers[i].u_marker.type == Lisp_Misc_Marker) |
| @@ -5333,8 +5257,7 @@ gc_sweep () | |||
| 5333 | else | 5257 | else |
| 5334 | { | 5258 | { |
| 5335 | num_used++; | 5259 | num_used++; |
| 5336 | if (markword) | 5260 | mblk->markers[i].u_marker.gcmarkbit = 0; |
| 5337 | XUNMARK (*markword); | ||
| 5338 | } | 5261 | } |
| 5339 | } | 5262 | } |
| 5340 | lim = MARKER_BLOCK_SIZE; | 5263 | lim = MARKER_BLOCK_SIZE; |