Remove duplication of layout size check

This commit is contained in:
Christopher Durham 2022-07-11 16:20:00 -04:00
parent 079d3eb22f
commit 11694905b4

View File

@ -68,6 +68,13 @@ pub const fn from_size_align(size: usize, align: usize) -> Result<Self, LayoutEr
return Err(LayoutError); return Err(LayoutError);
} }
// SAFETY: just checked that align is a power of two.
Layout::from_size_valid_align(size, unsafe { ValidAlign::new_unchecked(align) })
}
/// Internal helper constructor to skip revalidating alignment validity.
#[inline]
const fn from_size_valid_align(size: usize, align: ValidAlign) -> Result<Self, LayoutError> {
// (power-of-two implies align != 0.) // (power-of-two implies align != 0.)
// Rounded up size is: // Rounded up size is:
@ -82,23 +89,11 @@ pub const fn from_size_align(size: usize, align: usize) -> Result<Self, LayoutEr
// //
// Above implies that checking for summation overflow is both // Above implies that checking for summation overflow is both
// necessary and sufficient. // necessary and sufficient.
if size > isize::MAX as usize - (align - 1) {
return Err(LayoutError);
}
// SAFETY: the conditions for `from_size_align_unchecked` have been
// checked above.
unsafe { Ok(Layout::from_size_align_unchecked(size, align)) }
}
/// Internal helper constructor to skip revalidating alignment validity.
#[inline]
const fn from_size_valid_align(size: usize, align: ValidAlign) -> Result<Self, LayoutError> {
// See above for the correctness of this check.
if size > isize::MAX as usize - (align.as_nonzero().get() - 1) { if size > isize::MAX as usize - (align.as_nonzero().get() - 1) {
return Err(LayoutError); return Err(LayoutError);
} }
// SAFTEY: as above, this check is sufficient.
// SAFETY: Layout::size invariants checked above.
Ok(Layout { size, align }) Ok(Layout { size, align })
} }
@ -113,8 +108,8 @@ const fn from_size_valid_align(size: usize, align: ValidAlign) -> Result<Self, L
#[must_use] #[must_use]
#[inline] #[inline]
pub const unsafe fn from_size_align_unchecked(size: usize, align: usize) -> Self { pub const unsafe fn from_size_align_unchecked(size: usize, align: usize) -> Self {
// SAFETY: the caller must ensure that `align` is a power of two. // SAFETY: the caller is required to uphold the preconditions.
Layout { size, align: unsafe { ValidAlign::new_unchecked(align) } } unsafe { Layout { size, align: ValidAlign::new_unchecked(align) } }
} }
/// The minimum size in bytes for a memory block of this layout. /// The minimum size in bytes for a memory block of this layout.