@@ -1219,30 +1219,40 @@ check_due_timer(void)
12191219 {
12201220 int save_timer_busy = timer_busy ;
12211221 int save_vgetc_busy = vgetc_busy ;
1222- int did_emsg_save = did_emsg ;
1223- int called_emsg_save = called_emsg ;
1224- int did_throw_save = did_throw ;
1222+ int save_did_emsg = did_emsg ;
1223+ int save_called_emsg = called_emsg ;
12251224 int save_must_redraw = must_redraw ;
1225+ int save_trylevel = trylevel ;
1226+ int save_did_throw = did_throw ;
1227+ except_T * save_current_exception = current_exception ;
12261228
1229+ /* Create a scope for running the timer callback, ignoring most of
1230+ * the current scope, such as being inside a try/catch. */
12271231 timer_busy = timer_busy > 0 || vgetc_busy > 0 ;
12281232 vgetc_busy = 0 ;
12291233 called_emsg = FALSE;
1234+ did_emsg = FALSE;
1235+ did_uncaught_emsg = FALSE;
12301236 must_redraw = 0 ;
1237+ trylevel = 0 ;
1238+ did_throw = FALSE;
1239+ current_exception = NULL ;
1240+
12311241 timer -> tr_firing = TRUE;
12321242 timer_callback (timer );
12331243 timer -> tr_firing = FALSE;
1244+
12341245 timer_next = timer -> tr_next ;
12351246 did_one = TRUE;
12361247 timer_busy = save_timer_busy ;
12371248 vgetc_busy = save_vgetc_busy ;
1238- if (called_emsg )
1239- {
1249+ if (did_uncaught_emsg )
12401250 ++ timer -> tr_emsg_count ;
1241- if (! did_throw_save && did_throw && current_exception != NULL )
1242- discard_current_exception () ;
1243- }
1244- did_emsg = did_emsg_save ;
1245- called_emsg = called_emsg_save ;
1251+ did_emsg = save_did_emsg ;
1252+ called_emsg = save_called_emsg ;
1253+ trylevel = save_trylevel ;
1254+ did_throw = save_did_throw ;
1255+ current_exception = save_current_exception ;
12461256 if (must_redraw != 0 )
12471257 need_update_screen = TRUE;
12481258 must_redraw = must_redraw > save_must_redraw
0 commit comments