[][src]Struct wasmtime::Module

pub struct Module { /* fields omitted */ }

A compiled WebAssembly module, ready to be instantiated.

A Module is a compiled in-memory representation of an input WebAssembly binary. A Module is then used to create an Instance through an instantiation process. You cannot call functions or fetch globals, for example, on a Module because it's purely a code representation. Instead you'll need to create an Instance to interact with the wasm module.

Creating a Module currently involves compiling code, meaning that it can be an expensive operation. All Module instances are compiled according to the configuration in Config, but typically they're JIT-compiled. If you'd like to instantiate a module multiple times you can do so with compiling the original wasm module only once with a single Module instance.

Modules and Clone

Using clone on a Module is a cheap operation. It will not create an entirely new module, but rather just a new reference to the existing module. In other words it's a shallow copy, not a deep copy.

Examples

There are a number of ways you can create a Module, for example pulling the bytes from a number of locations. One example is loading a module from the filesystem:

let store = Store::default();
let module = Module::from_file(&store, "path/to/foo.wasm")?;

You can also load the wasm text format if more convenient too:

let store = Store::default();
// Now we're using the WebAssembly text extension: `.wat`!
let module = Module::from_file(&store, "path/to/foo.wat")?;

And if you've already got the bytes in-memory you can use the Module::new constructor:

let store = Store::default();
let module = Module::new(&store, &wasm_bytes)?;

// It also works with the text format!
let module = Module::new(&store, "(module (func))")?;

Methods

impl Module[src]

pub fn new(store: &Store, bytes: impl AsRef<[u8]>) -> Result<Module>[src]

Creates a new WebAssembly Module from the given in-memory bytes.

The bytes provided must be in one of two formats:

  • It can be a binary-encoded WebAssembly module. This is always supported.
  • It may also be a text-encoded instance of the WebAssembly text format. This is only supported when the wat feature of this crate is enabled. If this is supplied then the text format will be parsed before validation. Note that the wat feature is enabled by default.

The data for the wasm module must be loaded in-memory if it's present elsewhere, for example on disk. This requires that the entire binary is loaded into memory all at once, this API does not support streaming compilation of a module.

The WebAssembly binary will be decoded and validated. It will also be compiled according to the configuration of the provided store and cached in this type.

The provided store is a global cache for compiled resources as well as configuration for what wasm features are enabled. It's recommended to share a store among modules if possible.

Errors

This function may fail and return an error. Errors may include situations such as:

  • The binary provided could not be decoded because it's not a valid WebAssembly binary
  • The WebAssembly binary may not validate (e.g. contains type errors)
  • Implementation-specific limits were exceeded with a valid binary (for example too many locals)
  • The wasm binary may use features that are not enabled in the configuration of store
  • If the wat feature is enabled and the input is text, then it may be rejected if it fails to parse.

The error returned should contain full information about why module creation failed if one is returned.

Examples

The new function can be invoked with a in-memory array of bytes:

let module = Module::new(&store, &wasm_bytes)?;

Or you can also pass in a string to be parsed as the wasm text format:

let module = Module::new(&store, "(module (func))")?;

pub fn new_with_name(
    store: &Store,
    bytes: impl AsRef<[u8]>,
    name: &str
) -> Result<Module>
[src]

Creates a new WebAssembly Module from the given in-memory binary data. The provided name will be used in traps/backtrace details.

See Module::new for other details.

pub fn from_file(store: &Store, file: impl AsRef<Path>) -> Result<Module>[src]

Creates a new WebAssembly Module from the contents of the given file on disk.

This is a convenience function that will read the file provided and pass the bytes to the Module::new function. For more information see Module::new

Examples

let store = Store::default();
let module = Module::from_file(&store, "./path/to/foo.wasm")?;

The .wat text format is also supported:

let module = Module::from_file(&store, "./path/to/foo.wat")?;

pub fn from_binary(store: &Store, binary: &[u8]) -> Result<Module>[src]

Creates a new WebAssembly Module from the given in-memory binary data.

This is similar to Module::new except that it requires that the binary input is a WebAssembly binary, the text format is not supported by this function. It's generally recommended to use Module::new, but if it's required to not support the text format this function can be used instead.

Examples

let wasm = b"\0asm\x01\0\0\0";
let module = Module::from_binary(&store, wasm)?;

Note that the text format is not accepted by this function:

assert!(Module::from_binary(&store, b"(module)").is_err());

pub unsafe fn from_binary_unchecked(
    store: &Store,
    binary: &[u8]
) -> Result<Module>
[src]

Creates a new WebAssembly Module from the given in-memory binary data, skipping validation and asserting that binary is a valid WebAssembly module.

This function is the same as Module::new except that it skips the call to Module::validate and it does not support the text format of WebAssembly. The WebAssembly binary is not validated for correctness and it is simply assumed as valid.

For more information about creation of a module and the store argument see the documentation of Module::new.

Unsafety

This function is unsafe due to the unchecked assumption that the input binary is valid. If the binary is not actually a valid wasm binary it may cause invalid machine code to get generated, cause panics, etc.

It is only safe to call this method if Module::validate succeeds on the same arguments passed to this function.

Errors

This function may fail for many of the same reasons as Module::new. While this assumes that the binary is valid it still needs to actually be somewhat valid for decoding purposes, and the basics of decoding can still fail.

pub fn validate(store: &Store, binary: &[u8]) -> Result<()>[src]

Validates binary input data as a WebAssembly binary given the configuration in store.

This function will perform a speedy validation of the binary input WebAssembly module (which is in binary form, the text format is not accepted by this function) and return either Ok or Err depending on the results of validation. The store argument indicates configuration for WebAssembly features, for example, which are used to indicate what should be valid and what shouldn't be.

Validation automatically happens as part of Module::new, but is a requirement for Module::from_binary_unchecked to be safe.

Errors

If validation fails for any reason (type check error, usage of a feature that wasn't enabled, etc) then an error with a description of the validation issue will be returned.

pub fn name(&self) -> Option<&str>[src]

Returns identifier/name that this Module has. This name is used in traps/backtrace details.

Note that most LLVM/clang/Rust-produced modules do not have a name associated with them, but other wasm tooling can be used to inject or add a name.

Examples

let module = Module::new(&store, "(module $foo)")?;
assert_eq!(module.name(), Some("foo"));

let module = Module::new(&store, "(module)")?;
assert_eq!(module.name(), None);

let module = Module::new_with_name(&store, "(module)", "bar")?;
assert_eq!(module.name(), Some("bar"));

pub fn imports(&self) -> &[ImportType][src]

Returns the list of imports that this Module has and must be satisfied.

This function returns the list of imports that the wasm module has, but only the types of each import. The type of each import is used to typecheck the Instance::new method's imports argument. The arguments to that function must match up 1-to-1 with the entries in the array returned here.

The imports returned reflect the order of the imports in the wasm module itself, and note that no form of deduplication happens.

Examples

Modules with no imports return an empty list here:

let module = Module::new(&store, "(module)")?;
assert_eq!(module.imports().len(), 0);

and modules with imports will have a non-empty list:

let wat = r#"
    (module
        (import "host" "foo" (func))
    )
"#;
let module = Module::new(&store, wat)?;
assert_eq!(module.imports().len(), 1);
let import = &module.imports()[0];
assert_eq!(import.module(), "host");
assert_eq!(import.name(), "foo");
match import.ty() {
    ExternType::Func(_) => { /* ... */ }
    _ => panic!("unexpected import type!"),
}

pub fn exports(&self) -> &[ExportType][src]

Returns the list of exports that this Module has and will be available after instantiation.

This function will return the type of each item that will be returned from Instance::exports. Each entry in this list corresponds 1-to-1 with that list, and the entries here will indicate the name of the export along with the type of the export.

Examples

Modules might not have any exports:

let module = Module::new(&store, "(module)")?;
assert!(module.exports().is_empty());

When the exports are not empty, you can inspect each export:

let wat = r#"
    (module
        (func (export "foo"))
        (memory (export "memory") 1)
    )
"#;
let module = Module::new(&store, wat)?;
assert_eq!(module.exports().len(), 2);

let foo = &module.exports()[0];
assert_eq!(foo.name(), "foo");
match foo.ty() {
    ExternType::Func(_) => { /* ... */ }
    _ => panic!("unexpected export type!"),
}

let memory = &module.exports()[1];
assert_eq!(memory.name(), "memory");
match memory.ty() {
    ExternType::Memory(_) => { /* ... */ }
    _ => panic!("unexpected export type!"),
}

pub fn store(&self) -> &Store[src]

Returns the Store that this Module was compiled into.

Trait Implementations

impl Clone for Module[src]

Auto Trait Implementations

impl !RefUnwindSafe for Module

impl !Send for Module

impl !Sync for Module

impl Unpin for Module

impl !UnwindSafe for Module

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Same<T> for T

type Output = T

Should always be Self

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.