Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

For RuntimeError and breakpoints, use Box<Any + Send> instead of Box<Any>. #1053

Merged
merged 3 commits into from
Dec 10, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

## **[Unreleased]**

- [#1053](https://github.com/wasmerio/wasmer/pull/1053) For RuntimeError and breakpoints, use Box<Any + Send> instead of Box<Any>.
- [#1052](https://github.com/wasmerio/wasmer/pull/1052) Fix minor panic and improve Error handling in singlepass backend.
- [#1050](https://github.com/wasmerio/wasmer/pull/1050) Attach C & C++ headers to releases.
- [#1033](https://github.com/wasmerio/wasmer/pull/1033) Set cranelift backend as default compiler backend again, require at least one backend to be enabled for Wasmer CLI
Expand Down
8 changes: 4 additions & 4 deletions lib/clif-backend/src/signal/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,12 @@ pub use self::unix::*;
pub use self::windows::*;

thread_local! {
pub static TRAP_EARLY_DATA: Cell<Option<Box<dyn Any>>> = Cell::new(None);
pub static TRAP_EARLY_DATA: Cell<Option<Box<dyn Any + Send>>> = Cell::new(None);
}

pub enum CallProtError {
Trap(WasmTrapInfo),
Error(Box<dyn Any>),
Error(Box<dyn Any + Send>),
}

pub struct Caller {
Expand Down Expand Up @@ -67,7 +67,7 @@ impl RunnableModule for Caller {
args: *const u64,
rets: *mut u64,
trap_info: *mut WasmTrapInfo,
user_error: *mut Option<Box<dyn Any>>,
user_error: *mut Option<Box<dyn Any + Send>>,
invoke_env: Option<NonNull<c_void>>,
) -> bool {
let handler_data = &*invoke_env.unwrap().cast().as_ptr();
Expand Down Expand Up @@ -108,7 +108,7 @@ impl RunnableModule for Caller {
})
}

unsafe fn do_early_trap(&self, data: Box<dyn Any>) -> ! {
unsafe fn do_early_trap(&self, data: Box<dyn Any + Send>) -> ! {
TRAP_EARLY_DATA.with(|cell| cell.set(Some(data)));
trigger_trap()
}
Expand Down
4 changes: 2 additions & 2 deletions lib/llvm-backend/src/backend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ extern "C" {
params: *const u64,
results: *mut u64,
trap_out: *mut WasmTrapInfo,
user_error: *mut Option<Box<dyn Any>>,
user_error: *mut Option<Box<dyn Any + Send>>,
invoke_env: Option<NonNull<c_void>>,
) -> bool;
}
Expand Down Expand Up @@ -427,7 +427,7 @@ impl RunnableModule for LLVMBackend {
self.msm.clone()
}

unsafe fn do_early_trap(&self, data: Box<dyn Any>) -> ! {
unsafe fn do_early_trap(&self, data: Box<dyn Any + Send>) -> ! {
throw_any(Box::leak(data))
}
}
Expand Down
3 changes: 2 additions & 1 deletion lib/llvm-backend/src/code.rs
Original file line number Diff line number Diff line change
Expand Up @@ -856,7 +856,8 @@ pub unsafe extern "C" fn callback_trampoline(
callback: *mut BreakpointHandler,
) {
let callback = Box::from_raw(callback);
let result: Result<(), Box<dyn std::any::Any>> = callback(BreakpointInfo { fault: None });
let result: Result<(), Box<dyn std::any::Any + Send>> =
callback(BreakpointInfo { fault: None });
match result {
Ok(()) => *b = None,
Err(e) => *b = Some(e),
Expand Down
2 changes: 1 addition & 1 deletion lib/runtime-core/src/backend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ pub trait RunnableModule: Send + Sync {
/// signature and an invoke function that can call the trampoline.
fn get_trampoline(&self, info: &ModuleInfo, sig_index: SigIndex) -> Option<Wasm>;

unsafe fn do_early_trap(&self, data: Box<dyn Any>) -> !;
unsafe fn do_early_trap(&self, data: Box<dyn Any + Send>) -> !;

/// Returns the machine code associated with this module.
fn get_code(&self) -> Option<&[u8]> {
Expand Down
2 changes: 1 addition & 1 deletion lib/runtime-core/src/codegen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ use wasmparser::{Operator, Type as WpType};

/// A type that defines a function pointer, which is called when breakpoints occur.
pub type BreakpointHandler =
Box<dyn Fn(BreakpointInfo) -> Result<(), Box<dyn Any>> + Send + Sync + 'static>;
Box<dyn Fn(BreakpointInfo) -> Result<(), Box<dyn Any + Send>> + Send + Sync + 'static>;

/// Maps instruction pointers to their breakpoint handlers.
pub type BreakpointMap = Arc<HashMap<usize, BreakpointHandler>>;
Expand Down
2 changes: 1 addition & 1 deletion lib/runtime-core/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ pub enum RuntimeError {
/// Error.
Error {
/// Error data.
data: Box<dyn Any>,
data: Box<dyn Any + Send>,
},
}

Expand Down
23 changes: 12 additions & 11 deletions lib/runtime-core/src/fault.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ type SetJmpBuffer = [i32; SETJMP_BUFFER_LEN];
struct UnwindInfo {
jmpbuf: SetJmpBuffer, // in
breakpoints: Option<BreakpointMap>,
payload: Option<Box<dyn Any>>, // out
payload: Option<Box<dyn Any + Send>>, // out
}

/// A store for boundary register preservation.
Expand Down Expand Up @@ -182,7 +182,7 @@ pub unsafe fn clear_wasm_interrupt() {
pub unsafe fn catch_unsafe_unwind<R, F: FnOnce() -> R>(
f: F,
breakpoints: Option<BreakpointMap>,
) -> Result<R, Box<dyn Any>> {
) -> Result<R, Box<dyn Any + Send>> {
let unwind = UNWIND.with(|x| x.get());
let old = (*unwind).take();
*unwind = Some(UnwindInfo {
Expand All @@ -205,7 +205,7 @@ pub unsafe fn catch_unsafe_unwind<R, F: FnOnce() -> R>(
}

/// Begins an unsafe unwind.
pub unsafe fn begin_unsafe_unwind(e: Box<dyn Any>) -> ! {
pub unsafe fn begin_unsafe_unwind(e: Box<dyn Any + Send>) -> ! {
let unwind = UNWIND.with(|x| x.get());
let inner = (*unwind)
.as_mut()
Expand Down Expand Up @@ -283,7 +283,7 @@ extern "C" fn signal_trap_handler(
static ARCH: Architecture = Architecture::Aarch64;

let mut should_unwind = false;
let mut unwind_result: Box<dyn Any> = Box::new(());
let mut unwind_result: Box<dyn Any + Send> = Box::new(());

unsafe {
let fault = get_fault_info(siginfo as _, ucontext);
Expand All @@ -307,7 +307,7 @@ extern "C" fn signal_trap_handler(
match ib.ty {
InlineBreakpointType::Trace => {}
InlineBreakpointType::Middleware => {
let out: Option<Result<(), Box<dyn Any>>> =
let out: Option<Result<(), Box<dyn Any + Send>>> =
with_breakpoint_map(|bkpt_map| {
bkpt_map.and_then(|x| x.get(&ip)).map(|x| {
x(BreakpointInfo {
Expand Down Expand Up @@ -348,13 +348,14 @@ extern "C" fn signal_trap_handler(
match Signal::from_c_int(signum) {
Ok(SIGTRAP) => {
// breakpoint
let out: Option<Result<(), Box<dyn Any>>> = with_breakpoint_map(|bkpt_map| {
bkpt_map.and_then(|x| x.get(&(fault.ip.get()))).map(|x| {
x(BreakpointInfo {
fault: Some(&fault),
let out: Option<Result<(), Box<dyn Any + Send>>> =
with_breakpoint_map(|bkpt_map| {
bkpt_map.and_then(|x| x.get(&(fault.ip.get()))).map(|x| {
x(BreakpointInfo {
fault: Some(&fault),
})
})
})
});
});
match out {
Some(Ok(())) => {
return false;
Expand Down
2 changes: 1 addition & 1 deletion lib/runtime-core/src/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -652,7 +652,7 @@ pub mod x64 {
image: InstanceImage,
vmctx: &mut Ctx,
breakpoints: Option<BreakpointMap>,
) -> Result<u64, Box<dyn Any>> {
) -> Result<u64, Box<dyn Any + Send>> {
let mut stack: Vec<u64> = vec![0; 1048576 * 8 / 8]; // 8MB stack
let mut stack_offset: usize = stack.len();

Expand Down
10 changes: 5 additions & 5 deletions lib/runtime-core/src/typed_func.rs
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ pub type Invoke = unsafe extern "C" fn(
args: *const u64,
rets: *mut u64,
trap_info: *mut WasmTrapInfo,
user_error: *mut Option<Box<dyn Any>>,
user_error: *mut Option<Box<dyn Any + Send>>,
extra: Option<NonNull<c_void>>,
) -> bool;

Expand Down Expand Up @@ -201,7 +201,7 @@ where
Rets: WasmTypeList,
{
/// The error type for this trait.
type Error: 'static;
type Error: Send + 'static;
/// Get returns or error result.
fn report(self) -> Result<Rets, Self::Error>;
}
Expand All @@ -219,7 +219,7 @@ where
impl<Rets, E> TrapEarly<Rets> for Result<Rets, E>
where
Rets: WasmTypeList,
E: 'static,
E: Send + 'static,
{
type Error = E;
fn report(self) -> Result<Rets, E> {
Expand Down Expand Up @@ -507,7 +507,7 @@ macro_rules! impl_traits {
Ok(Ok(returns)) => return returns.into_c_struct(),
Ok(Err(err)) => {
let b: Box<_> = err.into();
b as Box<dyn Any>
b as Box<dyn Any + Send>
},
Err(err) => err,
};
Expand Down Expand Up @@ -619,7 +619,7 @@ macro_rules! impl_traits {
Ok(Ok(returns)) => return returns.into_c_struct(),
Ok(Err(err)) => {
let b: Box<_> = err.into();
b as Box<dyn Any>
b as Box<dyn Any + Send>
},
Err(err) => err,
};
Expand Down
2 changes: 1 addition & 1 deletion lib/runtime-core/src/vm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1069,7 +1069,7 @@ mod vm_ctx_tests {
fn get_trampoline(&self, _module: &ModuleInfo, _sig_index: SigIndex) -> Option<Wasm> {
unimplemented!("generate_module::get_trampoline")
}
unsafe fn do_early_trap(&self, _: Box<dyn Any>) -> ! {
unsafe fn do_early_trap(&self, _: Box<dyn Any + Send>) -> ! {
unimplemented!("generate_module::do_early_trap")
}
}
Expand Down
6 changes: 3 additions & 3 deletions lib/singlepass-backend/src/codegen_x64.rs
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ pub struct X64FunctionCode {
breakpoints: Option<
HashMap<
AssemblyOffset,
Box<dyn Fn(BreakpointInfo) -> Result<(), Box<dyn Any>> + Send + Sync + 'static>,
Box<dyn Fn(BreakpointInfo) -> Result<(), Box<dyn Any + Send>> + Send + Sync + 'static>,
>,
>,
returns: SmallVec<[WpType; 1]>,
Expand Down Expand Up @@ -359,7 +359,7 @@ impl RunnableModule for X64ExecutionContext {
args: *const u64,
rets: *mut u64,
trap_info: *mut WasmTrapInfo,
user_error: *mut Option<Box<dyn Any>>,
user_error: *mut Option<Box<dyn Any + Send>>,
num_params_plus_one: Option<NonNull<c_void>>,
) -> bool {
let rm: &Box<dyn RunnableModule> = &(&*(*ctx).module).runnable_module;
Expand Down Expand Up @@ -533,7 +533,7 @@ impl RunnableModule for X64ExecutionContext {
})
}

unsafe fn do_early_trap(&self, data: Box<dyn Any>) -> ! {
unsafe fn do_early_trap(&self, data: Box<dyn Any + Send>) -> ! {
protect_unix::TRAP_EARLY_DATA.with(|x| x.set(Some(data)));
protect_unix::trigger_trap();
}
Expand Down
6 changes: 3 additions & 3 deletions lib/singlepass-backend/src/protect_unix.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ use wasmer_runtime_core::fault::{begin_unsafe_unwind, catch_unsafe_unwind, ensur
use wasmer_runtime_core::typed_func::WasmTrapInfo;

thread_local! {
pub static TRAP_EARLY_DATA: Cell<Option<Box<dyn Any>>> = Cell::new(None);
pub static TRAP_EARLY_DATA: Cell<Option<Box<dyn Any + Send>>> = Cell::new(None);
}

pub unsafe fn trigger_trap() -> ! {
Expand All @@ -25,7 +25,7 @@ pub unsafe fn trigger_trap() -> ! {

pub enum CallProtError {
Trap(WasmTrapInfo),
Error(Box<dyn Any>),
Error(Box<dyn Any + Send>),
}

pub fn call_protected<T>(
Expand All @@ -48,6 +48,6 @@ pub fn call_protected<T>(
}
}

pub unsafe fn throw(payload: Box<dyn Any>) -> ! {
pub unsafe fn throw(payload: Box<dyn Any + Send>) -> ! {
begin_unsafe_unwind(payload);
}