9292// a backtrace or actually symbolizing it.
9393
9494use crate :: env;
95+ use crate :: ffi:: c_void;
9596use crate :: fmt;
9697use crate :: sync:: atomic:: { AtomicUsize , Ordering :: SeqCst } ;
9798use crate :: sync:: Mutex ;
@@ -144,10 +145,16 @@ fn _assert_send_sync() {
144145}
145146
146147struct 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+
151158struct 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