aboutsummaryrefslogtreecommitdiffstats
path: root/src/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/eval.c')
-rw-r--r--src/eval.c51
1 files changed, 34 insertions, 17 deletions
diff --git a/src/eval.c b/src/eval.c
index c05c8d8f8de..22b02b49521 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -856,11 +856,9 @@ usage: (let* VARLIST BODY...) */)
856 856
857 lexenv = Vinternal_interpreter_environment; 857 lexenv = Vinternal_interpreter_environment;
858 858
859 varlist = XCAR (args); 859 for (varlist = XCAR (args); CONSP (varlist); varlist = XCDR (varlist))
860 CHECK_LIST (varlist);
861 while (CONSP (varlist))
862 { 860 {
863 QUIT; 861 maybe_quit ();
864 862
865 elt = XCAR (varlist); 863 elt = XCAR (varlist);
866 if (SYMBOLP (elt)) 864 if (SYMBOLP (elt))
@@ -894,9 +892,8 @@ usage: (let* VARLIST BODY...) */)
894 } 892 }
895 else 893 else
896 specbind (var, val); 894 specbind (var, val);
897
898 varlist = XCDR (varlist);
899 } 895 }
896 CHECK_LIST_END (varlist, XCAR (args));
900 897
901 val = Fprogn (XCDR (args)); 898 val = Fprogn (XCDR (args));
902 return unbind_to (count, val); 899 return unbind_to (count, val);
@@ -928,7 +925,7 @@ usage: (let VARLIST BODY...) */)
928 925
929 for (argnum = 0; CONSP (varlist); varlist = XCDR (varlist)) 926 for (argnum = 0; CONSP (varlist); varlist = XCDR (varlist))
930 { 927 {
931 QUIT; 928 maybe_quit ();
932 elt = XCAR (varlist); 929 elt = XCAR (varlist);
933 if (SYMBOLP (elt)) 930 if (SYMBOLP (elt))
934 temps [argnum++] = Qnil; 931 temps [argnum++] = Qnil;
@@ -981,7 +978,7 @@ usage: (while TEST BODY...) */)
981 body = XCDR (args); 978 body = XCDR (args);
982 while (!NILP (eval_sub (test))) 979 while (!NILP (eval_sub (test)))
983 { 980 {
984 QUIT; 981 maybe_quit ();
985 prog_ignore (body); 982 prog_ignore (body);
986 } 983 }
987 984
@@ -1014,7 +1011,7 @@ definitions to shadow the loaded ones for use in file byte-compilation. */)
1014 until we get a symbol that is not an alias. */ 1011 until we get a symbol that is not an alias. */
1015 while (SYMBOLP (def)) 1012 while (SYMBOLP (def))
1016 { 1013 {
1017 QUIT; 1014 maybe_quit ();
1018 sym = def; 1015 sym = def;
1019 tem = Fassq (sym, environment); 1016 tem = Fassq (sym, environment);
1020 if (NILP (tem)) 1017 if (NILP (tem))
@@ -1134,7 +1131,6 @@ unwind_to_catch (struct handler *catch, Lisp_Object value)
1134 /* Restore certain special C variables. */ 1131 /* Restore certain special C variables. */
1135 set_poll_suppress_count (catch->poll_suppress_count); 1132 set_poll_suppress_count (catch->poll_suppress_count);
1136 unblock_input_to (catch->interrupt_input_blocked); 1133 unblock_input_to (catch->interrupt_input_blocked);
1137 immediate_quit = 0;
1138 1134
1139 do 1135 do
1140 { 1136 {
@@ -1453,7 +1449,7 @@ static Lisp_Object find_handler_clause (Lisp_Object, Lisp_Object);
1453static bool maybe_call_debugger (Lisp_Object conditions, Lisp_Object sig, 1449static bool maybe_call_debugger (Lisp_Object conditions, Lisp_Object sig,
1454 Lisp_Object data); 1450 Lisp_Object data);
1455 1451
1456void 1452static void
1457process_quit_flag (void) 1453process_quit_flag (void)
1458{ 1454{
1459 Lisp_Object flag = Vquit_flag; 1455 Lisp_Object flag = Vquit_flag;
@@ -1465,6 +1461,28 @@ process_quit_flag (void)
1465 quit (); 1461 quit ();
1466} 1462}
1467 1463
1464/* Check quit-flag and quit if it is non-nil. Typing C-g does not
1465 directly cause a quit; it only sets Vquit_flag. So the program
1466 needs to call maybe_quit at times when it is safe to quit. Every
1467 loop that might run for a long time or might not exit ought to call
1468 maybe_quit at least once, at a safe place. Unless that is
1469 impossible, of course. But it is very desirable to avoid creating
1470 loops where maybe_quit is impossible.
1471
1472 If quit-flag is set to `kill-emacs' the SIGINT handler has received
1473 a request to exit Emacs when it is safe to do.
1474
1475 When not quitting, process any pending signals. */
1476
1477void
1478maybe_quit (void)
1479{
1480 if (!NILP (Vquit_flag) && NILP (Vinhibit_quit))
1481 process_quit_flag ();
1482 else if (pending_signals)
1483 process_pending_signals ();
1484}
1485
1468DEFUN ("signal", Fsignal, Ssignal, 2, 2, 0, 1486DEFUN ("signal", Fsignal, Ssignal, 2, 2, 0,
1469 doc: /* Signal an error. Args are ERROR-SYMBOL and associated DATA. 1487 doc: /* Signal an error. Args are ERROR-SYMBOL and associated DATA.
1470This function does not return. 1488This function does not return.
@@ -1508,10 +1526,9 @@ signal_or_quit (Lisp_Object error_symbol, Lisp_Object data, bool keyboard_quit)
1508 Lisp_Object string; 1526 Lisp_Object string;
1509 Lisp_Object real_error_symbol 1527 Lisp_Object real_error_symbol
1510 = (NILP (error_symbol) ? Fcar (data) : error_symbol); 1528 = (NILP (error_symbol) ? Fcar (data) : error_symbol);
1511 register Lisp_Object clause = Qnil; 1529 Lisp_Object clause = Qnil;
1512 struct handler *h; 1530 struct handler *h;
1513 1531
1514 immediate_quit = 0;
1515 if (gc_in_progress || waiting_for_input) 1532 if (gc_in_progress || waiting_for_input)
1516 emacs_abort (); 1533 emacs_abort ();
1517 1534
@@ -2129,7 +2146,7 @@ eval_sub (Lisp_Object form)
2129 if (!CONSP (form)) 2146 if (!CONSP (form))
2130 return form; 2147 return form;
2131 2148
2132 QUIT; 2149 maybe_quit ();
2133 2150
2134 maybe_gc (); 2151 maybe_gc ();
2135 2152
@@ -2715,7 +2732,7 @@ usage: (funcall FUNCTION &rest ARGUMENTS) */)
2715 Lisp_Object val; 2732 Lisp_Object val;
2716 ptrdiff_t count; 2733 ptrdiff_t count;
2717 2734
2718 QUIT; 2735 maybe_quit ();
2719 2736
2720 if (++lisp_eval_depth > max_lisp_eval_depth) 2737 if (++lisp_eval_depth > max_lisp_eval_depth)
2721 { 2738 {
@@ -2960,7 +2977,7 @@ funcall_lambda (Lisp_Object fun, ptrdiff_t nargs,
2960 bool previous_optional_or_rest = false; 2977 bool previous_optional_or_rest = false;
2961 for (; CONSP (syms_left); syms_left = XCDR (syms_left)) 2978 for (; CONSP (syms_left); syms_left = XCDR (syms_left))
2962 { 2979 {
2963 QUIT; 2980 maybe_quit ();
2964 2981
2965 next = XCAR (syms_left); 2982 next = XCAR (syms_left);
2966 if (!SYMBOLP (next)) 2983 if (!SYMBOLP (next))
@@ -3098,7 +3115,7 @@ lambda_arity (Lisp_Object fun)
3098 if (EQ (XCAR (fun), Qclosure)) 3115 if (EQ (XCAR (fun), Qclosure))
3099 { 3116 {
3100 fun = XCDR (fun); /* Drop `closure'. */ 3117 fun = XCDR (fun); /* Drop `closure'. */
3101 CHECK_LIST_CONS (fun, fun); 3118 CHECK_CONS (fun);
3102 } 3119 }
3103 syms_left = XCDR (fun); 3120 syms_left = XCDR (fun);
3104 if (CONSP (syms_left)) 3121 if (CONSP (syms_left))