1use crate::instance::ImportFunctionEnv;
5use crate::vmcontext::{VMFunctionImport, VMGlobalImport, VMMemoryImport, VMTableImport};
6use crate::{VMSharedSignatureIndex, VMTrampoline};
7use wasmer_types::entity::{BoxedSlice, PrimaryMap};
8use wasmer_types::{FunctionIndex, GlobalIndex, MemoryIndex, TableIndex};
9
10pub enum VMImportType {
12 Function {
14 sig: VMSharedSignatureIndex,
16 static_trampoline: VMTrampoline,
18 },
19 Global(wasmer_types::GlobalType),
21 Table(wasmer_types::TableType),
23 Memory(wasmer_types::MemoryType, crate::MemoryStyle),
25}
26
27pub struct VMImport {
29 pub import_no: u32,
33 pub module: String,
35 pub field: String,
37 pub ty: VMImportType,
39}
40
41#[derive(Clone)]
43pub struct Imports {
44 pub functions: BoxedSlice<FunctionIndex, VMFunctionImport>,
46
47 pub host_function_env_initializers: Option<BoxedSlice<FunctionIndex, ImportFunctionEnv>>,
58
59 pub tables: BoxedSlice<TableIndex, VMTableImport>,
61
62 pub memories: BoxedSlice<MemoryIndex, VMMemoryImport>,
64
65 pub globals: BoxedSlice<GlobalIndex, VMGlobalImport>,
67}
68
69impl Imports {
70 pub fn new(
72 function_imports: PrimaryMap<FunctionIndex, VMFunctionImport>,
73 host_function_env_initializers: PrimaryMap<FunctionIndex, ImportFunctionEnv>,
74 table_imports: PrimaryMap<TableIndex, VMTableImport>,
75 memory_imports: PrimaryMap<MemoryIndex, VMMemoryImport>,
76 global_imports: PrimaryMap<GlobalIndex, VMGlobalImport>,
77 ) -> Self {
78 Self {
79 functions: function_imports.into_boxed_slice(),
80 host_function_env_initializers: Some(host_function_env_initializers.into_boxed_slice()),
81 tables: table_imports.into_boxed_slice(),
82 memories: memory_imports.into_boxed_slice(),
83 globals: global_imports.into_boxed_slice(),
84 }
85 }
86
87 pub fn none() -> Self {
89 Self {
90 functions: PrimaryMap::new().into_boxed_slice(),
91 host_function_env_initializers: None,
92 tables: PrimaryMap::new().into_boxed_slice(),
93 memories: PrimaryMap::new().into_boxed_slice(),
94 globals: PrimaryMap::new().into_boxed_slice(),
95 }
96 }
97
98 pub fn get_imported_function_envs(&mut self) -> BoxedSlice<FunctionIndex, ImportFunctionEnv> {
104 self.host_function_env_initializers
105 .take()
106 .unwrap_or_else(|| PrimaryMap::new().into_boxed_slice())
107 }
108}