1 //! Utility module to create trampolines in/out WebAssembly module.
2 
3 mod global;
4 mod memory;
5 mod table;
6 mod tag;
7 
8 pub use self::global::*;
9 pub(crate) use memory::MemoryCreatorProxy;
10 
11 use self::memory::create_memory;
12 use self::table::create_table;
13 use self::tag::create_tag;
14 use crate::prelude::*;
15 use crate::runtime::vm::{ExportMemory, SharedMemory};
16 use crate::store::{StoreOpaque, StoreResourceLimiter};
17 use crate::{MemoryType, TableType, TagType};
18 use wasmtime_environ::{MemoryIndex, TableIndex, TagIndex};
19 
20 pub async fn generate_memory_export(
21     store: &mut StoreOpaque,
22     limiter: Option<&mut StoreResourceLimiter<'_>>,
23     m: &MemoryType,
24     preallocation: Option<&SharedMemory>,
25 ) -> Result<ExportMemory> {
26     let id = store.id();
27     let instance = create_memory(store, limiter, m, preallocation).await?;
28     Ok(store
29         .instance_mut(instance)
30         .get_exported_memory(id, MemoryIndex::from_u32(0)))
31 }
32 
33 pub async fn generate_table_export(
34     store: &mut StoreOpaque,
35     limiter: Option<&mut StoreResourceLimiter<'_>>,
36     t: &TableType,
37 ) -> Result<crate::Table> {
38     let id = store.id();
39     let instance = create_table(store, limiter, t).await?;
40     Ok(store
41         .instance_mut(instance)
42         .get_exported_table(id, TableIndex::from_u32(0)))
43 }
44 
45 pub fn generate_tag_export(store: &mut StoreOpaque, t: &TagType) -> Result<crate::Tag> {
46     let id = store.id();
47     let instance = create_tag(store, t)?;
48     Ok(store
49         .instance_mut(instance)
50         .get_exported_tag(id, TagIndex::from_u32(0)))
51 }
52