]> git.eshelyaron.com Git - emacs.git/commitdiff
(safe_alloca_unwind): Clear dogc and pointer members.
authorKim F. Storm <storm@cua.dk>
Tue, 22 Jun 2004 13:56:34 +0000 (13:56 +0000)
committerKim F. Storm <storm@cua.dk>
Tue, 22 Jun 2004 13:56:34 +0000 (13:56 +0000)
(make_save_value): Init new dogc member.
(mark_object): Mark Lisp_Save_Value pointer array if dogc is set.

src/alloc.c

index 897fe910a6e3662381416456ca02abff79fae935..06f7eb6174ed089384b8159e3c2d3ebaa73d8b8c 100644 (file)
@@ -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: