1 use crate::{wasm_byte_vec_t, wasm_exporttype_vec_t, wasm_importtype_vec_t}; 2 use crate::{wasm_exporttype_t, wasm_importtype_t, wasm_store_t}; 3 use wasmtime::{HostRef, Module}; 4 5 #[repr(C)] 6 #[derive(Clone)] 7 pub struct wasm_module_t { 8 pub(crate) module: HostRef<Module>, 9 pub(crate) imports: Vec<wasm_importtype_t>, 10 pub(crate) exports: Vec<wasm_exporttype_t>, 11 } 12 13 wasmtime_c_api_macros::declare_ref!(wasm_module_t); 14 15 impl wasm_module_t { 16 fn anyref(&self) -> wasmtime::AnyRef { 17 self.module.anyref() 18 } 19 } 20 21 #[no_mangle] 22 pub extern "C" fn wasm_module_new( 23 store: &wasm_store_t, 24 binary: &wasm_byte_vec_t, 25 ) -> Option<Box<wasm_module_t>> { 26 let binary = binary.as_slice(); 27 let store = &store.store.borrow(); 28 let module = Module::from_binary(store, binary).ok()?; 29 let imports = module 30 .imports() 31 .iter() 32 .map(|i| wasm_importtype_t::new(i.clone())) 33 .collect::<Vec<_>>(); 34 let exports = module 35 .exports() 36 .iter() 37 .map(|e| wasm_exporttype_t::new(e.clone())) 38 .collect::<Vec<_>>(); 39 Some(Box::new(wasm_module_t { 40 module: HostRef::new(module), 41 imports, 42 exports, 43 })) 44 } 45 46 #[no_mangle] 47 pub extern "C" fn wasm_module_validate(store: &wasm_store_t, binary: &wasm_byte_vec_t) -> bool { 48 let binary = binary.as_slice(); 49 let store = &store.store.borrow(); 50 Module::validate(store, binary).is_ok() 51 } 52 53 #[no_mangle] 54 pub extern "C" fn wasm_module_exports(module: &wasm_module_t, out: &mut wasm_exporttype_vec_t) { 55 let buffer = module 56 .exports 57 .iter() 58 .map(|et| Some(Box::new(et.clone()))) 59 .collect::<Vec<_>>(); 60 out.set_buffer(buffer); 61 } 62 63 #[no_mangle] 64 pub extern "C" fn wasm_module_imports(module: &wasm_module_t, out: &mut wasm_importtype_vec_t) { 65 let buffer = module 66 .imports 67 .iter() 68 .map(|it| Some(Box::new(it.clone()))) 69 .collect::<Vec<_>>(); 70 out.set_buffer(buffer); 71 } 72