# HG changeset patch # User Richard M. Stallman # Date 1040493900 0 # Node ID ac6f6d4b84ece321f15bffb0eff27bef33346fa0 # Parent d5680dc3113e64b1447ef28aff3d5c7bc6439ce0 Errors and throws work right with interrupt blocking. (struct catchtag): New elt interrupt_input_blocked. (unwind_to_catch): Restore interrupt_input_blocked from saved value. (internal_catch, Fcondition_case, internal_condition_case) (internal_condition_case_1, internal_condition_case_2): Save it. (Fsignal): Don't do TOTALLY_UNBLOCK_INPUT. diff -r d5680dc3113e -r ac6f6d4b84ec src/eval.c --- a/src/eval.c Sat Dec 21 18:00:23 2002 +0000 +++ b/src/eval.c Sat Dec 21 18:05:00 2002 +0000 @@ -77,6 +77,7 @@ int lisp_eval_depth; int pdlcount; int poll_suppress_count; + int interrupt_input_blocked; struct byte_stack *byte_stack; }; @@ -1103,6 +1104,7 @@ c.lisp_eval_depth = lisp_eval_depth; c.pdlcount = SPECPDL_INDEX (); c.poll_suppress_count = poll_suppress_count; + c.interrupt_input_blocked = interrupt_input_blocked; c.gcpro = gcprolist; c.byte_stack = byte_stack_list; catchlist = &c; @@ -1144,6 +1146,7 @@ /* Restore the polling-suppression count. */ set_poll_suppress_count (catch->poll_suppress_count); + interrupt_input_blocked = catch->interrupt_input_blocked; do { @@ -1270,6 +1273,7 @@ c.lisp_eval_depth = lisp_eval_depth; c.pdlcount = SPECPDL_INDEX (); c.poll_suppress_count = poll_suppress_count; + c.interrupt_input_blocked = interrupt_input_blocked; c.gcpro = gcprolist; c.byte_stack = byte_stack_list; if (_setjmp (c.jmp)) @@ -1319,12 +1323,8 @@ struct catchtag c; struct handler h; -#if 0 /* Can't do this check anymore because realize_basic_faces has - to BLOCK_INPUT, and can call Lisp. What's really needed is a - flag indicating that we're currently handling a signal. */ - /* Since Fsignal resets this to 0, it had better be 0 now - or else we have a potential bug. */ - if (interrupt_input_blocked != 0) +#if 0 /* We now handle interrupt_input_blocked properly. + What we still do not handle is exiting a signal handler. */ abort (); #endif @@ -1335,6 +1335,7 @@ c.lisp_eval_depth = lisp_eval_depth; c.pdlcount = SPECPDL_INDEX (); c.poll_suppress_count = poll_suppress_count; + c.interrupt_input_blocked = interrupt_input_blocked; c.gcpro = gcprolist; c.byte_stack = byte_stack_list; if (_setjmp (c.jmp)) @@ -1355,7 +1356,7 @@ return val; } -/* Like internal_condition_case but call HFUN with ARG as its argument. */ +/* Like internal_condition_case but call BFUN with ARG as its argument. */ Lisp_Object internal_condition_case_1 (bfun, arg, handlers, hfun) @@ -1375,6 +1376,7 @@ c.lisp_eval_depth = lisp_eval_depth; c.pdlcount = SPECPDL_INDEX (); c.poll_suppress_count = poll_suppress_count; + c.interrupt_input_blocked = interrupt_input_blocked; c.gcpro = gcprolist; c.byte_stack = byte_stack_list; if (_setjmp (c.jmp)) @@ -1396,7 +1398,7 @@ } -/* Like internal_condition_case but call HFUN with NARGS as first, +/* Like internal_condition_case but call BFUN with NARGS as first, and ARGS as second argument. */ Lisp_Object @@ -1418,6 +1420,7 @@ c.lisp_eval_depth = lisp_eval_depth; c.pdlcount = SPECPDL_INDEX (); c.poll_suppress_count = poll_suppress_count; + c.interrupt_input_blocked = interrupt_input_blocked; c.gcpro = gcprolist; c.byte_stack = byte_stack_list; if (_setjmp (c.jmp)) @@ -1474,8 +1477,6 @@ if (gc_in_progress || waiting_for_input) abort (); - TOTALLY_UNBLOCK_INPUT; - if (NILP (error_symbol)) real_error_symbol = Fcar (data); else