diff options
| author | Alan Mackenzie | 2017-02-12 10:59:03 +0000 |
|---|---|---|
| committer | Alan Mackenzie | 2017-02-12 10:59:03 +0000 |
| commit | f4d5b687150810129b7a1d5b006e31ccf82b691b (patch) | |
| tree | 4229b13800349032697daae3904dc3773e6b7a80 /src/eval.c | |
| parent | d5514332d4a6092673ce1f78fadcae0c57f7be64 (diff) | |
| parent | 148100d98319499f0ac6f57b8be08cbd14884a5c (diff) | |
| download | emacs-comment-cache.tar.gz emacs-comment-cache.zip | |
Merge branch 'master' into comment-cachecomment-cache
Diffstat (limited to 'src/eval.c')
| -rw-r--r-- | src/eval.c | 51 |
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); | |||
| 1453 | static bool maybe_call_debugger (Lisp_Object conditions, Lisp_Object sig, | 1449 | static bool maybe_call_debugger (Lisp_Object conditions, Lisp_Object sig, |
| 1454 | Lisp_Object data); | 1450 | Lisp_Object data); |
| 1455 | 1451 | ||
| 1456 | void | 1452 | static void |
| 1457 | process_quit_flag (void) | 1453 | process_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 | |||
| 1477 | void | ||
| 1478 | maybe_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 | |||
| 1468 | DEFUN ("signal", Fsignal, Ssignal, 2, 2, 0, | 1486 | DEFUN ("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. |
| 1470 | This function does not return. | 1488 | This 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)) |