Mercurial > emacs
comparison src/alloc.c @ 51668:0f333fd92a1d
(survives_gc_p): Simplify.
(Fmake_marker, free_marker, gc_sweep): Update for new types.
author | Stefan Monnier <monnier@iro.umontreal.ca> |
---|---|
date | Thu, 26 Jun 2003 23:16:05 +0000 |
parents | 00b3e009b3f5 |
children | fb960854a12c |
comparison
equal
deleted
inserted
replaced
51667:52d50e52438f | 51668:0f333fd92a1d |
---|---|
2668 XMISCTYPE (val) = Lisp_Misc_Marker; | 2668 XMISCTYPE (val) = Lisp_Misc_Marker; |
2669 p = XMARKER (val); | 2669 p = XMARKER (val); |
2670 p->buffer = 0; | 2670 p->buffer = 0; |
2671 p->bytepos = 0; | 2671 p->bytepos = 0; |
2672 p->charpos = 0; | 2672 p->charpos = 0; |
2673 p->chain = Qnil; | 2673 p->next = NULL; |
2674 p->insertion_type = 0; | 2674 p->insertion_type = 0; |
2675 return val; | 2675 return val; |
2676 } | 2676 } |
2677 | 2677 |
2678 /* Put MARKER back on the free list after using it temporarily. */ | 2678 /* Put MARKER back on the free list after using it temporarily. */ |
2679 | 2679 |
2680 void | 2680 void |
2681 free_marker (marker) | 2681 free_marker (marker) |
2682 Lisp_Object marker; | 2682 Lisp_Object marker; |
2683 { | 2683 { |
2684 unchain_marker (marker); | 2684 unchain_marker (XMARKER (marker)); |
2685 | 2685 |
2686 XMISC (marker)->u_marker.type = Lisp_Misc_Free; | 2686 XMISC (marker)->u_marker.type = Lisp_Misc_Free; |
2687 XMISC (marker)->u_free.chain = marker_free_list; | 2687 XMISC (marker)->u_free.chain = marker_free_list; |
2688 marker_free_list = XMISC (marker); | 2688 marker_free_list = XMISC (marker); |
2689 | 2689 |
4928 case Lisp_Symbol: | 4928 case Lisp_Symbol: |
4929 survives_p = XSYMBOL (obj)->gcmarkbit; | 4929 survives_p = XSYMBOL (obj)->gcmarkbit; |
4930 break; | 4930 break; |
4931 | 4931 |
4932 case Lisp_Misc: | 4932 case Lisp_Misc: |
4933 /* FIXME: Maybe we should just use obj->mark for all? */ | 4933 survives_p = XMARKER (obj)->gcmarkbit; |
4934 switch (XMISCTYPE (obj)) | |
4935 { | |
4936 case Lisp_Misc_Marker: | |
4937 survives_p = XMARKER (obj)->gcmarkbit; | |
4938 break; | |
4939 | |
4940 case Lisp_Misc_Buffer_Local_Value: | |
4941 case Lisp_Misc_Some_Buffer_Local_Value: | |
4942 survives_p = XBUFFER_LOCAL_VALUE (obj)->gcmarkbit; | |
4943 break; | |
4944 | |
4945 case Lisp_Misc_Intfwd: | |
4946 case Lisp_Misc_Boolfwd: | |
4947 case Lisp_Misc_Objfwd: | |
4948 case Lisp_Misc_Buffer_Objfwd: | |
4949 case Lisp_Misc_Kboard_Objfwd: | |
4950 survives_p = 1; | |
4951 break; | |
4952 | |
4953 case Lisp_Misc_Overlay: | |
4954 survives_p = XOVERLAY (obj)->gcmarkbit; | |
4955 break; | |
4956 | |
4957 default: | |
4958 abort (); | |
4959 } | |
4960 break; | 4934 break; |
4961 | 4935 |
4962 case Lisp_String: | 4936 case Lisp_String: |
4963 { | 4937 { |
4964 struct Lisp_String *s = XSTRING (obj); | 4938 struct Lisp_String *s = XSTRING (obj); |
5238 { | 5212 { |
5239 if (!mblk->markers[i].u_marker.gcmarkbit) | 5213 if (!mblk->markers[i].u_marker.gcmarkbit) |
5240 { | 5214 { |
5241 Lisp_Object tem; | 5215 Lisp_Object tem; |
5242 if (mblk->markers[i].u_marker.type == Lisp_Misc_Marker) | 5216 if (mblk->markers[i].u_marker.type == Lisp_Misc_Marker) |
5243 { | 5217 unchain_marker (&mblk->markers[i].u_marker); |
5244 /* tem1 avoids Sun compiler bug */ | |
5245 struct Lisp_Marker *tem1 = &mblk->markers[i].u_marker; | |
5246 XSETMARKER (tem, tem1); | |
5247 unchain_marker (tem); | |
5248 } | |
5249 /* Set the type of the freed object to Lisp_Misc_Free. | 5218 /* Set the type of the freed object to Lisp_Misc_Free. |
5250 We could leave the type alone, since nobody checks it, | 5219 We could leave the type alone, since nobody checks it, |
5251 but this might catch bugs faster. */ | 5220 but this might catch bugs faster. */ |
5252 mblk->markers[i].u_marker.type = Lisp_Misc_Free; | 5221 mblk->markers[i].u_marker.type = Lisp_Misc_Free; |
5253 mblk->markers[i].u_free.chain = marker_free_list; | 5222 mblk->markers[i].u_free.chain = marker_free_list; |