wasmer_wasix/state/linker/
runtime_hooks.rs1use tracing::warn;
2use wasmer::{AsStoreMut, FunctionEnv, Imports, Instance, Memory, Module};
3
4use crate::WasiEnv;
5
6use super::LinkError;
7
8pub(super) fn instantiate_with_runtime_hooks(
9 env: &FunctionEnv<WasiEnv>,
10 store: &mut impl AsStoreMut,
11 module: &Module,
12 imports: &mut Imports,
13 imported_memory: &Memory,
14) -> Result<Instance, LinkError> {
15 let runtime = env.as_ref(store).runtime.clone();
16
17 {
18 let mut store_mut = store.as_store_mut();
19 let additional_imports = runtime
20 .additional_imports(module, &mut store_mut)
21 .map_err(LinkError::RuntimeHookError)?;
22 merge_missing_imports(imports, &additional_imports);
23 }
24
25 let instance = Instance::new(store, module, imports)?;
26
27 {
28 let mut store_mut = store.as_store_mut();
29 runtime
30 .configure_new_instance(module, &mut store_mut, &instance, Some(imported_memory))
31 .map_err(LinkError::RuntimeHookError)?;
32 }
33
34 Ok(instance)
35}
36
37fn merge_missing_imports(imports: &mut Imports, additional_imports: &Imports) {
38 for (namespace, name, value) in additional_imports.iter() {
39 if imports.exists(namespace, name) {
40 warn!(
41 "Skipping duplicate additional import {}.{}",
42 namespace, name
43 );
44 } else {
45 imports.define(namespace, name, value.clone());
46 }
47 }
48}