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 let instantiation_state = {
18 let mut store_mut = store.as_store_mut();
19 let (additional_imports, instantiation_state) = runtime
20 .additional_imports(module, &mut store_mut)
21 .map_err(LinkError::RuntimeHookError)?;
22 merge_missing_imports(imports, &additional_imports);
23 instantiation_state
24 };
25
26 let instance = Instance::new(store, module, imports)?;
27
28 {
29 let mut store_mut = store.as_store_mut();
30 runtime
31 .configure_new_instance(
32 module,
33 &mut store_mut,
34 &instance,
35 Some(imported_memory),
36 instantiation_state,
37 )
38 .map_err(LinkError::RuntimeHookError)?;
39 }
40
41 Ok(instance)
42}
43
44fn merge_missing_imports(imports: &mut Imports, additional_imports: &Imports) {
45 for (namespace, name, value) in additional_imports.iter() {
46 if imports.exists(namespace, name) {
47 warn!(
48 "Skipping duplicate additional import {}.{}",
49 namespace, name
50 );
51 } else {
52 imports.define(namespace, name, value.clone());
53 }
54 }
55}