@@ -157,7 +157,7 @@ fn lang_start_internal(
157
157
argc : isize ,
158
158
argv : * const * const u8 ,
159
159
sigpipe : u8 ,
160
- ) -> Result < isize , ! > {
160
+ ) -> isize {
161
161
// Guard against the code called by this function from unwinding outside of the Rust-controlled
162
162
// code, which is UB. This is a requirement imposed by a combination of how the
163
163
// `#[lang="start"]` attribute is implemented as well as by the implementation of the panicking
@@ -174,18 +174,24 @@ fn lang_start_internal(
174
174
panic:: catch_unwind ( move || {
175
175
// SAFETY: Only called once during runtime initialization.
176
176
unsafe { init ( argc, argv, sigpipe) } ;
177
- let ret_code =
178
- panic:: catch_unwind ( move || panic:: catch_unwind ( main) . unwrap_or ( 101 ) as isize ) . map_err (
179
- move |e| {
180
- // Print a specific error when we abort due to a panicing payload destructor.
181
- mem:: forget ( e) ;
182
- rtabort ! ( "drop of the panic payload panicked" ) ;
183
- } ,
184
- ) ;
177
+
178
+ let ret_code = panic:: catch_unwind ( main) . unwrap_or_else ( move |payload| {
179
+ // Carefully dispose of the panic payload.
180
+ let payload = panic:: AssertUnwindSafe ( payload) ;
181
+ panic:: catch_unwind ( move || drop ( { payload } . 0 ) ) . unwrap_or_else ( move |e| {
182
+ mem:: forget ( e) ; // do *not* drop the 2nd payload
183
+ rtabort ! ( "drop of the panic payload panicked" ) ;
184
+ } ) ;
185
+ // Return error code for panicking programs.
186
+ 101
187
+ } ) ;
188
+ let ret_code = ret_code as isize ;
189
+
185
190
cleanup ( ) ;
186
191
// Guard against multiple threads calling `libc::exit` concurrently.
187
192
// See the documentation for `unique_thread_exit` for more information.
188
193
crate :: sys:: exit_guard:: unique_thread_exit ( ) ;
194
+
189
195
ret_code
190
196
} )
191
197
. unwrap_or_else ( handle_rt_panic)
@@ -199,11 +205,10 @@ fn lang_start<T: crate::process::Termination + 'static>(
199
205
argv : * const * const u8 ,
200
206
sigpipe : u8 ,
201
207
) -> isize {
202
- let Ok ( v ) = lang_start_internal (
208
+ lang_start_internal (
203
209
& move || crate :: sys:: backtrace:: __rust_begin_short_backtrace ( main) . report ( ) . to_i32 ( ) ,
204
210
argc,
205
211
argv,
206
212
sigpipe,
207
- ) ;
208
- v
213
+ )
209
214
}
0 commit comments