2001-01-09 Gerd Moellmann <gerd@gnu.org>
+ * lisp.h (STRING_BYTES) [GC_CHECK_STRING_BYTES]: Call
+ function string_bytes.
+ (GC_CHECK_STRING_BYTES): Moved here from alloc.c.
+
+ * alloc.c (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
+ (check_sblock, string_bytes) [GC_CHECK_STRING_BYTES]: New functions.
+ (check_string_bytes) [GC_CHECK_STRING_BYTES]: Add parameter ALL_P.
+ (allocate_string) [GC_CHECK_STRING_BYTES]: Always check strings in
+ the current sblock.
+ (mark_object) [GC_CHECK_STRING_BYTES]: Use CHECK_STRING_BYTES.
+ (gc_sweep) [GC_CHECK_STRING_BYTES]: Call check_string_bytes
+ after sweeping strings, and at the end.
+ (GC_CHECK_STRING_BYTES): Moved to lisp.h.
+
* alloc.c (Fgarbage_collect): Use a record_unwind_protect to
ensure that pop_message is called.
#define P_(proto) ()
#endif
+/* Define this temporarily to hunt a bug. If defined, the size of
+ strings is redundantly recorded in sdata structures so that it can
+ be compared to the sizes recorded in Lisp strings. */
+
+#define GC_CHECK_STRING_BYTES 1
+
/* These are default choices for the types to use. */
#ifdef _LP64
(XSTRING (STR)->size_byte >= 0)
/* Return the length in bytes of STR. */
+
+#ifdef GC_CHECK_STRING_BYTES
+
+struct Lisp_String;
+extern int string_bytes P_ ((struct Lisp_String *));
+#define STRING_BYTES(S) string_bytes ((S))
+
+#else /* not GC_CHECK_STRING_BYTES */
+
#define STRING_BYTES(STR) \
((STR)->size_byte < 0 ? (STR)->size : (STR)->size_byte)
+#endif /* not GC_CHECK_STRING_BYTES */
+
/* Set the length in bytes of STR. */
#define SET_STRING_BYTES(STR, SIZE) ((STR)->size_byte = (SIZE))