Path: blob/main/crates/core/src/error/boxed.rs
3071 views
use super::{OutOfMemory, Result};1use core::alloc::Layout;2use core::mem::MaybeUninit;3use core::ptr::NonNull;4use std_alloc::boxed::Box;56/// Try to allocate a block of memory that fits the given layout, or return an7/// `OutOfMemory` error.8///9/// # Safety10///11/// Same as `alloc::alloc::alloc`: layout must have non-zero size.12#[inline]13pub(crate) unsafe fn try_alloc(layout: Layout) -> Result<NonNull<u8>, OutOfMemory> {14// Safety: same as our safety conditions.15debug_assert!(layout.size() > 0);16let ptr = unsafe { std_alloc::alloc::alloc(layout) };1718if let Some(ptr) = NonNull::new(ptr) {19Ok(ptr)20} else {21Err(OutOfMemory::new(layout.size()))22}23}2425/// Create a `Box<T>`, or return an `OutOfMemory` error.26#[inline]27pub(crate) fn try_new_uninit_box<T>() -> Result<Box<MaybeUninit<T>>, OutOfMemory> {28let layout = std_alloc::alloc::Layout::new::<MaybeUninit<T>>();2930if layout.size() == 0 {31// NB: no actual allocation takes place when boxing zero-sized types.32return Ok(Box::new(MaybeUninit::uninit()));33}3435// Safety: layout size is non-zero.36let ptr = unsafe { try_alloc(layout)? };3738let ptr = ptr.cast::<MaybeUninit<T>>();3940// Safety: The pointer's memory block was allocated by the global allocator.41Ok(unsafe { Box::from_raw(ptr.as_ptr()) })42}434445