wasmtime_internal_core/
alloc.rs1mod arc;
4mod boxed;
5mod string;
6mod try_clone;
7mod try_collect;
8mod try_cow;
9mod try_new;
10mod vec;
11
12pub use boxed::{
13 BoxedSliceFromFallibleIterError, TooFewItemsOrOom, boxed_slice_write_iter,
14 new_boxed_slice_from_fallible_iter, new_boxed_slice_from_iter,
15 new_boxed_slice_from_iter_with_len, new_uninit_boxed_slice,
16};
17pub use string::TryString;
18pub use try_clone::TryClone;
19pub use try_collect::{TryCollect, TryExtend, TryFromIterator};
20pub use try_cow::{TryCow, TryToOwned};
21pub use try_new::{TryNew, try_new};
22pub use vec::Vec;
23
24use crate::error::OutOfMemory;
25use core::{alloc::Layout, ptr::NonNull};
26
27#[inline]
34unsafe fn try_alloc(layout: Layout) -> Result<NonNull<u8>, OutOfMemory> {
35 debug_assert!(layout.size() > 0);
37 let ptr = unsafe { std_alloc::alloc::alloc(layout) };
38
39 if let Some(ptr) = NonNull::new(ptr) {
40 Ok(ptr)
41 } else {
42 Err(OutOfMemory::new(layout.size()))
43 }
44}
45
46#[inline]
55unsafe fn try_realloc(
56 ptr: *mut u8,
57 layout: Layout,
58 new_size: usize,
59) -> Result<NonNull<u8>, OutOfMemory> {
60 debug_assert!(layout.size() > 0);
62 debug_assert!(new_size > 0);
63 let ptr = unsafe { std_alloc::alloc::realloc(ptr, layout, new_size) };
64
65 if let Some(ptr) = NonNull::new(ptr) {
66 Ok(ptr)
67 } else {
68 Err(OutOfMemory::new(new_size))
69 }
70}
71
72pub trait PanicOnOom {
78 type Result;
80
81 fn panic_on_oom(self) -> Self::Result;
83}
84
85impl<T> PanicOnOom for Result<T, OutOfMemory> {
86 type Result = T;
87
88 #[track_caller]
89 fn panic_on_oom(self) -> Self::Result {
90 match self {
91 Ok(x) => x,
92 Err(oom) => panic!("unhandled out-of-memory error: {oom}"),
93 }
94 }
95}
96
97fn str_ptr_from_raw_parts(ptr: *mut u8, len: usize) -> *mut str {
103 let ptr: *mut [u8] = core::ptr::slice_from_raw_parts_mut(ptr, len);
104 str_ptr_from_slice_ptr(ptr)
105}
106
107fn str_ptr_from_slice_ptr(ptr: *mut [u8]) -> *mut str {
113 let ptr: *mut str = unsafe { core::mem::transmute(ptr) };
115 ptr
116}