wasmtime/runtime/component/
storage.rs1use crate::ValRaw;
2use core::mem::{self, MaybeUninit};
3use core::slice;
4
5fn assert_raw_slice_compat<T>() {
6 assert!(mem::size_of::<T>() % mem::size_of::<ValRaw>() == 0);
7 assert!(mem::align_of::<T>() == mem::align_of::<ValRaw>());
8}
9
10pub unsafe fn storage_as_slice<T>(storage: &T) -> &[ValRaw] {
13 assert_raw_slice_compat::<T>();
14
15 slice::from_raw_parts(
16 (storage as *const T).cast(),
17 mem::size_of_val(storage) / mem::size_of::<ValRaw>(),
18 )
19}
20
21pub unsafe fn storage_as_slice_mut<T>(storage: &mut T) -> &mut [ValRaw] {
23 assert_raw_slice_compat::<T>();
24
25 slice::from_raw_parts_mut(
26 (storage as *mut T).cast(),
27 mem::size_of_val(storage) / mem::size_of::<ValRaw>(),
28 )
29}
30
31pub unsafe fn slice_to_storage_mut<T>(slice: &mut [MaybeUninit<ValRaw>]) -> &mut MaybeUninit<T> {
33 assert_raw_slice_compat::<T>();
34
35 assert!(mem::size_of_val(slice) >= mem::size_of::<T>());
41
42 &mut *slice.as_mut_ptr().cast()
43}