xref: /wasmtime-44.0.1/crates/c-api/src/vec.rs (revision 4f2fa154)
141caf67aSAlex Crichton use crate::{
241caf67aSAlex Crichton     wasm_exporttype_t, wasm_extern_t, wasm_externtype_t, wasm_frame_t, wasm_functype_t,
37a1b7cdfSAlex Crichton     wasm_globaltype_t, wasm_importtype_t, wasm_memorytype_t, wasm_tabletype_t, wasm_val_t,
47a1b7cdfSAlex Crichton     wasm_valtype_t,
541caf67aSAlex Crichton };
66ef09359SAlex Crichton use std::mem;
7f94db655SPeter Huene use std::mem::MaybeUninit;
86ef09359SAlex Crichton use std::ptr;
96ef09359SAlex Crichton use std::slice;
106ef09359SAlex Crichton 
116ef09359SAlex Crichton pub type wasm_name_t = wasm_byte_vec_t;
126ef09359SAlex Crichton 
136ef09359SAlex Crichton impl wasm_name_t {
from_name(name: String) -> wasm_name_t149364eb1dSDan Gohman     pub(crate) fn from_name(name: String) -> wasm_name_t {
159364eb1dSDan Gohman         name.into_bytes().into()
166ef09359SAlex Crichton     }
176ef09359SAlex Crichton }
186ef09359SAlex Crichton 
196ef09359SAlex Crichton macro_rules! declare_vecs {
206ef09359SAlex Crichton     (
216ef09359SAlex Crichton         $((
222afaac51SAlex Crichton             name: $name:ident $(<$lt:tt>)?,
236ef09359SAlex Crichton             ty: $elem_ty:ty,
246ef09359SAlex Crichton             new: $new:ident,
256ef09359SAlex Crichton             empty: $empty:ident,
266ef09359SAlex Crichton             uninit: $uninit:ident,
276ef09359SAlex Crichton             copy: $copy:ident,
286ef09359SAlex Crichton             delete: $delete:ident,
296ef09359SAlex Crichton         ))*
306ef09359SAlex Crichton     ) => {$(
316ef09359SAlex Crichton         #[repr(C)]
322afaac51SAlex Crichton         pub struct $name $(<$lt>)? {
336ef09359SAlex Crichton             size: usize,
346ef09359SAlex Crichton             data: *mut $elem_ty,
356ef09359SAlex Crichton         }
366ef09359SAlex Crichton 
372afaac51SAlex Crichton         impl$(<$lt>)? $name $(<$lt>)? {
386ef09359SAlex Crichton             pub fn set_buffer(&mut self, buffer: Vec<$elem_ty>) {
396ef09359SAlex Crichton                 let mut vec = buffer.into_boxed_slice();
406ef09359SAlex Crichton                 self.size = vec.len();
416ef09359SAlex Crichton                 self.data = vec.as_mut_ptr();
426ef09359SAlex Crichton                 mem::forget(vec);
436ef09359SAlex Crichton             }
446ef09359SAlex Crichton 
456ef09359SAlex Crichton             pub fn as_slice(&self) -> &[$elem_ty] {
460aa94652SAlex Crichton                 // Note that we're careful to not create a slice with a null
470aa94652SAlex Crichton                 // pointer as the data pointer, since that isn't defined
480aa94652SAlex Crichton                 // behavior in Rust.
490aa94652SAlex Crichton                 if self.size == 0 {
500aa94652SAlex Crichton                     &[]
510aa94652SAlex Crichton                 } else {
520aa94652SAlex Crichton                     assert!(!self.data.is_null());
536ef09359SAlex Crichton                     unsafe { slice::from_raw_parts(self.data, self.size) }
546ef09359SAlex Crichton                 }
550aa94652SAlex Crichton             }
566ef09359SAlex Crichton 
57f94db655SPeter Huene             pub fn as_uninit_slice(&mut self) -> &mut [MaybeUninit<$elem_ty>] {
58f94db655SPeter Huene                 // Note that we're careful to not create a slice with a null
59f94db655SPeter Huene                 // pointer as the data pointer, since that isn't defined
60f94db655SPeter Huene                 // behavior in Rust.
61f94db655SPeter Huene                 if self.size == 0 {
62f94db655SPeter Huene                     &mut []
63f94db655SPeter Huene                 } else {
64f94db655SPeter Huene                     assert!(!self.data.is_null());
65f94db655SPeter Huene                     unsafe { slice::from_raw_parts_mut(self.data as _, self.size) }
66f94db655SPeter Huene                 }
67f94db655SPeter Huene             }
68f94db655SPeter Huene 
696ef09359SAlex Crichton             pub fn take(&mut self) -> Vec<$elem_ty> {
706ef09359SAlex Crichton                 if self.data.is_null() {
716ef09359SAlex Crichton                     return Vec::new();
726ef09359SAlex Crichton                 }
736ef09359SAlex Crichton                 let vec = unsafe {
746ef09359SAlex Crichton                     Vec::from_raw_parts(self.data, self.size, self.size)
756ef09359SAlex Crichton                 };
766ef09359SAlex Crichton                 self.data = ptr::null_mut();
776ef09359SAlex Crichton                 self.size = 0;
786ef09359SAlex Crichton                 return vec;
796ef09359SAlex Crichton             }
806ef09359SAlex Crichton         }
816ef09359SAlex Crichton 
829a26c101SMangoPeachGrape         impl$(<$lt>)? Default for $name $(<$lt>)? {
839a26c101SMangoPeachGrape             fn default() -> Self {
849a26c101SMangoPeachGrape                 Self {
859a26c101SMangoPeachGrape                     size: 0,
869a26c101SMangoPeachGrape                     data: ptr::null_mut(),
879a26c101SMangoPeachGrape                 }
889a26c101SMangoPeachGrape             }
899a26c101SMangoPeachGrape         }
909a26c101SMangoPeachGrape 
912afaac51SAlex Crichton         impl$(<$lt>)? Clone for $name $(<$lt>)? {
926d61c157SAmanieu d'Antras             fn clone(&self) -> Self {
936d61c157SAmanieu d'Antras                 self.as_slice().to_vec().into()
946d61c157SAmanieu d'Antras             }
956d61c157SAmanieu d'Antras         }
966d61c157SAmanieu d'Antras 
972afaac51SAlex Crichton         impl$(<$lt>)? From<Vec<$elem_ty>> for $name $(<$lt>)? {
98036c8ec8SAlex Crichton             fn from(vec: Vec<$elem_ty>) -> Self {
99036c8ec8SAlex Crichton                 let mut vec = vec.into_boxed_slice();
1006ef09359SAlex Crichton                 let result = $name {
1016ef09359SAlex Crichton                     size: vec.len(),
1026ef09359SAlex Crichton                     data: vec.as_mut_ptr(),
1036ef09359SAlex Crichton                 };
1046ef09359SAlex Crichton                 mem::forget(vec);
1056ef09359SAlex Crichton                 result
1066ef09359SAlex Crichton             }
1076ef09359SAlex Crichton         }
1086ef09359SAlex Crichton 
1092afaac51SAlex Crichton         impl$(<$lt>)? Drop for $name $(<$lt>)? {
1106ef09359SAlex Crichton             fn drop(&mut self) {
1116ef09359SAlex Crichton                 drop(self.take());
1126ef09359SAlex Crichton             }
1136ef09359SAlex Crichton         }
1146ef09359SAlex Crichton 
115ae84e6edSAlex Crichton         #[unsafe(no_mangle)]
1166ef09359SAlex Crichton         pub extern "C" fn $empty(out: &mut $name) {
1176ef09359SAlex Crichton             out.size = 0;
1186ef09359SAlex Crichton             out.data = ptr::null_mut();
1196ef09359SAlex Crichton         }
1206ef09359SAlex Crichton 
121ae84e6edSAlex Crichton         #[unsafe(no_mangle)]
1226ef09359SAlex Crichton         pub extern "C" fn $uninit(out: &mut $name, size: usize) {
1236ef09359SAlex Crichton             out.set_buffer(vec![Default::default(); size]);
1246ef09359SAlex Crichton         }
1256ef09359SAlex Crichton 
126ae84e6edSAlex Crichton         #[unsafe(no_mangle)]
1272afaac51SAlex Crichton         pub unsafe extern "C" fn $new $(<$lt>)? (
1282afaac51SAlex Crichton             out: &mut $name $(<$lt>)?,
1296ef09359SAlex Crichton             size: usize,
1306ef09359SAlex Crichton             ptr: *const $elem_ty,
1316ef09359SAlex Crichton         ) {
132ce67e7fcSAmanieu d'Antras             let vec = (0..size).map(|i| ptr.add(i).read()).collect();
133ce67e7fcSAmanieu d'Antras             out.set_buffer(vec);
1346ef09359SAlex Crichton         }
1356ef09359SAlex Crichton 
136ae84e6edSAlex Crichton         #[unsafe(no_mangle)]
1372afaac51SAlex Crichton         pub extern "C" fn $copy $(<$lt>)? (
1382afaac51SAlex Crichton             out: &mut $name $(<$lt>)?,
1392afaac51SAlex Crichton             src: &$name $(<$lt>)?,
1402afaac51SAlex Crichton         ) {
1416ef09359SAlex Crichton             out.set_buffer(src.as_slice().to_vec());
1426ef09359SAlex Crichton         }
1436ef09359SAlex Crichton 
144ae84e6edSAlex Crichton         #[unsafe(no_mangle)]
1452afaac51SAlex Crichton         pub extern "C" fn $delete $(<$lt>)? (out: &mut $name $(<$lt>)?) {
1466ef09359SAlex Crichton             out.take();
1476ef09359SAlex Crichton         }
1486ef09359SAlex Crichton     )*};
1496ef09359SAlex Crichton }
1506ef09359SAlex Crichton 
151*4f2fa154SAlex Crichton #[cfg(feature = "async")]
152b2c64de1SMangoPeachGrape pub(crate) use declare_vecs;
153b2c64de1SMangoPeachGrape 
1546ef09359SAlex Crichton declare_vecs! {
1556ef09359SAlex Crichton     (
1566ef09359SAlex Crichton         name: wasm_byte_vec_t,
1576ef09359SAlex Crichton         ty: u8,
1586ef09359SAlex Crichton         new: wasm_byte_vec_new,
1596ef09359SAlex Crichton         empty: wasm_byte_vec_new_empty,
1606ef09359SAlex Crichton         uninit: wasm_byte_vec_new_uninitialized,
1616ef09359SAlex Crichton         copy: wasm_byte_vec_copy,
1626ef09359SAlex Crichton         delete: wasm_byte_vec_delete,
1636ef09359SAlex Crichton     )
1646ef09359SAlex Crichton     (
1656ef09359SAlex Crichton         name: wasm_valtype_vec_t,
1666ef09359SAlex Crichton         ty: Option<Box<wasm_valtype_t>>,
1676ef09359SAlex Crichton         new: wasm_valtype_vec_new,
1686ef09359SAlex Crichton         empty: wasm_valtype_vec_new_empty,
1696ef09359SAlex Crichton         uninit: wasm_valtype_vec_new_uninitialized,
1706ef09359SAlex Crichton         copy: wasm_valtype_vec_copy,
1716ef09359SAlex Crichton         delete: wasm_valtype_vec_delete,
1726ef09359SAlex Crichton     )
1736ef09359SAlex Crichton     (
1746ef09359SAlex Crichton         name: wasm_functype_vec_t,
1756ef09359SAlex Crichton         ty: Option<Box<wasm_functype_t>>,
1766ef09359SAlex Crichton         new: wasm_functype_vec_new,
1776ef09359SAlex Crichton         empty: wasm_functype_vec_new_empty,
1786ef09359SAlex Crichton         uninit: wasm_functype_vec_new_uninitialized,
1796ef09359SAlex Crichton         copy: wasm_functype_vec_copy,
1806ef09359SAlex Crichton         delete: wasm_functype_vec_delete,
1816ef09359SAlex Crichton     )
1826ef09359SAlex Crichton     (
1836ef09359SAlex Crichton         name: wasm_globaltype_vec_t,
1846ef09359SAlex Crichton         ty: Option<Box<wasm_globaltype_t>>,
1856ef09359SAlex Crichton         new: wasm_globaltype_vec_new,
1866ef09359SAlex Crichton         empty: wasm_globaltype_vec_new_empty,
1876ef09359SAlex Crichton         uninit: wasm_globaltype_vec_new_uninitialized,
1886ef09359SAlex Crichton         copy: wasm_globaltype_vec_copy,
1896ef09359SAlex Crichton         delete: wasm_globaltype_vec_delete,
1906ef09359SAlex Crichton     )
1916ef09359SAlex Crichton     (
1926ef09359SAlex Crichton         name: wasm_tabletype_vec_t,
1936ef09359SAlex Crichton         ty: Option<Box<wasm_tabletype_t>>,
1946ef09359SAlex Crichton         new: wasm_tabletype_vec_new,
1956ef09359SAlex Crichton         empty: wasm_tabletype_vec_new_empty,
1966ef09359SAlex Crichton         uninit: wasm_tabletype_vec_new_uninitialized,
1976ef09359SAlex Crichton         copy: wasm_tabletype_vec_copy,
1986ef09359SAlex Crichton         delete: wasm_tabletype_vec_delete,
1996ef09359SAlex Crichton     )
2006ef09359SAlex Crichton     (
2016ef09359SAlex Crichton         name: wasm_memorytype_vec_t,
2026ef09359SAlex Crichton         ty: Option<Box<wasm_memorytype_t>>,
2036ef09359SAlex Crichton         new: wasm_memorytype_vec_new,
2046ef09359SAlex Crichton         empty: wasm_memorytype_vec_new_empty,
2056ef09359SAlex Crichton         uninit: wasm_memorytype_vec_new_uninitialized,
2066ef09359SAlex Crichton         copy: wasm_memorytype_vec_copy,
2076ef09359SAlex Crichton         delete: wasm_memorytype_vec_delete,
2086ef09359SAlex Crichton     )
2096ef09359SAlex Crichton     (
2106ef09359SAlex Crichton         name: wasm_externtype_vec_t,
2116ef09359SAlex Crichton         ty: Option<Box<wasm_externtype_t>>,
2126ef09359SAlex Crichton         new: wasm_externtype_vec_new,
2136ef09359SAlex Crichton         empty: wasm_externtype_vec_new_empty,
2146ef09359SAlex Crichton         uninit: wasm_externtype_vec_new_uninitialized,
2156ef09359SAlex Crichton         copy: wasm_externtype_vec_copy,
2166ef09359SAlex Crichton         delete: wasm_externtype_vec_delete,
2176ef09359SAlex Crichton     )
2186ef09359SAlex Crichton     (
2196ef09359SAlex Crichton         name: wasm_importtype_vec_t,
2206ef09359SAlex Crichton         ty: Option<Box<wasm_importtype_t>>,
2216ef09359SAlex Crichton         new: wasm_importtype_vec_new,
2226ef09359SAlex Crichton         empty: wasm_importtype_vec_new_empty,
2236ef09359SAlex Crichton         uninit: wasm_importtype_vec_new_uninitialized,
2246ef09359SAlex Crichton         copy: wasm_importtype_vec_copy,
2256ef09359SAlex Crichton         delete: wasm_importtype_vec_delete,
2266ef09359SAlex Crichton     )
2276ef09359SAlex Crichton     (
2286ef09359SAlex Crichton         name: wasm_exporttype_vec_t,
2296ef09359SAlex Crichton         ty: Option<Box<wasm_exporttype_t>>,
2306ef09359SAlex Crichton         new: wasm_exporttype_vec_new,
2316ef09359SAlex Crichton         empty: wasm_exporttype_vec_new_empty,
2326ef09359SAlex Crichton         uninit: wasm_exporttype_vec_new_uninitialized,
2336ef09359SAlex Crichton         copy: wasm_exporttype_vec_copy,
2346ef09359SAlex Crichton         delete: wasm_exporttype_vec_delete,
2356ef09359SAlex Crichton     )
2366ef09359SAlex Crichton     (
2376ef09359SAlex Crichton         name: wasm_val_vec_t,
2386ef09359SAlex Crichton         ty: wasm_val_t,
2396ef09359SAlex Crichton         new: wasm_val_vec_new,
2406ef09359SAlex Crichton         empty: wasm_val_vec_new_empty,
2416ef09359SAlex Crichton         uninit: wasm_val_vec_new_uninitialized,
2426ef09359SAlex Crichton         copy: wasm_val_vec_copy,
2436ef09359SAlex Crichton         delete: wasm_val_vec_delete,
2446ef09359SAlex Crichton     )
2456ef09359SAlex Crichton     (
2462afaac51SAlex Crichton         name: wasm_frame_vec_t<'a>,
2472afaac51SAlex Crichton         ty: Option<Box<wasm_frame_t<'a>>>,
2486ef09359SAlex Crichton         new: wasm_frame_vec_new,
2496ef09359SAlex Crichton         empty: wasm_frame_vec_new_empty,
2506ef09359SAlex Crichton         uninit: wasm_frame_vec_new_uninitialized,
2516ef09359SAlex Crichton         copy: wasm_frame_vec_copy,
2526ef09359SAlex Crichton         delete: wasm_frame_vec_delete,
2536ef09359SAlex Crichton     )
2546ef09359SAlex Crichton     (
2556ef09359SAlex Crichton         name: wasm_extern_vec_t,
2566ef09359SAlex Crichton         ty: Option<Box<wasm_extern_t>>,
2576ef09359SAlex Crichton         new: wasm_extern_vec_new,
2586ef09359SAlex Crichton         empty: wasm_extern_vec_new_empty,
2596ef09359SAlex Crichton         uninit: wasm_extern_vec_new_uninitialized,
2606ef09359SAlex Crichton         copy: wasm_extern_vec_copy,
2616ef09359SAlex Crichton         delete: wasm_extern_vec_delete,
2626ef09359SAlex Crichton     )
2636ef09359SAlex Crichton }
264