2019-01-18 17:17:44 +00:00
|
|
|
use crate::types::{FuncSig, GlobalDesc, Memory, MemoryIndex, Table, TableIndex, Type};
|
|
|
|
|
|
|
|
pub type Result<T> = std::result::Result<T, Box<Error>>;
|
|
|
|
pub type CompileResult<T> = std::result::Result<T, Box<CompileError>>;
|
|
|
|
pub type LinkResult<T> = std::result::Result<T, Box<LinkError>>;
|
|
|
|
pub type RuntimeResult<T> = std::result::Result<T, Box<RuntimeError>>;
|
|
|
|
pub type CallResult<T> = std::result::Result<T, Box<CallError>>;
|
|
|
|
|
|
|
|
/// This is returned when the chosen compiler is unable to
|
|
|
|
/// successfully compile the provided webassembly module into
|
|
|
|
/// a `Module`.
|
2019-01-18 18:15:14 +00:00
|
|
|
///
|
|
|
|
/// Comparing two `CompileError`s always evaluates to false.
|
2019-01-18 17:17:44 +00:00
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
pub enum CompileError {
|
|
|
|
ValidationError { msg: String },
|
|
|
|
InternalError { msg: String },
|
|
|
|
}
|
|
|
|
|
2019-01-18 18:15:14 +00:00
|
|
|
impl PartialEq for CompileError {
|
|
|
|
fn eq(&self, _other: &CompileError) -> bool {
|
|
|
|
false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-01-18 17:17:44 +00:00
|
|
|
/// This is returned when the runtime is unable to
|
|
|
|
/// correctly link the module with the provided imports.
|
2019-01-18 18:15:14 +00:00
|
|
|
///
|
|
|
|
/// Comparing two `LinkError`s always evaluates to false.
|
2019-01-18 17:17:44 +00:00
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
pub enum LinkError {
|
|
|
|
IncorrectImportType {
|
|
|
|
namespace: String,
|
|
|
|
name: String,
|
|
|
|
expected: String,
|
|
|
|
found: String,
|
|
|
|
},
|
|
|
|
IncorrectImportSignature {
|
|
|
|
namespace: String,
|
|
|
|
name: String,
|
|
|
|
expected: FuncSig,
|
|
|
|
found: FuncSig,
|
|
|
|
},
|
|
|
|
ImportNotFound {
|
|
|
|
namespace: String,
|
|
|
|
name: String,
|
|
|
|
},
|
|
|
|
IncorrectMemoryDescription {
|
|
|
|
namespace: String,
|
|
|
|
name: String,
|
|
|
|
expected: Memory,
|
|
|
|
found: Memory,
|
|
|
|
},
|
|
|
|
IncorrectTableDescription {
|
|
|
|
namespace: String,
|
|
|
|
name: String,
|
|
|
|
expected: Table,
|
|
|
|
found: Table,
|
|
|
|
},
|
|
|
|
IncorrectGlobalDescription {
|
|
|
|
namespace: String,
|
|
|
|
name: String,
|
|
|
|
expected: GlobalDesc,
|
|
|
|
found: GlobalDesc,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
2019-01-18 18:15:14 +00:00
|
|
|
impl PartialEq for LinkError {
|
|
|
|
fn eq(&self, _other: &LinkError) -> bool {
|
|
|
|
false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-01-18 17:17:44 +00:00
|
|
|
/// This is the error type returned when calling
|
|
|
|
/// a webassembly function.
|
|
|
|
///
|
|
|
|
/// The main way to do this is `Instance.call`.
|
2019-01-18 18:15:14 +00:00
|
|
|
///
|
|
|
|
/// Comparing two `RuntimeError`s always evaluates to false.
|
2019-01-18 17:17:44 +00:00
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
pub enum RuntimeError {
|
|
|
|
OutOfBoundsAccess { memory: MemoryIndex, addr: u32 },
|
|
|
|
IndirectCallSignature { table: TableIndex },
|
|
|
|
IndirectCallToNull { table: TableIndex },
|
|
|
|
Unknown { msg: String },
|
|
|
|
}
|
|
|
|
|
2019-01-18 18:15:14 +00:00
|
|
|
impl PartialEq for RuntimeError {
|
|
|
|
fn eq(&self, _other: &RuntimeError) -> bool {
|
|
|
|
false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-01-18 17:17:44 +00:00
|
|
|
/// This error type is produced by calling a wasm function
|
|
|
|
/// exported from a module.
|
|
|
|
///
|
|
|
|
/// If the module traps in some way while running, this will
|
|
|
|
/// be the `CallError::Runtime(RuntimeError)` variant.
|
2019-01-18 18:15:14 +00:00
|
|
|
///
|
|
|
|
/// Comparing two `CallError`s always evaluates to false.
|
2019-01-18 17:17:44 +00:00
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
pub enum CallError {
|
|
|
|
Signature { expected: FuncSig, found: Vec<Type> },
|
|
|
|
NoSuchExport { name: String },
|
|
|
|
ExportNotFunc { name: String },
|
2019-01-18 18:15:14 +00:00
|
|
|
Runtime(RuntimeError),
|
|
|
|
}
|
|
|
|
|
|
|
|
impl PartialEq for CallError {
|
|
|
|
fn eq(&self, _other: &CallError) -> bool {
|
|
|
|
false
|
|
|
|
}
|
2019-01-18 17:17:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/// The amalgamation of all errors that can occur
|
|
|
|
/// during the compilation, instantiation, or execution
|
|
|
|
/// of a webassembly module.
|
2019-01-18 18:15:14 +00:00
|
|
|
///
|
|
|
|
/// Comparing two `Error`s always evaluates to false.
|
2019-01-18 17:17:44 +00:00
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
pub enum Error {
|
2019-01-18 18:15:14 +00:00
|
|
|
CompileError(CompileError),
|
|
|
|
LinkError(LinkError),
|
|
|
|
RuntimeError(RuntimeError),
|
|
|
|
CallError(CallError),
|
|
|
|
}
|
|
|
|
|
|
|
|
impl PartialEq for Error {
|
|
|
|
fn eq(&self, _other: &Error) -> bool {
|
|
|
|
false
|
|
|
|
}
|
2019-01-18 17:17:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl From<Box<CompileError>> for Box<Error> {
|
|
|
|
fn from(compile_err: Box<CompileError>) -> Self {
|
2019-01-18 18:15:14 +00:00
|
|
|
Box::new(Error::CompileError(*compile_err))
|
2019-01-18 17:17:44 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<Box<LinkError>> for Box<Error> {
|
|
|
|
fn from(link_err: Box<LinkError>) -> Self {
|
2019-01-18 18:15:14 +00:00
|
|
|
Box::new(Error::LinkError(*link_err))
|
2019-01-18 17:17:44 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<Box<RuntimeError>> for Box<Error> {
|
|
|
|
fn from(runtime_err: Box<RuntimeError>) -> Self {
|
2019-01-18 18:15:14 +00:00
|
|
|
Box::new(Error::RuntimeError(*runtime_err))
|
2019-01-18 17:17:44 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<Box<CallError>> for Box<Error> {
|
|
|
|
fn from(call_err: Box<CallError>) -> Self {
|
2019-01-18 18:15:14 +00:00
|
|
|
Box::new(Error::CallError(*call_err))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<Box<RuntimeError>> for Box<CallError> {
|
|
|
|
fn from(runtime_err: Box<RuntimeError>) -> Self {
|
|
|
|
Box::new(CallError::Runtime(*runtime_err))
|
2019-01-18 17:17:44 +00:00
|
|
|
}
|
|
|
|
}
|