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")]
|
#[cfg(feature = "nightly")]
|
||||||
fn recover<F, T>(f: F) -> Result<T, Box<Any + Send>> where F: FnOnce() -> T + ::std::panic::RecoverSafe {
|
fn recover<F, T>(f: F) -> Result<T, Box<Any + Send>> where F: FnOnce() -> T {
|
||||||
::std::panic::recover(f)
|
::std::panic::recover(::std::panic::AssertRecoverSafe::new(f))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(not(feature = "nightly"))]
|
#[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())
|
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 {
|
unsafe extern "C" fn bwrite<S: Write>(bio: *mut BIO, buf: *const c_char, len: c_int) -> c_int {
|
||||||
BIO_clear_retry_flags(bio);
|
BIO_clear_retry_flags(bio);
|
||||||
|
|
||||||
let state = state::<S>(bio);
|
let state = state::<S>(bio);
|
||||||
let buf = slice::from_raw_parts(buf as *const _, len as usize);
|
let buf = slice::from_raw_parts(buf as *const _, len as usize);
|
||||||
|
|
||||||
let result = {
|
let result = recover(|| state.stream.write(buf));
|
||||||
let mut youre_not_my_supervisor = AssertRecoverSafe::new(&mut *state);
|
|
||||||
recover(move || youre_not_my_supervisor.stream.write(buf))
|
|
||||||
};
|
|
||||||
|
|
||||||
match result {
|
match result {
|
||||||
Ok(Ok(len)) => len as c_int,
|
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 state = state::<S>(bio);
|
||||||
let buf = slice::from_raw_parts_mut(buf as *mut _, len as usize);
|
let buf = slice::from_raw_parts_mut(buf as *mut _, len as usize);
|
||||||
|
|
||||||
let result = {
|
let result = recover(|| state.stream.read(buf));
|
||||||
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))
|
|
||||||
};
|
|
||||||
|
|
||||||
match result {
|
match result {
|
||||||
Ok(Ok(len)) => len as c_int,
|
Ok(Ok(len)) => len as c_int,
|
||||||
|
|
@ -185,10 +149,7 @@ unsafe extern "C" fn ctrl<S: Write>(bio: *mut BIO,
|
||||||
-> c_long {
|
-> c_long {
|
||||||
if cmd == BIO_CTRL_FLUSH {
|
if cmd == BIO_CTRL_FLUSH {
|
||||||
let state = state::<S>(bio);
|
let state = state::<S>(bio);
|
||||||
let result = {
|
let result = recover(|| state.stream.flush());
|
||||||
let mut youre_not_my_supervisor = AssertRecoverSafe::new(&mut *state);
|
|
||||||
recover(move || youre_not_my_supervisor.stream.flush())
|
|
||||||
};
|
|
||||||
|
|
||||||
match result {
|
match result {
|
||||||
Ok(Ok(())) => 1,
|
Ok(Ok(())) => 1,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue