]> git.eshelyaron.com Git - emacs.git/commitdiff
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
authorGerd Moellmann <gerd@gnu.org>
Tue, 17 Oct 2000 15:38:30 +0000 (15:38 +0000)
committerGerd Moellmann <gerd@gnu.org>
Tue, 17 Oct 2000 15:38:30 +0000 (15:38 +0000)
string's size_byte.
(check_string_bytes) [GC_CHECK_STRING_BYTES]: New function.
(check_string_bytes_count) [GC_CHECK_STRING_BYTES]: New variable.
(allocate_string) [GC_CHECK_STRING_BYTES]: Call it for every 10th
string allocated.

src/ChangeLog
src/alloc.c

index a4a943fe747eee4621bdd8f3f16caf863ea2d6ae..dc4239b16c08054195242b1e596aad9846172e16 100644 (file)
@@ -1,5 +1,12 @@
 2000-10-17  Gerd Moellmann  <gerd@gnu.org>
 
+       * alloc.c (mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
+       string's size_byte.
+       (check_string_bytes) [GC_CHECK_STRING_BYTES]: New function.
+       (check_string_bytes_count) [GC_CHECK_STRING_BYTES]: New variable.
+       (allocate_string) [GC_CHECK_STRING_BYTES]: Call it for every 10th
+       string allocated.
+
        * xdisp.c (forward_to_next_line_start): Switch iterator's handling
        of selective display off while searching for the next line start.
 
index 85b9d42f1a30ff6e0353c60a66c08e27d5085732..47e75f50a8e50d5c1d3c48bc18e1e32d78a04d33 100644 (file)
@@ -1021,6 +1021,57 @@ init_strings ()
 }
 
 
+#ifdef GC_CHECK_STRING_BYTES
+
+/* Check validity of all live Lisp strings' string_bytes member.
+   Used for hunting a bug.  */
+
+static int check_string_bytes_count;
+
+void
+check_string_bytes ()
+{
+  struct sblock *b;
+  
+  for (b = large_sblocks; b; b = b->next)
+    {
+      struct Lisp_String *s = b->first_data.string;
+      if (s && GC_STRING_BYTES (s) != SDATA_NBYTES (SDATA_OF_STRING (s)))
+       abort ();
+    }
+      
+  for (b = oldest_sblock; b; b = b->next)
+    {
+      struct sdata *from, *end, *from_end;
+      
+      end = b->next_free;
+      
+      for (from = &b->first_data; from < end; from = from_end)
+       {
+         /* Compute the next FROM here because copying below may
+            overwrite data we need to compute it.  */
+         int nbytes;
+
+         /* Check that the string size recorded in the string is the
+            same as the one recorded in the sdata structure. */
+         if (from->string
+             && GC_STRING_BYTES (from->string) != SDATA_NBYTES (from))
+           abort ();
+         
+         if (from->string)
+           nbytes = GC_STRING_BYTES (from->string);
+         else
+           nbytes = SDATA_NBYTES (from);
+         
+         nbytes = SDATA_SIZE (nbytes);
+         from_end = (struct sdata *) ((char *) from + nbytes);
+       }
+    }
+}
+
+#endif /* GC_CHECK_STRING_BYTES */
+
+
 /* Return a new Lisp_String.  */
 
 static struct Lisp_String *
@@ -1064,6 +1115,14 @@ allocate_string ()
   ++strings_consed;
   consing_since_gc += sizeof *s;
 
+#ifdef GC_CHECK_STRING_BYTES
+  if (++check_string_bytes_count == 10)
+    {
+      check_string_bytes_count = 0;
+      check_string_bytes ();
+    }
+#endif
+
   return s;
 }
 
@@ -3928,6 +3987,15 @@ mark_object (argptr)
        CHECK_ALLOCATED_AND_LIVE (live_string_p);
        MARK_INTERVAL_TREE (ptr->intervals);
        MARK_STRING (ptr);
+#ifdef GC_CHECK_STRING_BYTES
+        {
+         /* Check that the string size recorded in the string is the
+            same as the one recorded in the sdata structure. */
+         struct sdata *p = SDATA_OF_STRING (ptr);
+         if (GC_STRING_BYTES (ptr) != SDATA_NBYTES (p))
+           abort ();
+        }
+#endif /* GC_CHECK_STRING_BYTES */
       }
       break;