Mercurial > emacs
changeset 32587:b3918817f15f
(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.
author | Gerd Moellmann <gerd@gnu.org> |
---|---|
date | Tue, 17 Oct 2000 15:38:30 +0000 |
parents | 40cebc20f02c |
children | afbcd960831b |
files | src/ChangeLog src/alloc.c |
diffstat | 2 files changed, 75 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- 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 <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.
--- 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;