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