wasmtime_internal_core/
alloc.rs1mod arc;
4mod boxed;
5mod try_clone;
6mod try_collect;
7mod try_new;
8mod vec;
9
10pub use boxed::{
11 BoxedSliceFromFallibleIterError, TooFewItemsOrOom, boxed_slice_write_iter,
12 new_boxed_slice_from_fallible_iter, new_boxed_slice_from_iter,
13 new_boxed_slice_from_iter_with_len, new_uninit_boxed_slice,
14};
15pub use try_clone::TryClone;
16pub use try_collect::{TryCollect, TryExtend, TryFromIterator};
17pub use try_new::{TryNew, try_new};
18pub use vec::Vec;
19
20use crate::error::OutOfMemory;
21use core::{alloc::Layout, ptr::NonNull};
22
23#[inline]
30unsafe fn try_alloc(layout: Layout) -> Result<NonNull<u8>, OutOfMemory> {
31 debug_assert!(layout.size() > 0);
33 let ptr = unsafe { std_alloc::alloc::alloc(layout) };
34
35 if let Some(ptr) = NonNull::new(ptr) {
36 Ok(ptr)
37 } else {
38 Err(OutOfMemory::new(layout.size()))
39 }
40}
41
42#[inline]
51unsafe fn try_realloc(
52 ptr: *mut u8,
53 layout: Layout,
54 new_size: usize,
55) -> Result<NonNull<u8>, OutOfMemory> {
56 debug_assert!(layout.size() > 0);
58 debug_assert!(new_size > 0);
59 let ptr = unsafe { std_alloc::alloc::realloc(ptr, layout, new_size) };
60
61 if let Some(ptr) = NonNull::new(ptr) {
62 Ok(ptr)
63 } else {
64 Err(OutOfMemory::new(new_size))
65 }
66}
67
68pub trait PanicOnOom {
74 type Result;
76
77 fn panic_on_oom(self) -> Self::Result;
79}
80
81impl<T> PanicOnOom for Result<T, OutOfMemory> {
82 type Result = T;
83
84 #[track_caller]
85 fn panic_on_oom(self) -> Self::Result {
86 match self {
87 Ok(x) => x,
88 Err(oom) => panic!("unhandled out-of-memory error: {oom}"),
89 }
90 }
91}