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: