diff options
author | Gerd Moellmann <[email protected]> | 2000-10-17 15:38:30 +0000 |
---|---|---|
committer | Gerd Moellmann <[email protected]> | 2000-10-17 15:38:30 +0000 |
commit | 361b097f3a15060733f417eb6cbabf63b121bec9 (patch) | |
tree | 2f534a4b26a9be37701e7f4dff000b0e91933c7b /src/alloc.c | |
parent | 54918e2b47ffcb64fcce348a977a45e33d7a9760 (diff) |
(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.
Diffstat (limited to 'src/alloc.c')
-rw-r--r-- | src/alloc.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/alloc.c b/src/alloc.c index 85b9d42f1a..47e75f50a8 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; |