diff --git a/src/lib.rs b/src/lib.rs index 887a812..78f7896 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -106,16 +106,75 @@ use std::fmt; use std::error; use std::collections::HashMap; +/// Error type which can happen at execution time. +/// +/// Under some conditions, wasm execution may produce a `Trap`, which immediately aborts execution. +/// Traps can't be handled by WebAssembly code, but are reported to the embedder. #[derive(Debug)] pub enum Trap { + /// Wasm code executed `unreachable` opcode. + /// + /// `unreachable` is a special opcode which always traps upon execution. + /// This opcode have a similar purpose as `ud2` in x86. Unreachable, + + /// Attempt to load or store at the address which + /// lies outside of bounds of the memory. + /// + /// Since addresses are interpreted as unsigned integers, out of bounds access + /// can't happen with negative addresses (i.e. they will always wrap). MemoryAccessOutOfBounds, + + /// Attempt to access table element at index which + /// lies outside of bounds. + /// + /// This typically can happen when `call_indirect` is executed + /// with index that lies out of bounds. + /// + /// Since indexes are interpreted as unsinged integers, out of bounds access + /// can't happen with negative indexes (i.e. they will always wrap). TableAccessOutOfBounds, + + /// Attempt to access table element which is uninitialized (i.e. `None`). + /// + /// This typically can happen when `call_indirect` is executed. ElemUninitialized, + + /// Attempt to `call_indirect` function with mismatched [signature][`Signature`]. + /// + /// `call_indirect` always specifies the expected signature of function. + /// If `call_indirect` is executed with index that points on function with + /// signature different that is expected by this `call_indirect`, this trap is raised. + /// + /// [`Signature`]: struct.Signature.html ElemSignatureMismatch, + + /// Attempt to divide by zero. + /// + /// This trap typically can happen if `div` or `rem` is executed with + /// zero as divider. DivisionByZero, + + /// Attempt to make a conversion to an int failed. + /// + /// This can happen when: + /// + /// - trying to do signed division (or get the remainder) -2N-1 over -1. This is + /// because the result +2N-1 isn't representable as a N-bit signed integer. + /// - trying to truncate NaNs, infinity, or value for which the result is out of range into an integer. InvalidConversionToInt, + + /// Stack overflow. + /// + /// This is likely caused by some infinite or very deep recursion. + /// Extensive inlining might also be the cause of stack overflow. StackOverflow, + + /// Error specified by the host. + /// + /// Typically returned from an implementation of [`Externals`]. + /// + /// [`Externals`]: trait.Externals.html Host(Box), }