1 use crate::{handle_result, wasm_engine_t, wasm_memorytype_t, wasmtime_error_t, wasmtime_extern_t}; 2 use std::cell::UnsafeCell; 3 use std::mem::MaybeUninit; 4 use wasmtime::{Extern, SharedMemory}; 5 6 type wasmtime_sharedmemory_t = SharedMemory; 7 8 wasmtime_c_api_macros::declare_own!(wasmtime_sharedmemory_t); 9 10 #[no_mangle] 11 pub extern "C" fn wasmtime_sharedmemory_new( 12 engine: &wasm_engine_t, 13 ty: &wasm_memorytype_t, 14 ret: &mut *mut wasmtime_sharedmemory_t, 15 ) -> Option<Box<wasmtime_error_t>> { 16 handle_result( 17 SharedMemory::new(&engine.engine, ty.ty().ty.clone()), 18 |mem| *ret = Box::<wasmtime_sharedmemory_t>::into_raw(Box::new(mem)), 19 ) 20 } 21 22 #[no_mangle] 23 pub extern "C" fn wasmtime_sharedmemory_clone( 24 mem: &wasmtime_sharedmemory_t, 25 ) -> Box<wasmtime_sharedmemory_t> { 26 Box::new(mem.clone()) 27 } 28 29 #[no_mangle] 30 pub extern "C" fn wasmtime_sharedmemory_into_extern( 31 mem: Box<wasmtime_sharedmemory_t>, 32 ext: &mut MaybeUninit<wasmtime_extern_t>, 33 ) { 34 crate::initialize(ext, Extern::from(*mem).into()); 35 } 36 37 #[no_mangle] 38 pub extern "C" fn wasmtime_sharedmemory_type( 39 mem: &wasmtime_sharedmemory_t, 40 ) -> Box<wasm_memorytype_t> { 41 Box::new(wasm_memorytype_t::new(mem.ty())) 42 } 43 44 #[no_mangle] 45 pub extern "C" fn wasmtime_sharedmemory_data( 46 mem: &wasmtime_sharedmemory_t, 47 ) -> *const UnsafeCell<u8> { 48 mem.data().as_ptr() 49 } 50 51 #[no_mangle] 52 pub extern "C" fn wasmtime_sharedmemory_data_size(mem: &wasmtime_sharedmemory_t) -> usize { 53 mem.data().len() 54 } 55 56 #[no_mangle] 57 pub extern "C" fn wasmtime_sharedmemory_size(mem: &wasmtime_sharedmemory_t) -> u64 { 58 mem.size() 59 } 60 61 #[no_mangle] 62 pub extern "C" fn wasmtime_sharedmemory_grow( 63 mem: &wasmtime_sharedmemory_t, 64 delta: u64, 65 prev_size: &mut u64, 66 ) -> Option<Box<wasmtime_error_t>> { 67 handle_result(mem.grow(delta), |prev| *prev_size = prev) 68 } 69