Mercurial > emacs
changeset 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 | 10ec6b8cf09a |
children | 2bb92448ff94 |
files | src/alloc.c |
diffstat | 1 files changed, 23 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/alloc.c Tue Jun 22 13:56:05 2004 +0000 +++ b/src/alloc.c Tue Jun 22 13:56:34 2004 +0000 @@ -585,7 +585,11 @@ safe_alloca_unwind (arg) Lisp_Object arg; { - xfree (XSAVE_VALUE (arg)->pointer); + register struct Lisp_Save_Value *p = XSAVE_VALUE (arg); + + p->dogc = 0; + xfree (p->pointer); + p->pointer = 0; return Qnil; } @@ -2945,6 +2949,7 @@ p = XSAVE_VALUE (val); p->pointer = pointer; p->integer = integer; + p->dogc = 0; return val; } @@ -4978,6 +4983,7 @@ if (XMARKER (obj)->gcmarkbit) break; XMARKER (obj)->gcmarkbit = 1; + switch (XMISCTYPE (obj)) { case Lisp_Misc_Buffer_Local_Value: @@ -5002,6 +5008,8 @@ /* DO NOT mark thru the marker's chain. The buffer's markers chain does not preserve markers from gc; instead, markers are removed from the chain when freed by gc. */ + break; + case Lisp_Misc_Intfwd: case Lisp_Misc_Boolfwd: case Lisp_Misc_Objfwd: @@ -5011,7 +5019,21 @@ since all markable slots in current buffer marked anyway. */ /* Don't need to do Lisp_Objfwd, since the places they point are protected with staticpro. */ + break; + case Lisp_Misc_Save_Value: + { + register struct Lisp_Save_Value *ptr = XSAVE_VALUE (obj); + /* If DOGC is set, POINTER is the address of a memory + area containing INTEGER potential Lisp_Objects. */ + if (ptr->dogc) + { + Lisp_Object *p = (Lisp_Object *) ptr->pointer; + int nelt; + for (nelt = ptr->integer; nelt > 0; nelt--, p++) + mark_maybe_object (*p); + } + } break; case Lisp_Misc_Overlay: