wasmer-wasix 0.702.0

WASI and WASIX implementation library for Wasmer WebAssembly runtime
use tracing::warn;
use wasmer::{AsStoreMut, FunctionEnv, Imports, Instance, Memory, Module};

use crate::WasiEnv;

use super::LinkError;

pub(super) fn instantiate_with_runtime_hooks(
    env: &FunctionEnv<WasiEnv>,
    store: &mut impl AsStoreMut,
    module: &Module,
    imports: &mut Imports,
    imported_memory: &Memory,
) -> Result<Instance, LinkError> {
    let runtime = env.as_ref(store).runtime.clone();

    {
        let mut store_mut = store.as_store_mut();
        let additional_imports = runtime
            .additional_imports(module, &mut store_mut)
            .map_err(LinkError::RuntimeHookError)?;
        merge_missing_imports(imports, &additional_imports);
    }

    let instance = Instance::new(store, module, imports)?;

    {
        let mut store_mut = store.as_store_mut();
        runtime
            .configure_new_instance(module, &mut store_mut, &instance, Some(imported_memory))
            .map_err(LinkError::RuntimeHookError)?;
    }

    Ok(instance)
}

fn merge_missing_imports(imports: &mut Imports, additional_imports: &Imports) {
    for (namespace, name, value) in additional_imports.iter() {
        if imports.exists(namespace, name) {
            warn!(
                "Skipping duplicate additional import {}.{}",
                namespace, name
            );
        } else {
            imports.define(namespace, name, value.clone());
        }
    }
}