Skip to content

Commit a9cc010

Browse files
committed
Make it possible to instantiate hardcoded Backtrace from test
1 parent 1f1ca87 commit a9cc010

File tree

1 file changed

+28
-3
lines changed

1 file changed

+28
-3
lines changed

src/libstd/backtrace.rs

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@
9292
// a backtrace or actually symbolizing it.
9393

9494
use crate::env;
95+
use crate::ffi::c_void;
9596
use crate::fmt;
9697
use crate::sync::atomic::{AtomicUsize, Ordering::SeqCst};
9798
use crate::sync::Mutex;
@@ -144,10 +145,16 @@ fn _assert_send_sync() {
144145
}
145146

146147
struct BacktraceFrame {
147-
frame: backtrace::Frame,
148+
frame: RawFrame,
148149
symbols: Vec<BacktraceSymbol>,
149150
}
150151

152+
enum RawFrame {
153+
Actual(backtrace::Frame),
154+
#[cfg(test)]
155+
Fake,
156+
}
157+
151158
struct BacktraceSymbol {
152159
name: Option<Vec<u8>>,
153160
filename: Option<BytesOrWide>,
@@ -293,7 +300,10 @@ impl Backtrace {
293300
let mut actual_start = None;
294301
unsafe {
295302
backtrace::trace_unsynchronized(|frame| {
296-
frames.push(BacktraceFrame { frame: frame.clone(), symbols: Vec::new() });
303+
frames.push(BacktraceFrame {
304+
frame: RawFrame::Actual(frame.clone()),
305+
symbols: Vec::new(),
306+
});
297307
if frame.symbol_address() as usize == ip && actual_start.is_none() {
298308
actual_start = Some(frames.len());
299309
}
@@ -393,8 +403,13 @@ impl Capture {
393403
let _lock = lock();
394404
for frame in self.frames.iter_mut() {
395405
let symbols = &mut frame.symbols;
406+
let frame = match &frame.frame {
407+
RawFrame::Actual(frame) => frame,
408+
#[cfg(test)]
409+
RawFrame::Fake => unimplemented!(),
410+
};
396411
unsafe {
397-
backtrace::resolve_frame_unsynchronized(&frame.frame, |symbol| {
412+
backtrace::resolve_frame_unsynchronized(frame, |symbol| {
398413
symbols.push(BacktraceSymbol {
399414
name: symbol.name().map(|m| m.as_bytes().to_vec()),
400415
filename: symbol.filename_raw().map(|b| match b {
@@ -408,3 +423,13 @@ impl Capture {
408423
}
409424
}
410425
}
426+
427+
impl RawFrame {
428+
fn ip(&self) -> *mut c_void {
429+
match self {
430+
RawFrame::Actual(frame) => frame.ip(),
431+
#[cfg(test)]
432+
RawFrame::Fake => 1 as *mut c_void,
433+
}
434+
}
435+
}

0 commit comments

Comments
 (0)