abort on BoxMeUp misuse

This commit is contained in:
Ralf Jung 2019-11-26 09:24:39 +01:00
parent 3a8e1b63cf
commit 3e96ca2bf7
2 changed files with 11 additions and 2 deletions

View File

@ -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);
}

View File

@ -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(),
}
}
}