Simplify panic safety logic for new nightly
This commit is contained in:
parent
dfce15be25
commit
a9a18cf337
|
|
@ -74,8 +74,8 @@ unsafe fn state<'a, S: 'a>(bio: *mut BIO) -> &'a mut StreamState<S> {
|
|||
}
|
||||
|
||||
#[cfg(feature = "nightly")]
|
||||
fn recover<F, T>(f: F) -> Result<T, Box<Any + Send>> where F: FnOnce() -> T + ::std::panic::RecoverSafe {
|
||||
::std::panic::recover(f)
|
||||
fn recover<F, T>(f: F) -> Result<T, Box<Any + Send>> where F: FnOnce() -> T {
|
||||
::std::panic::recover(::std::panic::AssertRecoverSafe::new(f))
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "nightly"))]
|
||||
|
|
@ -83,45 +83,13 @@ fn recover<F, T>(f: F) -> Result<T, Box<Any + Send>> where F: FnOnce() -> T {
|
|||
Ok(f())
|
||||
}
|
||||
|
||||
#[cfg(feature = "nightly")]
|
||||
use std::panic::AssertRecoverSafe;
|
||||
|
||||
#[cfg(not(feature = "nightly"))]
|
||||
struct AssertRecoverSafe<T>(T);
|
||||
|
||||
#[cfg(not(feature = "nightly"))]
|
||||
impl<T> AssertRecoverSafe<T> {
|
||||
fn new(t: T) -> Self {
|
||||
AssertRecoverSafe(t)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "nightly"))]
|
||||
impl<T> ::std::ops::Deref for AssertRecoverSafe<T> {
|
||||
type Target = T;
|
||||
|
||||
fn deref(&self) -> &T {
|
||||
&self.0
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "nightly"))]
|
||||
impl<T> ::std::ops::DerefMut for AssertRecoverSafe<T> {
|
||||
fn deref_mut(&mut self) -> &mut T {
|
||||
&mut self.0
|
||||
}
|
||||
}
|
||||
|
||||
unsafe extern "C" fn bwrite<S: Write>(bio: *mut BIO, buf: *const c_char, len: c_int) -> c_int {
|
||||
BIO_clear_retry_flags(bio);
|
||||
|
||||
let state = state::<S>(bio);
|
||||
let buf = slice::from_raw_parts(buf as *const _, len as usize);
|
||||
|
||||
let result = {
|
||||
let mut youre_not_my_supervisor = AssertRecoverSafe::new(&mut *state);
|
||||
recover(move || youre_not_my_supervisor.stream.write(buf))
|
||||
};
|
||||
let result = recover(|| state.stream.write(buf));
|
||||
|
||||
match result {
|
||||
Ok(Ok(len)) => len as c_int,
|
||||
|
|
@ -145,11 +113,7 @@ unsafe extern "C" fn bread<S: Read>(bio: *mut BIO, buf: *mut c_char, len: c_int)
|
|||
let state = state::<S>(bio);
|
||||
let buf = slice::from_raw_parts_mut(buf as *mut _, len as usize);
|
||||
|
||||
let result = {
|
||||
let mut youre_not_my_supervisor = AssertRecoverSafe::new(&mut *state);
|
||||
let mut fuuuu = AssertRecoverSafe::new(buf);
|
||||
recover(move || youre_not_my_supervisor.stream.read(&mut *fuuuu))
|
||||
};
|
||||
let result = recover(|| state.stream.read(buf));
|
||||
|
||||
match result {
|
||||
Ok(Ok(len)) => len as c_int,
|
||||
|
|
@ -185,10 +149,7 @@ unsafe extern "C" fn ctrl<S: Write>(bio: *mut BIO,
|
|||
-> c_long {
|
||||
if cmd == BIO_CTRL_FLUSH {
|
||||
let state = state::<S>(bio);
|
||||
let result = {
|
||||
let mut youre_not_my_supervisor = AssertRecoverSafe::new(&mut *state);
|
||||
recover(move || youre_not_my_supervisor.stream.flush())
|
||||
};
|
||||
let result = recover(|| state.stream.flush());
|
||||
|
||||
match result {
|
||||
Ok(Ok(())) => 1,
|
||||
|
|
|
|||
Loading…
Reference in New Issue