cardinal_wasm_plugins/
instance.rs1use 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>, }
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 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 let memory_name = plugin.memory_name.as_str(); 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}