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