# [−] [src] Crate wasmi

# wasmi

This library allows WebAssembly modules to be loaded in binary format and their functions invoked.

# Introduction

WebAssembly (wasm) is a safe, portable and compact format that is designed for efficient execution.

Wasm code is distributed in the form of modules that contains definitions of:

- functions,
- global variables,
- linear memory instances and
- tables.

Each of these definitions can be imported and exported.

In addition to these definitions, modules can define initialization data for their memory or tables. This initialization data can take the form of segments, copied to given offsets. They can also define a `start` function that is automatically executed when the module is loaded.

## Loading and Validation

Before execution, a module must be validated. This process checks that the module is well-formed and makes only allowed operations.

A valid module can't access memory outside its sandbox, can't cause stack underflows and can only call functions with correct signatures.

## Instantiation

In order to execute code from a wasm module, it must be instantiated. Instantiation includes the following steps:

1. Creating an empty module instance.
2. Resolving the definition instances for each declared import in the module.
3. Instantiating definitions declared in the module (e.g. allocate global variables, allocate linear memory, etc.).
4. Initializing memory and table contents by copying segments into them.
5. Executing the `start` function, if any.

After these steps, the module instance is ready to execute functions.

## Execution

It only is allowed to call functions which are exported by the module. Functions can either return a result or trap (e.g. there can't be linking error in the middle of the function execution). This property is ensured by the validation process.

# Examples

    extern crate wasmi;
    extern crate wabt;

    use wasmi::{ModuleInstance, ImportsBuilder, NopExternals, RuntimeValue};

    fn main() {
        // Parse WAT (WebAssembly Text format) into wasm bytecode.
        let wasm_binary: Vec<u8> =
            wabt::wat2wasm(
                r#"
                (module
                    (func (export "test") (result i32)
                        i32.const 1337
                    )
                )
                "#,
            )
            .expect("failed to parse wat");

        // Load wasm binary and prepare it for instantiation.
        let module = wasmi::Module::from_buffer(&wasm_binary)
            .expect("failed to load wasm");

        // Instantiate a module with empty imports and
        // assert that there is no `start` function.
        let instance =
            ModuleInstance::new(
                &module,
                &ImportsBuilder::default()
            )
            .expect("failed to instantiate wasm module")
            .assert_no_start();

        // Finally, invoke the exported function "test" with no parameters
        // and empty external function executor.
        assert_eq!(
            instance.invoke_export(
                "test",
                &[],
                &mut NopExternals,
            ).expect("failed to execute export"),
            Some(RuntimeValue::I32(1337)),
        );
    }

## Modules

memory_units | WebAssembly-specific sizes and units.
nan_preserving_float |

## Structs

FuncInstance | Runtime representation of a function.
FuncInvocation | A resumable invocation handle. This struct is returned by `FuncInstance::invoke_resumable`.
FuncRef | Reference to a function (See `FuncInstance` for details).
GlobalDescriptor | Description of a global variable.
GlobalInstance | Runtime representation of a global variable (or `global` for short).
GlobalRef | Reference to a global variable (See `GlobalInstance` for details).
ImportsBuilder | Convenience builder of `ImportResolver`.
MemoryDescriptor | Description of a linear memory.
MemoryInstance | Runtime representation of a linear memory (or `memory` for short).
MemoryRef | Reference to a memory (See `MemoryInstance` for details).
Module | Deserialized module prepared for instantiation.
ModuleInstance | A module instance is the runtime representation of a module.
ModuleRef | Reference to a `ModuleInstance`.
NopExternals | Implementation of `Externals` that just traps on `invoke_index`.
NotStartedModuleRef | Mostly instantiated `ModuleRef`.
RuntimeArgs | Wrapper around slice of `RuntimeValue` for using it as an argument list conveniently.
Signature | Signature of a function.
StackRecycler | Used to recycle stacks instead of allocating them repeatedly.
TableDescriptor | Description of a table.
TableInstance | Runtime representation of a table.
TableRef | Reference to a table (See `TableInstance` for details).
Trap | Error type which can be thrown by wasm code or by host environment.

## Enums

Error | Internal interpreter error.
ExternVal | An external value is the runtime representation of an entity that can be imported or exported.
ResumableError | A resumable invocation error.
RuntimeValue | Runtime representation of a value.
TrapKind | Error type which can be thrown by wasm code or by host environment.
ValueError | Error for `LittleEndianConvert`
ValueType | Type of a value.

## Constants

DEFAULT_CALL_STACK_LIMIT | Maximum number of levels on the call stack.
DEFAULT_VALUE_STACK_LIMIT | Maximum number of bytes on the value stack.
LINEAR_MEMORY_PAGE_SIZE | Size of a page of linear memory - 64KiB.

## Traits

Externals | Trait that allows to implement host functions.
FromRuntimeValue | Trait for creating value from a `RuntimeValue`.
HostError | Trait that allows the host to return custom error.
ImportResolver | Resolver of a module's dependencies.
LittleEndianConvert | Convert from and to little endian.
ModuleImportResolver | Version of `ImportResolver` specialized for a single module.

# Help

## Keyboard Shortcuts

`?`
  Show this help dialog
`S`
  Focus the search field
`↑`
  Move up in search results
`↓`
  Move down in search results
`↹`
  Switch tab
`⏎`
  Go to active search result
`+`
  Expand all sections
`-`
  Collapse all sections

## Search Tricks

Prefix searches with a type followed by a colon (e.g., `fn:`) to restrict the search to a given type.

Accepted types are: `fn`, `mod`, `struct`, `enum`, `trait`, `type`, `macro`, and `const`.

Search functions by type signature (e.g., `vec -> usize` or `* -> vec`)

Search multiple things at once by splitting your query with comma (e.g., `str,u8` or `String,struct:Vec,test`)