//! Implementation of the [official WebAssembly C //! API](https://github.com/WebAssembly/wasm-c-api) for Wasmer. //! //! We would like to remind the reader that this official standard can //! be characterized as a _living standard_. As such, the API is not //! yet stable, even though it shows maturity over time. The API is //! described by the `wasm.h` C header, which is included by //! `wasmer_wasm.h` C header file (which contains extension of the //! standard API, for example to provide WASI or vendor-specific //! features). //! //! # Quick Guide //! //! Usually, the user first needs to create an [`engine`] and a //! [`store`]. Once it's done, the user needs to create a [`module`] //! and then [instantiate][instance] it. When instantiating the //! module, the user is able to pass a set of //! [imports][externals]. With an instance, the user is able to call //! the [exports][instance::wasm_instance_exports]. //! //! Every module comes with examples and entry points to guide the //! discovery of this API. /// Private Rust macros. #[macro_use] pub mod macros; /// An engine drives the compilation and the runtime. /// /// Entry points: A default engine is created with /// [`wasm_engine_new`][engine::wasm_engine_new] and freed with /// [`wasm_engine_delete`][engine::wasm_engine_delete]. /// /// # Example /// /// The simplest way to get a default engine is the following: /// /// ```rust /// # use inline_c::assert_c; /// # fn main() { /// # (assert_c! { /// # #include "tests/wasmer_wasm.h" /// # /// int main() { /// // Create the engine. /// wasm_engine_t* engine = wasm_engine_new(); /// /// // Check we have a valid engine! /// assert(engine); /// /// // Free everything. /// wasm_engine_delete(engine); /// /// return 0; /// } /// # }) /// # .success(); /// # } /// ``` /// /// To configure the engine, see the [`wasm_config_new`][engine::wasm_config_new]. pub mod engine; /// cbindgen:ignore pub mod externals; /// 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. /// /// Entry points: A WebAssembly instance is created with /// [`wasm_instance_new`][instance::wasm_instance_new] and freed with /// [`wasm_instance_delete`][instance::wasm_instance_delete]. /// /// # Example /// /// The simplest way to instantiate a Wasm module is the following: /// /// ```rust /// # use inline_c::assert_c; /// # fn main() { /// # (assert_c! { /// # #include "tests/wasmer_wasm.h" /// # /// int main() { /// // Create the engine and the store. /// wasm_engine_t* engine = wasm_engine_new(); /// wasm_store_t* store = wasm_store_new(engine); /// /// // Create a WebAssembly module from a WAT definition. /// wasm_byte_vec_t wat; /// wasmer_byte_vec_new_from_string(&wat, "(module)"); /// wasm_byte_vec_t wasm; /// wat2wasm(&wat, &wasm); /// /// // Create the module. /// wasm_module_t* module = wasm_module_new(store, &wasm); /// assert(module); /// /// // Instantiate the module. /// wasm_extern_vec_t imports = WASM_EMPTY_VEC; /// wasm_trap_t* traps = NULL; /// /// wasm_instance_t* instance = wasm_instance_new(store, module, &imports, &traps); /// assert(instance); /// /// // Now do something with the instance, like calling the /// // exports with `wasm_instance_exports`. /// /// // Free everything. /// wasm_instance_delete(instance); /// wasm_module_delete(module); /// wasm_byte_vec_delete(&wasm); /// wasm_byte_vec_delete(&wat); /// wasm_store_delete(store); /// wasm_engine_delete(engine); /// /// return 0; /// } /// # }) /// # .success(); /// # } /// ``` /// /// cbindgen:ignore pub mod instance; /// A WebAssembly module contains stateless WebAssembly code that has /// already been compiled and can be instantiated multiple times. /// /// Entry points: A WebAssembly module is created with /// [`wasm_module_new`][module::wasm_module_new] and freed with /// [`wasm_module_delete`][module::wasm_module_delete]. /// /// # Example /// /// ```rust /// # use inline_c::assert_c; /// # fn main() { /// # (assert_c! { /// # #include "tests/wasmer_wasm.h" /// # /// int main() { /// // Create the engine and the store. /// wasm_engine_t* engine = wasm_engine_new(); /// wasm_store_t* store = wasm_store_new(engine); /// /// // Create a WebAssembly module from a WAT definition. /// wasm_byte_vec_t wat; /// wasmer_byte_vec_new_from_string(&wat, "(module)"); /// wasm_byte_vec_t wasm; /// wat2wasm(&wat, &wasm); /// /// // Create the module. /// wasm_module_t* module = wasm_module_new(store, &wasm); /// /// // It works! /// assert(module); /// /// // Free everything. /// wasm_byte_vec_delete(&wasm); /// wasm_byte_vec_delete(&wat); /// wasm_module_delete(module); /// wasm_store_delete(store); /// wasm_engine_delete(engine); /// /// return 0; /// } /// # }) /// # .success(); /// # } /// ``` /// /// cbindgen:ignore pub mod module; /// A store represents all global state that can be manipulated by /// WebAssembly programs. It consists of the runtime representation of /// all instances of functions, tables, memories, and globals that /// have been allocated during the lifetime of the abstract machine. /// /// The store holds the [engine] (that is —amonst many things— used to /// compile the Wasm bytes into a valid [module] artifact), in addition /// to extra private types. /// /// Entry points: A store is created with /// [`wasm_store_new`][store::wasm_store_new] and freed with /// [`wasm_store_delete`][store::wasm_store_delete]. To customize the /// engine the store holds, see /// [`wasm_config_new`][engine::wasm_config_new]. /// /// # Example /// /// ```rust /// # use inline_c::assert_c; /// # fn main() { /// # (assert_c! { /// # #include "tests/wasmer_wasm.h" /// # /// int main() { /// // Create the engine. /// wasm_engine_t* engine = wasm_engine_new(); /// /// // Create the store. /// wasm_store_t* store = wasm_store_new(engine); /// /// // It works! /// assert(store); /// /// // Free everything. /// wasm_store_delete(store); /// wasm_engine_delete(engine); /// /// return 0; /// } /// # }) /// # .success(); /// # } /// ``` /// /// cbindgen:ignore pub mod store; /// cbindgen:ignore pub mod trap; /// cbindgen:ignore pub mod types; /// Possible runtime values that a WebAssembly module can either /// consume or produce. /// /// cbindgen:ignore pub mod value; /// Wasmer-specific API to get or query the version of this Wasm C API. /// /// The `wasmer_wasm.h` file provides the `WASMER_VERSION`, /// `WASMER_VERSION_MAJOR`, `WASMER_VERSION_MINOR`, /// `WASMER_VERSION_PATCH` and `WASMER_VERSION_PRE` /// constants. However, in absence of this header file, it is possible /// to retrieve the same information with their respective functions, /// namely [`wasmer_version`][version::wasmer_version], /// [`wasmer_version_major`][version::wasmer_version_major], /// [`wasmer_version_minor`][version::wasmer_version_minor], /// [`wasmer_version_patch`][version::wasmer_version_patch], and /// [`wasmer_version_pre`][version::wasmer_version_pre]. /// /// # Example /// /// ```rust /// # use inline_c::assert_c; /// # fn main() { /// # (assert_c! { /// # #include "tests/wasmer_wasm.h" /// # /// int main() { /// // Get and print the version. /// const char* version = wasmer_version(); /// printf("%s", version); /// /// // No need to free the string. It's statically allocated on /// // the Rust side. /// /// return 0; /// } /// # }) /// # .success() /// # .stdout(env!("CARGO_PKG_VERSION")); /// # } /// ``` pub mod version; #[cfg(feature = "wasi")] pub mod wasi; pub mod wasmer; /// Wasmer-specific API to transform the WAT format into Wasm bytes. /// /// It is used mostly for testing or for small program purposes. /// /// # Example /// /// ```rust /// # use inline_c::assert_c; /// # fn main() { /// # (assert_c! { /// # #include "tests/wasmer_wasm.h" /// # /// int main() { /// // Our WAT module. /// wasm_byte_vec_t wat; /// wasm_byte_vec_new(&wat, 8, "(module)"); /// /// // Our Wasm bytes. /// wasm_byte_vec_t wasm; /// wat2wasm(&wat, &wasm); /// /// // It works! /// assert(wasm.size > 0); /// /// // Free everything. /// wasm_byte_vec_delete(&wasm); /// wasm_byte_vec_delete(&wat); /// /// return 0; /// } /// # }) /// # .success(); /// # } /// ``` #[cfg(feature = "wat")] pub mod wat;