Update documentation somewhat

This commit is contained in:
Thom Chiovoloni 2022-01-31 12:43:15 -08:00
parent e98c7f7209
commit a17a896d09
No known key found for this signature in database
GPG Key ID: E2EFD4309E11C8A8
2 changed files with 26 additions and 12 deletions

View File

@ -87,6 +87,16 @@ enum ErrorData<C> {
// higher already. We include it just because repr_bitpacked.rs's encoding
// requires an alignment >= 4 (note that `#[repr(align)]` will not reduce the
// alignment required by the struct, only increase it).
//
// If we add more variants to ErrorData, this can be increased to 8, but it
// should probably be behind `#[cfg_attr(target_pointer_width = "64", ...)]` or
// whatever cfg we're using to enable the `repr_bitpacked` code, since only the
// that version needs the alignment, and 8 is higher than the alignment we'll
// have on 32 bit platforms.
//
// (For the sake of being explicit: the alignment requirement here only matters
// if `error/repr_bitpacked.rs` is in use — for the unpacked repr it doesn't
// matter at all)
#[repr(align(4))]
pub(crate) struct SimpleMessage {
kind: ErrorKind,

View File

@ -321,23 +321,26 @@ fn kind_from_prim(ek: u32) -> Option<ErrorKind> {
// that our encoding relies on for correctness and soundness. (Some of these are
// a bit overly thorough/cautious, admittedly)
//
// If any of these are hit on a platform that libstd supports, we should just
// make sure `repr_unpacked.rs` is used instead.
// If any of these are hit on a platform that libstd supports, we should likely
// just use `repr_unpacked.rs` there instead (unless the fix is easy).
macro_rules! static_assert {
($condition:expr) => {
const _: [(); 0] = [(); (!$condition) as usize];
const _: () = assert!($condition);
};
(@usize_eq: $lhs:expr, $rhs:expr) => {
const _: [(); $lhs] = [(); $rhs];
};
}
// The bitpacking we use requires pointers be exactly 64 bits.
static_assert!(size_of::<NonNull<()>>() == 8);
static_assert!(@usize_eq: size_of::<NonNull<()>>(), 8);
// We also require pointers and usize be the same size.
static_assert!(size_of::<NonNull<()>>() == size_of::<usize>());
static_assert!(@usize_eq: size_of::<NonNull<()>>(), size_of::<usize>());
// `Custom` and `SimpleMessage` need to be thin pointers.
static_assert!(size_of::<&'static SimpleMessage>() == 8);
static_assert!(size_of::<Box<Custom>>() == 8);
static_assert!(@usize_eq: size_of::<&'static SimpleMessage>(), 8);
static_assert!(@usize_eq: size_of::<Box<Custom>>(), 8);
// And they must have >= 4 byte alignment.
static_assert!(align_of::<SimpleMessage>() >= 4);
@ -346,12 +349,13 @@ static_assert!(align_of::<Custom>() >= 4);
// This is obviously true (`TAG_CUSTOM` is `0b01`), but our implementation of
// `Repr::new_custom` and such would be wrong if it were not, so we check.
static_assert!(size_of::<Custom>() >= TAG_CUSTOM);
// These two store a payload which is allowed to be zero, so they must be
// non-zero to preserve the `NonNull`'s range invariant.
static_assert!(TAG_OS != 0);
static_assert!(TAG_SIMPLE != 0);
// We can't tag `SimpleMessage`s, the tag must be 0.
static_assert!(TAG_SIMPLE_MESSAGE == 0);
static_assert!(@usize_eq: TAG_SIMPLE_MESSAGE, 0);
// Check that the point of all of this still holds.
//
@ -359,7 +363,7 @@ static_assert!(TAG_SIMPLE_MESSAGE == 0);
// as it's not `#[repr(transparent)]`/`#[repr(C)]`. We could add that, but
// the `#[repr()]` would show up in rustdoc, which might be seen as a stable
// commitment.
static_assert!(size_of::<Repr>() == 8);
static_assert!(size_of::<Option<Repr>>() == 8);
static_assert!(size_of::<Result<(), Repr>>() == 8);
static_assert!(size_of::<Result<usize, Repr>>() == 16);
static_assert!(@usize_eq: size_of::<Repr>(), 8);
static_assert!(@usize_eq: size_of::<Option<Repr>>(), 8);
static_assert!(@usize_eq: size_of::<Result<(), Repr>>(), 8);
static_assert!(@usize_eq: size_of::<Result<usize, Repr>>(), 16);