1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-12-17 10:06:13 +00:00

Fix overenthusiastic header size check

Problem reported by Eli Zaretskii in:
https://lists.gnu.org/r/emacs-devel/2018-09/msg00222.html
* doc/lispref/internals.texi (Garbage Collection):
Document vector sizes and slot counts more accurately.
* src/lisp.h: Omit header_size sanity check that was too picky.
Add some less-picky checks.
This commit is contained in:
Paul Eggert 2018-09-07 09:17:25 -07:00
parent 752a05b17d
commit cab3ca9d3d
2 changed files with 22 additions and 8 deletions

View File

@ -382,7 +382,7 @@ This is used for convenience and equals to @code{sizeof (char)}.
The total size of all string data in bytes.
@item vector-size
Internal size of a vector header, i.e., @code{sizeof (struct Lisp_Vector)}.
Size in bytes of a vector of length 1, including its header.
@item used-vectors
The number of vector headers allocated from the vector blocks.
@ -392,6 +392,8 @@ Internal size of a vector slot, always equal to @code{sizeof (Lisp_Object)}.
@item used-slots
The number of slots in all used vectors.
Slot counts might include some or all overhead from vector headers,
depending on the platform.
@item free-slots
The number of free slots in all vector blocks.

View File

@ -1619,7 +1619,16 @@ struct Lisp_Bool_Vector
} GCALIGNED_STRUCT;
/* Some handy constants for calculating sizes
and offsets, mostly of vectorlike objects. */
and offsets, mostly of vectorlike objects.
The garbage collector assumes that the initial part of any struct
that starts with a union vectorlike_header followed by N
Lisp_Objects (some possibly in arrays and/or a trailing flexible
array) will be laid out like a struct Lisp_Vector with N
Lisp_Objects. This assumption is true in practice on known Emacs
targets even though the C standard does not guarantee it. This
header contains a few sanity checks that should suffice to detect
violations of this assumption on plausible practical hosts. */
enum
{
@ -1627,7 +1636,6 @@ enum
bool_header_size = offsetof (struct Lisp_Bool_Vector, data),
word_size = sizeof (Lisp_Object)
};
verify (header_size == sizeof (union vectorlike_header));
/* The number of data words and bytes in a bool vector with SIZE bits. */
@ -1989,6 +1997,13 @@ enum char_table_specials
SUB_CHAR_TABLE_OFFSET = PSEUDOVECSIZE (struct Lisp_Sub_Char_Table, contents)
};
/* Sanity-check pseudovector layout. */
verify (offsetof (struct Lisp_Char_Table, defalt) == header_size);
verify (offsetof (struct Lisp_Char_Table, extras)
== header_size + CHAR_TABLE_STANDARD_SLOTS * sizeof (Lisp_Object));
verify (offsetof (struct Lisp_Sub_Char_Table, contents)
== header_size + SUB_CHAR_TABLE_OFFSET * sizeof (Lisp_Object));
/* Return the number of "extra" slots in the char table CT. */
INLINE int
@ -1998,11 +2013,6 @@ CHAR_TABLE_EXTRA_SLOTS (struct Lisp_Char_Table *ct)
- CHAR_TABLE_STANDARD_SLOTS);
}
/* Make sure that sub char-table contents slot is where we think it is. */
verify (offsetof (struct Lisp_Sub_Char_Table, contents)
== (offsetof (struct Lisp_Vector, contents)
+ SUB_CHAR_TABLE_OFFSET * sizeof (Lisp_Object)));
/* Save and restore the instruction and environment pointers,
without affecting the signal mask. */
@ -2216,6 +2226,8 @@ struct Lisp_Hash_Table
struct Lisp_Hash_Table *next_weak;
} GCALIGNED_STRUCT;
/* Sanity-check pseudovector layout. */
verify (offsetof (struct Lisp_Hash_Table, weak) == header_size);
INLINE bool
HASH_TABLE_P (Lisp_Object a)