use crate::default_output_stream;
struct FakeBacktrace {
internal: FakeInternalBacktrace,
}
struct FakeInternalBacktrace {
backtrace: Option<MaybeResolved>,
}
struct MaybeResolved {
_resolved: std::sync::Mutex<bool>,
backtrace: std::cell::UnsafeCell<backtrace::Backtrace>,
}
pub unsafe fn backdoortrace(_opaque: &failure::Backtrace) -> Option<&backtrace::Backtrace> {
let _ = format!("{}", _opaque); let no_longer_opaque: &FakeBacktrace =
{ &*(_opaque as *const failure::Backtrace as *const FakeBacktrace) }; if let Some(bt) = &no_longer_opaque.internal.backtrace {
let bt = { &*bt.backtrace.get() }; return Some(bt);
}
None
}
#[deprecated(
since = "0.4",
note = "Use `BacktracePrinter::print_failure_trace` instead."
)]
pub unsafe fn print_backtrace(
trace: &failure::Backtrace,
printer: &crate::BacktracePrinter,
) -> crate::IOResult {
printer.print_failure_trace(trace, &mut default_output_stream())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn with_envvar() {
std::env::set_var("RUST_BACKTRACE", "full");
let e = failure::format_err!("arbitrary error :)");
let printer = crate::BacktracePrinter::new();
unsafe {
printer
.print_failure_trace(e.backtrace(), &mut default_output_stream())
.unwrap();
}
}
}