From b766f87064147ba0feaa62de26ed8d1ed46ad96a Mon Sep 17 00:00:00 2001 From: "Kim F. Storm" Date: Tue, 22 Jun 2004 13:56:34 +0000 Subject: [PATCH] (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. --- src/alloc.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/alloc.c b/src/alloc.c index 897fe910a6e..06f7eb6174e 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -585,7 +585,11 @@ Lisp_Object 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 @@ make_save_value (pointer, integer) p = XSAVE_VALUE (val); p->pointer = pointer; p->integer = integer; + p->dogc = 0; return val; } @@ -4978,6 +4983,7 @@ mark_object (arg) if (XMARKER (obj)->gcmarkbit) break; XMARKER (obj)->gcmarkbit = 1; + switch (XMISCTYPE (obj)) { case Lisp_Misc_Buffer_Local_Value: @@ -5002,6 +5008,8 @@ mark_object (arg) /* 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 @@ mark_object (arg) 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: -- 2.39.2