wasmer/lib/win-exception-handler/src/exception_handling.rs

55 lines
1.2 KiB
Rust
Raw Normal View History

use std::ffi::c_void;
2019-04-09 23:50:33 +00:00
use std::ptr::NonNull;
use wasmer_runtime_core::vm::{Ctx, Func};
2019-04-09 23:50:33 +00:00
type Trampoline = unsafe extern "C" fn(*mut Ctx, NonNull<Func>, *const u64, *mut u64) -> c_void;
type CallProtectedResult = Result<(), CallProtectedData>;
#[repr(C)]
pub struct CallProtectedData {
pub code: u64,
2019-03-15 21:10:17 +00:00
pub exception_address: u64,
pub instruction_pointer: u64,
}
extern "C" {
#[link_name = "callProtected"]
pub fn __call_protected(
trampoline: Trampoline,
ctx: *mut Ctx,
2019-04-09 23:50:33 +00:00
func: NonNull<Func>,
param_vec: *const u64,
return_vec: *mut u64,
out_result: *mut CallProtectedData,
) -> u8;
}
pub fn _call_protected(
trampoline: Trampoline,
ctx: *mut Ctx,
2019-04-09 23:50:33 +00:00
func: NonNull<Func>,
param_vec: *const u64,
return_vec: *mut u64,
) -> CallProtectedResult {
let mut out_result = CallProtectedData {
code: 0,
2019-03-15 21:10:17 +00:00
exception_address: 0,
instruction_pointer: 0,
};
let result = unsafe {
__call_protected(
trampoline,
ctx,
func,
param_vec,
return_vec,
&mut out_result,
)
};
if result == 1 {
Ok(())
} else {
Err(out_result)
}
}