linera_wasmer/instance.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
use crate::exports::Exports;
use crate::module::Module;
use crate::{Extern, InstantiationError};
use std::fmt;
use crate::imports::Imports;
use crate::store::AsStoreMut;
#[cfg(feature = "js")]
use crate::js::instance as instance_imp;
#[cfg(feature = "jsc")]
use crate::jsc::instance as instance_imp;
#[cfg(feature = "sys")]
use crate::sys::instance as instance_imp;
/// A WebAssembly Instance is a stateful, executable
/// instance of a WebAssembly [`Module`].
///
/// Instance objects contain all the exported WebAssembly
/// functions, memories, tables and globals that allow
/// interacting with WebAssembly.
///
/// Spec: <https://webassembly.github.io/spec/core/exec/runtime.html#module-instances>
#[derive(Clone, PartialEq, Eq)]
pub struct Instance {
pub(crate) _inner: instance_imp::Instance,
pub(crate) module: Module,
/// The exports for an instance.
pub exports: Exports,
}
impl Instance {
/// Creates a new `Instance` from a WebAssembly [`Module`] and a
/// set of imports using [`Imports`] or the [`imports!`] macro helper.
///
/// [`imports!`]: crate::imports!
/// [`Imports!`]: crate::Imports!
///
/// ```
/// # use wasmer::{imports, Store, Module, Global, Value, Instance};
/// # use wasmer::FunctionEnv;
/// # fn main() -> anyhow::Result<()> {
/// let mut store = Store::default();
/// let env = FunctionEnv::new(&mut store, ());
/// let module = Module::new(&store, "(module)")?;
/// let imports = imports!{
/// "host" => {
/// "var" => Global::new(&mut store, Value::I32(2))
/// }
/// };
/// let instance = Instance::new(&mut store, &module, &imports)?;
/// # Ok(())
/// # }
/// ```
///
/// ## Errors
///
/// The function can return [`InstantiationError`]s.
///
/// Those are, as defined by the spec:
/// * Link errors that happen when plugging the imports into the instance
/// * Runtime errors that happen when running the module `start` function.
#[allow(clippy::result_large_err)]
pub fn new(
store: &mut impl AsStoreMut,
module: &Module,
imports: &Imports,
) -> Result<Self, InstantiationError> {
let (_inner, exports) = instance_imp::Instance::new(store, module, imports)?;
Ok(Self {
_inner,
module: module.clone(),
exports,
})
}
/// Creates a new `Instance` from a WebAssembly [`Module`] and a
/// vector of imports.
///
/// ## Errors
///
/// The function can return [`InstantiationError`]s.
///
/// Those are, as defined by the spec:
/// * Link errors that happen when plugging the imports into the instance
/// * Runtime errors that happen when running the module `start` function.
#[allow(clippy::result_large_err)]
pub fn new_by_index(
store: &mut impl AsStoreMut,
module: &Module,
externs: &[Extern],
) -> Result<Self, InstantiationError> {
let (_inner, exports) = instance_imp::Instance::new_by_index(store, module, externs)?;
Ok(Self {
_inner,
module: module.clone(),
exports,
})
}
/// Gets the [`Module`] associated with this instance.
pub fn module(&self) -> &Module {
&self.module
}
}
impl fmt::Debug for Instance {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("Instance")
.field("exports", &self.exports)
.finish()
}
}