diff --git a/lib/clif-backend/src/signal/unix.rs b/lib/clif-backend/src/signal/unix.rs index feaf4e2e2..3e57a1588 100644 --- a/lib/clif-backend/src/signal/unix.rs +++ b/lib/clif-backend/src/signal/unix.rs @@ -76,7 +76,7 @@ pub fn call_protected(handler_data: &HandlerData, f: impl FnOnce() -> T) -> R *jmp_buf = prev_jmp_buf; if let Some(data) = super::TRAP_EARLY_DATA.with(|cell| cell.replace(None)) { - Err(RuntimeError::Panic { data }) + Err(RuntimeError::Error { data }) } else { let (faulting_addr, inst_ptr) = CAUGHT_ADDRESSES.with(|cell| cell.get()); diff --git a/lib/emscripten/src/varargs.rs b/lib/emscripten/src/varargs.rs index 3775d102c..a6a1fe46b 100644 --- a/lib/emscripten/src/varargs.rs +++ b/lib/emscripten/src/varargs.rs @@ -1,8 +1,5 @@ use std::mem; -use wasmer_runtime_core::{ - types::{Type, WasmExternType}, - vm::Ctx, -}; +use wasmer_runtime_core::{types::WasmExternType, vm::Ctx}; #[repr(transparent)] #[derive(Copy, Clone)] @@ -19,12 +16,12 @@ impl VarArgs { } unsafe impl WasmExternType for VarArgs { - const TYPE: Type = Type::I32; + type Native = i32; - fn to_bits(self) -> u64 { - self.pointer as u64 + fn to_native(self) -> Self::Native { + self.pointer as _ } - fn from_bits(n: u64) -> Self { + fn from_native(n: Self::Native) -> Self { Self { pointer: n as u32 } } } diff --git a/lib/runtime-core/src/error.rs b/lib/runtime-core/src/error.rs index 090214834..84ea04bc2 100644 --- a/lib/runtime-core/src/error.rs +++ b/lib/runtime-core/src/error.rs @@ -1,4 +1,4 @@ -use crate::types::{FuncSig, GlobalDescriptor, MemoryDescriptor, TableDescriptor, Type, Value}; +use crate::types::{FuncSig, GlobalDescriptor, MemoryDescriptor, TableDescriptor, Type}; use core::borrow::Borrow; use std::any::Any; @@ -121,8 +121,7 @@ impl std::error::Error for LinkError {} /// Comparing two `RuntimeError`s always evaluates to false. pub enum RuntimeError { Trap { msg: Box }, - Exception { data: Box<[Value]> }, - Panic { data: Box }, + Error { data: Box }, } impl PartialEq for RuntimeError { @@ -137,10 +136,7 @@ impl std::fmt::Display for RuntimeError { RuntimeError::Trap { ref msg } => { write!(f, "WebAssembly trap occured during runtime: {}", msg) } - RuntimeError::Exception { ref data } => { - write!(f, "Uncaught WebAssembly exception: {:?}", data) - } - RuntimeError::Panic { data } => { + RuntimeError::Error { data } => { let msg = if let Some(s) = data.downcast_ref::() { s } else if let Some(s) = data.downcast_ref::<&str>() { diff --git a/lib/runtime-core/src/typed_func.rs b/lib/runtime-core/src/typed_func.rs index 5f14a8fa1..ef1b3c077 100644 --- a/lib/runtime-core/src/typed_func.rs +++ b/lib/runtime-core/src/typed_func.rs @@ -7,6 +7,7 @@ use crate::{ }; use std::{ any::Any, + convert::Infallible, ffi::c_void, fmt, marker::PhantomData, @@ -120,14 +121,16 @@ pub trait TrapEarly where Rets: WasmTypeList, { - fn report(self) -> Result>; + type Error: 'static; + fn report(self) -> Result; } impl TrapEarly for Rets where Rets: WasmTypeList, { - fn report(self) -> Result> { + type Error = Infallible; + fn report(self) -> Result { Ok(self) } } @@ -135,10 +138,11 @@ where impl TrapEarly for Result where Rets: WasmTypeList, - E: Into> + 'static, + E: 'static, { - fn report(self) -> Result> { - self.map_err(|err| err.into()) + type Error = E; + fn report(self) -> Result { + self } } @@ -329,11 +333,13 @@ macro_rules! impl_traits { let f: FN = unsafe { mem::transmute_copy(&()) }; let err = match panic::catch_unwind(panic::AssertUnwindSafe(|| { - let res = f( ctx $( ,WasmExternType::from_native($x) )* ).report(); - res + f( ctx $( ,WasmExternType::from_native($x) )* ).report() })) { Ok(Ok(returns)) => return returns.into_c_struct(), - Ok(Err(err)) => err, + Ok(Err(err)) => { + let b: Box<_> = err.into(); + b as Box + }, Err(err) => err, }; diff --git a/lib/wasi/src/lib.rs b/lib/wasi/src/lib.rs index c08428dbe..82de5ad1f 100644 --- a/lib/wasi/src/lib.rs +++ b/lib/wasi/src/lib.rs @@ -17,6 +17,12 @@ pub use self::utils::is_wasi_module; use wasmer_runtime_core::{func, import::ImportObject, imports}; +/// This is returned in the Box RuntimeError::Error variant. +/// Use `downcast` or `downcast_ref` to retrieve the `ExitCode`. +pub struct ExitCode { + pub code: syscalls::types::__wasi_exitcode_t, +} + pub fn generate_import_object( args: Vec>, envs: Vec>, diff --git a/lib/wasi/src/ptr.rs b/lib/wasi/src/ptr.rs index 85a582df0..55a16d40c 100644 --- a/lib/wasi/src/ptr.rs +++ b/lib/wasi/src/ptr.rs @@ -2,7 +2,7 @@ use crate::syscalls::types::{__wasi_errno_t, __WASI_EFAULT}; use std::{cell::Cell, fmt, marker::PhantomData, mem}; use wasmer_runtime_core::{ memory::Memory, - types::{Type, ValueType, WasmExternType}, + types::{ValueType, WasmExternType}, }; pub struct Array; @@ -73,12 +73,12 @@ impl WasmPtr { } unsafe impl WasmExternType for WasmPtr { - const TYPE: Type = Type::I32; + type Native = i32; - fn to_bits(self) -> u64 { - self.offset as u64 + fn to_native(self) -> Self::Native { + self.offset as i32 } - fn from_bits(n: u64) -> Self { + fn from_native(n: Self::Native) -> Self { Self { offset: n as u32, _phantom: PhantomData, diff --git a/lib/wasi/src/syscalls/mod.rs b/lib/wasi/src/syscalls/mod.rs index a436444fb..ba9d66b5d 100644 --- a/lib/wasi/src/syscalls/mod.rs +++ b/lib/wasi/src/syscalls/mod.rs @@ -9,6 +9,7 @@ use self::types::*; use crate::{ ptr::{Array, WasmPtr}, state::{Fd, InodeVal, Kind, WasiFile, WasiState, MAX_SYMLINKS}, + ExitCode, }; use rand::{thread_rng, Rng}; use std::cell::Cell; @@ -1430,9 +1431,9 @@ pub fn poll_oneoff( debug!("wasi::poll_oneoff"); unimplemented!() } -pub fn proc_exit(ctx: &mut Ctx, rval: __wasi_exitcode_t) -> Result<(), &'static str> { +pub fn proc_exit(ctx: &mut Ctx, code: __wasi_exitcode_t) -> Result<(), ExitCode> { debug!("wasi::proc_exit, {}", rval); - Err("Instance exited") + Err(ExitCode { code }) } pub fn proc_raise(ctx: &mut Ctx, sig: __wasi_signal_t) -> __wasi_errno_t { debug!("wasi::proc_raise"); diff --git a/lib/wasi/src/syscalls/types.rs b/lib/wasi/src/syscalls/types.rs index c030df312..c239031a4 100644 --- a/lib/wasi/src/syscalls/types.rs +++ b/lib/wasi/src/syscalls/types.rs @@ -43,84 +43,84 @@ pub struct __wasi_dirent_t { pub d_type: __wasi_filetype_t, } -pub type __wasi_errno_t = u32; -pub const __WASI_ESUCCESS: u32 = 0; -pub const __WASI_E2BIG: u32 = 1; -pub const __WASI_EACCES: u32 = 2; -pub const __WASI_EADDRINUSE: u32 = 3; -pub const __WASI_EADDRNOTAVAIL: u32 = 4; -pub const __WASI_EAFNOSUPPORT: u32 = 5; -pub const __WASI_EAGAIN: u32 = 6; -pub const __WASI_EALREADY: u32 = 7; -pub const __WASI_EBADF: u32 = 8; -pub const __WASI_EBADMSG: u32 = 9; -pub const __WASI_EBUSY: u32 = 10; -pub const __WASI_ECANCELED: u32 = 11; -pub const __WASI_ECHILD: u32 = 12; -pub const __WASI_ECONNABORTED: u32 = 13; -pub const __WASI_ECONNREFUSED: u32 = 14; -pub const __WASI_ECONNRESET: u32 = 15; -pub const __WASI_EDEADLK: u32 = 16; -pub const __WASI_EDESTADDRREQ: u32 = 17; -pub const __WASI_EDOM: u32 = 18; -pub const __WASI_EDQUOT: u32 = 19; -pub const __WASI_EEXIST: u32 = 20; -pub const __WASI_EFAULT: u32 = 21; -pub const __WASI_EFBIG: u32 = 22; -pub const __WASI_EHOSTUNREACH: u32 = 23; -pub const __WASI_EIDRM: u32 = 24; -pub const __WASI_EILSEQ: u32 = 25; -pub const __WASI_EINPROGRESS: u32 = 26; -pub const __WASI_EINTR: u32 = 27; -pub const __WASI_EINVAL: u32 = 28; -pub const __WASI_EIO: u32 = 29; -pub const __WASI_EISCONN: u32 = 30; -pub const __WASI_EISDIR: u32 = 31; -pub const __WASI_ELOOP: u32 = 32; -pub const __WASI_EMFILE: u32 = 33; -pub const __WASI_EMLINK: u32 = 34; -pub const __WASI_EMSGSIZE: u32 = 35; -pub const __WASI_EMULTIHOP: u32 = 36; -pub const __WASI_ENAMETOOLONG: u32 = 37; -pub const __WASI_ENETDOWN: u32 = 38; -pub const __WASI_ENETRESET: u32 = 39; -pub const __WASI_ENETUNREACH: u32 = 40; -pub const __WASI_ENFILE: u32 = 41; -pub const __WASI_ENOBUFS: u32 = 42; -pub const __WASI_ENODEV: u32 = 43; -pub const __WASI_ENOENT: u32 = 44; -pub const __WASI_ENOEXEC: u32 = 45; -pub const __WASI_ENOLCK: u32 = 46; -pub const __WASI_ENOLINK: u32 = 47; -pub const __WASI_ENOMEM: u32 = 48; -pub const __WASI_ENOMSG: u32 = 49; -pub const __WASI_ENOPROTOOPT: u32 = 50; -pub const __WASI_ENOSPC: u32 = 51; -pub const __WASI_ENOSYS: u32 = 52; -pub const __WASI_ENOTCONN: u32 = 53; -pub const __WASI_ENOTDIR: u32 = 54; -pub const __WASI_ENOTEMPTY: u32 = 55; -pub const __WASI_ENOTRECOVERABLE: u32 = 56; -pub const __WASI_ENOTSOCK: u32 = 57; -pub const __WASI_ENOTSUP: u32 = 58; -pub const __WASI_ENOTTY: u32 = 59; -pub const __WASI_ENXIO: u32 = 60; -pub const __WASI_EOVERFLOW: u32 = 61; -pub const __WASI_EOWNERDEAD: u32 = 62; -pub const __WASI_EPERM: u32 = 63; -pub const __WASI_EPIPE: u32 = 64; -pub const __WASI_EPROTO: u32 = 65; -pub const __WASI_EPROTONOSUPPORT: u32 = 66; -pub const __WASI_EPROTOTYPE: u32 = 67; -pub const __WASI_ERANGE: u32 = 68; -pub const __WASI_EROFS: u32 = 69; -pub const __WASI_ESPIPE: u32 = 70; -pub const __WASI_ESRCH: u32 = 71; -pub const __WASI_ESTALE: u32 = 72; -pub const __WASI_ETIMEDOUT: u32 = 73; -pub const __WASI_ETXTBSY: u32 = 74; -pub const __WASI_EXDEV: u32 = 75; -pub const __WASI_ENOTCAPABLE: u32 = 76; +pub type __wasi_errno_t = u16; +pub const __WASI_ESUCCESS: u16 = 0; +pub const __WASI_E2BIG: u16 = 1; +pub const __WASI_EACCES: u16 = 2; +pub const __WASI_EADDRINUSE: u16 = 3; +pub const __WASI_EADDRNOTAVAIL: u16 = 4; +pub const __WASI_EAFNOSUPPORT: u16 = 5; +pub const __WASI_EAGAIN: u16 = 6; +pub const __WASI_EALREADY: u16 = 7; +pub const __WASI_EBADF: u16 = 8; +pub const __WASI_EBADMSG: u16 = 9; +pub const __WASI_EBUSY: u16 = 10; +pub const __WASI_ECANCELED: u16 = 11; +pub const __WASI_ECHILD: u16 = 12; +pub const __WASI_ECONNABORTED: u16 = 13; +pub const __WASI_ECONNREFUSED: u16 = 14; +pub const __WASI_ECONNRESET: u16 = 15; +pub const __WASI_EDEADLK: u16 = 16; +pub const __WASI_EDESTADDRREQ: u16 = 17; +pub const __WASI_EDOM: u16 = 18; +pub const __WASI_EDQUOT: u16 = 19; +pub const __WASI_EEXIST: u16 = 20; +pub const __WASI_EFAULT: u16 = 21; +pub const __WASI_EFBIG: u16 = 22; +pub const __WASI_EHOSTUNREACH: u16 = 23; +pub const __WASI_EIDRM: u16 = 24; +pub const __WASI_EILSEQ: u16 = 25; +pub const __WASI_EINPROGRESS: u16 = 26; +pub const __WASI_EINTR: u16 = 27; +pub const __WASI_EINVAL: u16 = 28; +pub const __WASI_EIO: u16 = 29; +pub const __WASI_EISCONN: u16 = 30; +pub const __WASI_EISDIR: u16 = 31; +pub const __WASI_ELOOP: u16 = 32; +pub const __WASI_EMFILE: u16 = 33; +pub const __WASI_EMLINK: u16 = 34; +pub const __WASI_EMSGSIZE: u16 = 35; +pub const __WASI_EMULTIHOP: u16 = 36; +pub const __WASI_ENAMETOOLONG: u16 = 37; +pub const __WASI_ENETDOWN: u16 = 38; +pub const __WASI_ENETRESET: u16 = 39; +pub const __WASI_ENETUNREACH: u16 = 40; +pub const __WASI_ENFILE: u16 = 41; +pub const __WASI_ENOBUFS: u16 = 42; +pub const __WASI_ENODEV: u16 = 43; +pub const __WASI_ENOENT: u16 = 44; +pub const __WASI_ENOEXEC: u16 = 45; +pub const __WASI_ENOLCK: u16 = 46; +pub const __WASI_ENOLINK: u16 = 47; +pub const __WASI_ENOMEM: u16 = 48; +pub const __WASI_ENOMSG: u16 = 49; +pub const __WASI_ENOPROTOOPT: u16 = 50; +pub const __WASI_ENOSPC: u16 = 51; +pub const __WASI_ENOSYS: u16 = 52; +pub const __WASI_ENOTCONN: u16 = 53; +pub const __WASI_ENOTDIR: u16 = 54; +pub const __WASI_ENOTEMPTY: u16 = 55; +pub const __WASI_ENOTRECOVERABLE: u16 = 56; +pub const __WASI_ENOTSOCK: u16 = 57; +pub const __WASI_ENOTSUP: u16 = 58; +pub const __WASI_ENOTTY: u16 = 59; +pub const __WASI_ENXIO: u16 = 60; +pub const __WASI_EOVERFLOW: u16 = 61; +pub const __WASI_EOWNERDEAD: u16 = 62; +pub const __WASI_EPERM: u16 = 63; +pub const __WASI_EPIPE: u16 = 64; +pub const __WASI_EPROTO: u16 = 65; +pub const __WASI_EPROTONOSUPPORT: u16 = 66; +pub const __WASI_EPROTOTYPE: u16 = 67; +pub const __WASI_ERANGE: u16 = 68; +pub const __WASI_EROFS: u16 = 69; +pub const __WASI_ESPIPE: u16 = 70; +pub const __WASI_ESRCH: u16 = 71; +pub const __WASI_ESTALE: u16 = 72; +pub const __WASI_ETIMEDOUT: u16 = 73; +pub const __WASI_ETXTBSY: u16 = 74; +pub const __WASI_EXDEV: u16 = 75; +pub const __WASI_ENOTCAPABLE: u16 = 76; #[derive(Debug, Copy, Clone, PartialEq, Eq)] #[repr(C)]