cardinal_wasm_plugins/
instance.rs

1use crate::host::make_imports;
2use crate::plugin::WasmPlugin;
3use crate::runner::HostFunctionMap;
4use crate::SharedExecutionContext;
5use cardinal_errors::internal::CardinalInternalError;
6use cardinal_errors::CardinalError;
7use wasmer::{FunctionEnv, Instance, Memory, Store};
8
9pub struct WasmInstance {
10    pub store: Store,
11    pub instance: Instance,
12    pub memory: Memory,
13    pub env: FunctionEnv<SharedExecutionContext>, // <— store the env here
14}
15
16impl WasmInstance {
17    pub fn from_plugin(
18        plugin: &WasmPlugin,
19        host_imports: Option<&HostFunctionMap>,
20        ctx: SharedExecutionContext,
21    ) -> Result<Self, CardinalError> {
22        let mut store = Store::new(plugin.engine.clone());
23
24        let env = FunctionEnv::new(&mut store, ctx.clone());
25
26        let imports = make_imports(&mut store, &env, host_imports);
27
28        // Create the instance.
29        let instance = Instance::new(&mut store, &plugin.module, &imports).map_err(|e| {
30            CardinalError::InternalError(CardinalInternalError::InvalidWasmModule(format!(
31                "Error creating WASM Instance {e}"
32            )))
33        })?;
34
35        // Stash it in the env so host imports can access it.
36        // Get the guest linear memory (usually named "memory")
37        let memory_name = plugin.memory_name.as_str(); // or default to "memory"
38        let memory = instance
39            .exports
40            .get_memory(memory_name)
41            .map_err(|e| {
42                CardinalError::InternalError(CardinalInternalError::InvalidWasmModule(format!(
43                    "missing memory export `{memory_name}`: {e}"
44                )))
45            })?
46            .clone();
47
48        {
49            let env_mut = env.as_mut(&mut store);
50            let mut inner_exec_ctx = env_mut.write();
51            inner_exec_ctx.replace_memory(memory.clone());
52        }
53
54        Ok(WasmInstance {
55            store,
56            instance,
57            memory,
58            env,
59        })
60    }
61}