Mercurial > emacs
comparison src/alloc.c @ 56202:db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
(make_save_value): Init new dogc member.
(mark_object): Mark Lisp_Save_Value pointer array if dogc is set.
| author | Kim F. Storm <storm@cua.dk> |
|---|---|
| date | Tue, 22 Jun 2004 13:56:34 +0000 |
| parents | e3720731abbb |
| children | a446552d2240 dbcd0af66869 |
comparison
equal
deleted
inserted
replaced
| 56201:10ec6b8cf09a | 56202:db1817b88294 |
|---|---|
| 583 | 583 |
| 584 Lisp_Object | 584 Lisp_Object |
| 585 safe_alloca_unwind (arg) | 585 safe_alloca_unwind (arg) |
| 586 Lisp_Object arg; | 586 Lisp_Object arg; |
| 587 { | 587 { |
| 588 xfree (XSAVE_VALUE (arg)->pointer); | 588 register struct Lisp_Save_Value *p = XSAVE_VALUE (arg); |
| 589 | |
| 590 p->dogc = 0; | |
| 591 xfree (p->pointer); | |
| 592 p->pointer = 0; | |
| 589 return Qnil; | 593 return Qnil; |
| 590 } | 594 } |
| 591 | 595 |
| 592 | 596 |
| 593 /* Like malloc but used for allocating Lisp data. NBYTES is the | 597 /* Like malloc but used for allocating Lisp data. NBYTES is the |
| 2943 val = allocate_misc (); | 2947 val = allocate_misc (); |
| 2944 XMISCTYPE (val) = Lisp_Misc_Save_Value; | 2948 XMISCTYPE (val) = Lisp_Misc_Save_Value; |
| 2945 p = XSAVE_VALUE (val); | 2949 p = XSAVE_VALUE (val); |
| 2946 p->pointer = pointer; | 2950 p->pointer = pointer; |
| 2947 p->integer = integer; | 2951 p->integer = integer; |
| 2952 p->dogc = 0; | |
| 2948 return val; | 2953 return val; |
| 2949 } | 2954 } |
| 2950 | 2955 |
| 2951 DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0, | 2956 DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0, |
| 2952 doc: /* Return a newly allocated marker which does not point at any place. */) | 2957 doc: /* Return a newly allocated marker which does not point at any place. */) |
| 4976 case Lisp_Misc: | 4981 case Lisp_Misc: |
| 4977 CHECK_ALLOCATED_AND_LIVE (live_misc_p); | 4982 CHECK_ALLOCATED_AND_LIVE (live_misc_p); |
| 4978 if (XMARKER (obj)->gcmarkbit) | 4983 if (XMARKER (obj)->gcmarkbit) |
| 4979 break; | 4984 break; |
| 4980 XMARKER (obj)->gcmarkbit = 1; | 4985 XMARKER (obj)->gcmarkbit = 1; |
| 4986 | |
| 4981 switch (XMISCTYPE (obj)) | 4987 switch (XMISCTYPE (obj)) |
| 4982 { | 4988 { |
| 4983 case Lisp_Misc_Buffer_Local_Value: | 4989 case Lisp_Misc_Buffer_Local_Value: |
| 4984 case Lisp_Misc_Some_Buffer_Local_Value: | 4990 case Lisp_Misc_Some_Buffer_Local_Value: |
| 4985 { | 4991 { |
| 5000 | 5006 |
| 5001 case Lisp_Misc_Marker: | 5007 case Lisp_Misc_Marker: |
| 5002 /* DO NOT mark thru the marker's chain. | 5008 /* DO NOT mark thru the marker's chain. |
| 5003 The buffer's markers chain does not preserve markers from gc; | 5009 The buffer's markers chain does not preserve markers from gc; |
| 5004 instead, markers are removed from the chain when freed by gc. */ | 5010 instead, markers are removed from the chain when freed by gc. */ |
| 5011 break; | |
| 5012 | |
| 5005 case Lisp_Misc_Intfwd: | 5013 case Lisp_Misc_Intfwd: |
| 5006 case Lisp_Misc_Boolfwd: | 5014 case Lisp_Misc_Boolfwd: |
| 5007 case Lisp_Misc_Objfwd: | 5015 case Lisp_Misc_Objfwd: |
| 5008 case Lisp_Misc_Buffer_Objfwd: | 5016 case Lisp_Misc_Buffer_Objfwd: |
| 5009 case Lisp_Misc_Kboard_Objfwd: | 5017 case Lisp_Misc_Kboard_Objfwd: |
| 5010 /* Don't bother with Lisp_Buffer_Objfwd, | 5018 /* Don't bother with Lisp_Buffer_Objfwd, |
| 5011 since all markable slots in current buffer marked anyway. */ | 5019 since all markable slots in current buffer marked anyway. */ |
| 5012 /* Don't need to do Lisp_Objfwd, since the places they point | 5020 /* Don't need to do Lisp_Objfwd, since the places they point |
| 5013 are protected with staticpro. */ | 5021 are protected with staticpro. */ |
| 5022 break; | |
| 5023 | |
| 5014 case Lisp_Misc_Save_Value: | 5024 case Lisp_Misc_Save_Value: |
| 5025 { | |
| 5026 register struct Lisp_Save_Value *ptr = XSAVE_VALUE (obj); | |
| 5027 /* If DOGC is set, POINTER is the address of a memory | |
| 5028 area containing INTEGER potential Lisp_Objects. */ | |
| 5029 if (ptr->dogc) | |
| 5030 { | |
| 5031 Lisp_Object *p = (Lisp_Object *) ptr->pointer; | |
| 5032 int nelt; | |
| 5033 for (nelt = ptr->integer; nelt > 0; nelt--, p++) | |
| 5034 mark_maybe_object (*p); | |
| 5035 } | |
| 5036 } | |
| 5015 break; | 5037 break; |
| 5016 | 5038 |
| 5017 case Lisp_Misc_Overlay: | 5039 case Lisp_Misc_Overlay: |
| 5018 { | 5040 { |
| 5019 struct Lisp_Overlay *ptr = XOVERLAY (obj); | 5041 struct Lisp_Overlay *ptr = XOVERLAY (obj); |
