wasmer_wasix/state/linker/
runtime_hooks.rs

1use 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}