diff src/alloc.c @ 11403:bd3241a14d0a

(gc_sweep): If a misc has type Lisp_Misc_Free, keep it on the free list. Sum pseudovector sizes properly.
author Richard M. Stallman <rms@gnu.org>
date Wed, 12 Apr 1995 17:53:01 +0000
parents 1ebc81f84aa4
children 35d5910b12b4
line wrap: on
line diff
--- a/src/alloc.c	Wed Apr 12 06:16:00 1995 +0000
+++ b/src/alloc.c	Wed Apr 12 17:53:01 1995 +0000
@@ -2045,6 +2045,8 @@
     for (mblk = marker_block; mblk; mblk = mblk->next)
       {
 	register int i;
+	int already_free = -1;
+
 	for (i = 0; i < lim; i++)
 	  {
 	    Lisp_Object *markword;
@@ -2060,6 +2062,11 @@
 	      case Lisp_Misc_Overlay:
 		markword = &mblk->markers[i].u_overlay.plist;
 		break;
+	      case Lisp_Misc_Free:
+		/* If the object was already free, keep it
+		   on the free list.  */
+		markword = &already_free;
+		break;
 	      default:
 		markword = 0;
 		break;
@@ -2074,7 +2081,8 @@
 		    XSETMARKER (tem, tem1);
 		    unchain_marker (tem);
 		  }
-		/* We could leave the type alone, since nobody checks it,
+		/* Set the type of the freed object to Lisp_Misc_Free.
+		   We could leave the type alone, since nobody checks it,
 		   but this might catch bugs faster.  */
 		mblk->markers[i].u_marker.type = Lisp_Misc_Free;
 		mblk->markers[i].u_free.chain = marker_free_list;
@@ -2154,7 +2162,10 @@
       else
 	{
 	  vector->size &= ~ARRAY_MARK_FLAG;
-	  total_vector_size += vector->size;
+	  if (vector->size & PSEUDOVECTOR_FLAG)
+	    total_vector_size += (PSEUDOVECTOR_SIZE_MASK & vector->size);
+	  else
+	    total_vector_size += vector->size;
 	  prev = vector, vector = vector->next;
 	}
   }