@@ -17,17 +17,34 @@ pub struct Backtrace;
1717#[ derive( Clone ) ]
1818pub struct Backtrace {
1919 skip_count : usize ,
20+ col_offset : usize , // whether this is from `sliced!` which requires an offset
2021 inner : RefCell < backtrace:: Backtrace > ,
2122 resolved : RefCell < Option < Vec < BacktraceElement > > > ,
2223}
2324
25+ #[ cfg( stageleft_runtime) ]
26+ #[ cfg( feature = "build" ) ]
27+ #[ doc( hidden) ]
28+ pub fn __macro_get_backtrace ( col_offset : usize ) -> Backtrace {
29+ let mut out = Backtrace :: get_backtrace ( 1 ) ;
30+ out. col_offset = col_offset;
31+ out
32+ }
33+
34+ #[ cfg( not( feature = "build" ) ) ]
35+ #[ doc( hidden) ]
36+ pub fn __macro_get_backtrace ( _col_offset : usize ) -> Backtrace {
37+ panic ! ( ) ;
38+ }
39+
2440impl Backtrace {
2541 #[ cfg( feature = "build" ) ]
2642 #[ inline( never) ]
2743 pub ( crate ) fn get_backtrace ( skip_count : usize ) -> Backtrace {
2844 let backtrace = backtrace:: Backtrace :: new_unresolved ( ) ;
2945 Backtrace {
3046 skip_count,
47+ col_offset : 0 ,
3148 inner : RefCell :: new ( backtrace) ,
3249 resolved : RefCell :: new ( None ) ,
3350 }
@@ -50,7 +67,7 @@ impl Backtrace {
5067 . get_or_insert_with ( || {
5168 let mut inner_borrow = self . inner . borrow_mut ( ) ;
5269 inner_borrow. resolve ( ) ;
53- inner_borrow
70+ let mut collected : Vec < _ > = inner_borrow
5471 . frames ( )
5572 . iter ( )
5673 . skip_while ( |f| {
@@ -84,7 +101,17 @@ impl Backtrace {
84101 addr : symbol. addr ( ) . map ( |a| a as usize ) ,
85102 }
86103 } )
87- . collect ( )
104+ . collect ( ) ;
105+
106+ if self . col_offset > 0
107+ && let Some ( first) = collected. first_mut ( )
108+ {
109+ first. colno = first
110+ . colno
111+ . map ( |c| c. saturating_sub ( self . col_offset as u32 ) ) ;
112+ }
113+
114+ collected
88115 } )
89116 . clone ( )
90117 }
0 commit comments