xref: /wasmtime-44.0.1/crates/c-api/src/module.rs (revision dff789c7)
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