From 361b097f3a15060733f417eb6cbabf63b121bec9 Mon Sep 17 00:00:00 2001 From: Gerd Moellmann Date: Tue, 17 Oct 2000 15:38:30 +0000 Subject: [PATCH] (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. --- src/ChangeLog | 7 ++++++ src/alloc.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/src/ChangeLog b/src/ChangeLog index a4a943fe747..dc4239b16c0 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -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 --git a/src/alloc.c b/src/alloc.c index 85b9d42f1a3..47e75f50a8e 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -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; -- 2.39.2