diff options
| author | Christopher Durham <cad97@cad97.com> | 2022-07-11 16:20:00 -0400 |
|---|---|---|
| committer | Christopher Durham <cad97@cad97.com> | 2022-07-11 17:58:42 -0400 |
| commit | 11694905b4c3073b2ce5a3de954139bfaa50681f (patch) | |
| tree | 65ac194930c2b8fc5fb2c6583242afcd221fb60a /library/core/src/alloc/layout.rs | |
| parent | 079d3eb22f883edb0ef332a4929a00513112cb6a (diff) | |
| download | rust-11694905b4c3073b2ce5a3de954139bfaa50681f.tar.gz rust-11694905b4c3073b2ce5a3de954139bfaa50681f.zip | |
Remove duplication of layout size check
Diffstat (limited to 'library/core/src/alloc/layout.rs')
| -rw-r--r-- | library/core/src/alloc/layout.rs | 27 |
1 files changed, 11 insertions, 16 deletions
diff --git a/library/core/src/alloc/layout.rs b/library/core/src/alloc/layout.rs index 51e075546fb..59ebe5fbe02 100644 --- a/library/core/src/alloc/layout.rs +++ b/library/core/src/alloc/layout.rs @@ -68,6 +68,13 @@ impl Layout { 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.) // Rounded up size is: @@ -82,23 +89,11 @@ impl Layout { // // Above implies that checking for summation overflow is both // 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) { return Err(LayoutError); } - // SAFTEY: as above, this check is sufficient. + + // SAFETY: Layout::size invariants checked above. Ok(Layout { size, align }) } @@ -113,8 +108,8 @@ impl Layout { #[must_use] #[inline] 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. - Layout { size, align: unsafe { ValidAlign::new_unchecked(align) } } + // SAFETY: the caller is required to uphold the preconditions. + unsafe { Layout { size, align: ValidAlign::new_unchecked(align) } } } /// The minimum size in bytes for a memory block of this layout. |
