# HG changeset patch # User Gerd Moellmann # Date 971797110 0 # Node ID b3918817f15fb16adf8378865bfb3850d62754f0 # Parent 40cebc20f02c60ee7d26dd5b8cf8219b42b46aac (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. diff -r 40cebc20f02c -r b3918817f15f src/ChangeLog --- a/src/ChangeLog Tue Oct 17 14:08:06 2000 +0000 +++ b/src/ChangeLog Tue Oct 17 15:38:30 2000 +0000 @@ -1,5 +1,12 @@ 2000-10-17 Gerd Moellmann + * 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. diff -r 40cebc20f02c -r b3918817f15f src/alloc.c --- a/src/alloc.c Tue Oct 17 14:08:06 2000 +0000 +++ b/src/alloc.c Tue Oct 17 15:38:30 2000 +0000 @@ -1021,6 +1021,57 @@ } +#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 @@ ++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 @@ 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;