xref: /wasmtime-44.0.1/crates/core/src/alloc/arc.rs (revision 8325e1ec)
1 use super::TryNew;
2 use crate::error::OutOfMemory;
3 use std_alloc::sync::Arc;
4 
5 /// XXX: Stable Rust doesn't actually give us any method to build fallible
6 /// allocation for `Arc<T>`, so this is only actually fallible when using
7 /// nightly Rust and setting `RUSTFLAGS="--cfg arc_try_new"`.
8 impl<T> TryNew for Arc<T> {
9     type Value = T;
10 
11     #[inline]
try_new(value: T) -> Result<Self, OutOfMemory> where Self: Sized,12     fn try_new(value: T) -> Result<Self, OutOfMemory>
13     where
14         Self: Sized,
15     {
16         #[cfg(arc_try_new)]
17         return Arc::try_new(value).map_err(|_| {
18             // We don't have access to the exact size of the inner `Arc`
19             // allocation, but (at least at one point) it was made up of a
20             // strong ref count, a weak ref count, and the inner value.
21             let bytes = core::mem::size_of::<(usize, usize, T)>();
22             OutOfMemory::new(bytes)
23         });
24 
25         #[cfg(not(arc_try_new))]
26         return Ok(Arc::new(value));
27     }
28 }
29 
30 #[cfg(test)]
31 mod test {
32     use super::{Arc, TryNew};
33 
34     #[test]
try_new()35     fn try_new() {
36         <Arc<_> as TryNew>::try_new(4).unwrap();
37     }
38 }
39