@@ -115,47 +115,32 @@ impl ObjectRecord {
115115 ..
116116 } = self ;
117117
118- let fdeptr = eh_frame_hdr. table ( ) . unwrap ( ) . lookup ( address, bases) . unwrap ( ) ;
119- let fdeptr = match fdeptr {
120- Pointer :: Direct ( x) => x,
121- _ => unreachable ! ( ) ,
122- } ;
123-
124- let entry = gimli:: parse_cfi_entry ( bases, * sel, & mut EndianBuf :: new ( unsafe { std:: slice:: from_raw_parts ( fdeptr as * const u8 , 0x1000000 ) } , NativeEndian ) ) . unwrap ( ) . unwrap ( ) ;
125- let target_fde = match entry {
126- CieOrFde :: Fde ( fde) => Some ( fde. parse ( |offset| sel. cie_from_offset ( bases, offset) ) ?) ,
127- CieOrFde :: Cie ( _) => unimplemented ! ( ) , // return error here probably
128- } ;
129-
130-
131- if let Some ( fde) = target_fde {
132- trace ! ( "fde {:x} - {:x}" , fde. initial_address( ) , fde. len( ) ) ;
133- assert ! ( fde. contains( address) ) ;
134- let mut result_row = None ;
135- let mut ctx = ctx. initialize ( fde. cie ( ) ) . unwrap ( ) ;
136-
137- {
138- let mut table = UnwindTable :: new ( & mut ctx, & fde) ;
139- while let Some ( row) = table. next_row ( ) ? {
140- if row. contains ( address) {
141- result_row = Some ( row. clone ( ) ) ;
142- break ;
143- }
118+ let fde = eh_frame_hdr. table ( ) . unwrap ( )
119+ . lookup_and_parse ( address, bases, sel. clone ( ) , |offset| sel. cie_from_offset ( bases, offset) ) ?;
120+
121+ let mut result_row = None ;
122+ let mut ctx = ctx. initialize ( fde. cie ( ) ) . unwrap ( ) ;
123+
124+ {
125+ let mut table = UnwindTable :: new ( & mut ctx, & fde) ;
126+ while let Some ( row) = table. next_row ( ) ? {
127+ if row. contains ( address) {
128+ result_row = Some ( row. clone ( ) ) ;
129+ break ;
144130 }
145131 }
146-
147- if let Some ( row) = result_row {
148- return Ok ( UnwindInfo {
149- row,
150- ctx : ctx. reset ( ) ,
151- personality : fde. personality ( ) ,
152- lsda : fde. lsda ( ) ,
153- initial_address : fde. initial_address ( ) ,
154- } ) ;
155- }
156132 }
157133
158- Err ( gimli:: Error :: NoUnwindInfoForAddress )
134+ match result_row {
135+ Some ( row) => Ok ( UnwindInfo {
136+ row,
137+ ctx : ctx. reset ( ) ,
138+ personality : fde. personality ( ) ,
139+ lsda : fde. lsda ( ) ,
140+ initial_address : fde. initial_address ( ) ,
141+ } ) ,
142+ None => Err ( gimli:: Error :: NoUnwindInfoForAddress )
143+ }
159144 }
160145}
161146
0 commit comments