about summary refs log tree commit diff
path: root/library/core/src/alloc/layout.rs
diff options
context:
space:
mode:
authorChristopher Durham <cad97@cad97.com>2022-07-11 16:20:00 -0400
committerChristopher Durham <cad97@cad97.com>2022-07-11 17:58:42 -0400
commit11694905b4c3073b2ce5a3de954139bfaa50681f (patch)
tree65ac194930c2b8fc5fb2c6583242afcd221fb60a /library/core/src/alloc/layout.rs
parent079d3eb22f883edb0ef332a4929a00513112cb6a (diff)
downloadrust-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.rs27
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.