# HG changeset patch # User Kim F. Storm # Date 1087912594 0 # Node ID db1817b882943165c89423c0953fece90e23b9f7 # Parent 10ec6b8cf09a32eaaa6766d1d36e5c23d2c5cb87 (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. diff -r 10ec6b8cf09a -r db1817b88294 src/alloc.c --- 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: