@@ -156,17 +156,27 @@ unsafe fn unwind_tracer(mut frames: &mut ::StackFrames, exception: *mut _Unwind_
156
156
pub unsafe extern "C" fn _Unwind_Backtrace ( trace : _Unwind_Trace_Fn ,
157
157
trace_argument : * mut c_void )
158
158
-> _Unwind_Reason_Code {
159
+ let mut reterr = _Unwind_Reason_Code:: _URC_END_OF_STACK;
159
160
DwarfUnwinder :: default ( ) . trace ( |mut frames| {
160
- while let Some ( frame) = frames. next ( ) . unwrap ( ) {
161
- let mut ctx = _Unwind_Context {
162
- lsda : frame. lsda . unwrap_or ( 0 ) ,
163
- ip : frames. registers ( ) [ DwarfRegister :: IP ] . unwrap ( ) ,
164
- initial_address : frame. initial_address ,
165
- registers : frames. registers ( ) ,
166
- } ;
167
-
168
- trace ( & mut ctx, trace_argument) ;
161
+ loop {
162
+ match frames. next ( ) {
163
+ Ok ( Some ( frame) ) => {
164
+ let mut ctx = _Unwind_Context {
165
+ lsda : frame. lsda . unwrap_or ( 0 ) ,
166
+ ip : frames. registers ( ) [ DwarfRegister :: IP ] . unwrap ( ) ,
167
+ initial_address : frame. initial_address ,
168
+ registers : frames. registers ( ) ,
169
+ } ;
170
+
171
+ trace ( & mut ctx, trace_argument) ;
172
+ } ,
173
+ Ok ( None ) => break ,
174
+ Err ( err) => {
175
+ reterr = _Unwind_Reason_Code:: _URC_FATAL_PHASE1_ERROR;
176
+ break ;
177
+ }
178
+ }
169
179
}
170
180
} ) ;
171
- _Unwind_Reason_Code :: _URC_END_OF_STACK
181
+ reterr
172
182
}
0 commit comments