abort on BoxMeUp misuse
This commit is contained in:
parent
3a8e1b63cf
commit
3e96ca2bf7
|
@ -266,8 +266,16 @@ impl fmt::Display for Location<'_> {
|
|||
#[unstable(feature = "std_internals", issue = "0")]
|
||||
#[doc(hidden)]
|
||||
pub unsafe trait BoxMeUp {
|
||||
/// Take full ownership of the contents.
|
||||
/// The return type is actually `Box<dyn Any + Send>`, but we cannot use `Box` in libcore.
|
||||
///
|
||||
/// After this method got called, only some dummy default value is left in `self`.
|
||||
/// Calling this method twice, or calling `get` after calling this method, is an error.
|
||||
///
|
||||
/// The argument is borrowed because the panic runtime (`__rust_start_panic`) only
|
||||
/// gets a borrowed `dyn BoxMeUp`.
|
||||
fn take_box(&mut self) -> *mut (dyn Any + Send);
|
||||
|
||||
/// Just borrow the contents.
|
||||
fn get(&mut self) -> &(dyn Any + Send);
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@ use crate::sys_common::rwlock::RWLock;
|
|||
use crate::sys_common::{thread_info, util};
|
||||
use crate::sys_common::backtrace::{self, RustBacktrace};
|
||||
use crate::thread;
|
||||
use crate::process;
|
||||
|
||||
#[cfg(not(test))]
|
||||
use crate::io::set_panic;
|
||||
|
@ -414,7 +415,7 @@ pub fn begin_panic<M: Any + Send>(msg: M, file_line_col: &(&'static str, u32, u3
|
|||
fn take_box(&mut self) -> *mut (dyn Any + Send) {
|
||||
let data = match self.inner.take() {
|
||||
Some(a) => Box::new(a) as Box<dyn Any + Send>,
|
||||
None => Box::new(()), // this should never happen: we got called twice
|
||||
None => process::abort(),
|
||||
};
|
||||
Box::into_raw(data)
|
||||
}
|
||||
|
@ -422,7 +423,7 @@ pub fn begin_panic<M: Any + Send>(msg: M, file_line_col: &(&'static str, u32, u3
|
|||
fn get(&mut self) -> &(dyn Any + Send) {
|
||||
match self.inner {
|
||||
Some(ref a) => a,
|
||||
None => &(),
|
||||
None => process::abort(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue