diff options
| author | Paul Eggert | 2017-01-25 20:27:45 -0800 |
|---|---|---|
| committer | Paul Eggert | 2017-01-25 21:25:37 -0800 |
| commit | 1392ec7420ee23238a1588b759c631d87a677483 (patch) | |
| tree | ca89387ce9acf91005465c7359dc4e212375c479 /src/eval.c | |
| parent | 0dfd9a69186e12e53b8aa759c47b9747de92db43 (diff) | |
| download | emacs-1392ec7420ee23238a1588b759c631d87a677483.tar.gz emacs-1392ec7420ee23238a1588b759c631d87a677483.zip | |
A quicker check for quit
On some microbenchmarks this lets Emacs run 60% faster on my
platform (AMD Phenom II X4 910e, Fedora 25 x86-64).
* src/atimer.c: Include keyboard.h, for pending_signals.
* src/editfns.c (Fcompare_buffer_substrings):
* src/fns.c (Fnthcdr, Fmemq, Fmemql, Fassq, Frassq, Fplist_put)
(Fnconc, Fplist_member):
Set and clear immediate_quit before and after loop instead of
executing QUIT each time through the loop. This is OK for loops
that affect only locals.
* src/eval.c (process_quit_flag): Now static.
(maybe_quit): New function, containing QUIT’s old body.
* src/fns.c (rarely_quit): New function.
(Fmember, Fassoc, Frassoc, Fdelete, Fnreverse, Freverse)
(Flax_plist_get, Flax_plist_put, internal_equal, Fnconc):
Use it instead of QUIT, for
speed in tight loops that might modify non-locals.
* src/keyboard.h (pending_signals, process_pending_signals):
These belong to keyboard.c, so move them here ...
* src/lisp.h: ... from here.
(QUIT): Redefine in terms of the new maybe_quit function, which
contains this macro’s old definiens. This works well with branch
prediction on processors with return stack buffers, e.g., x86
other than the original Pentium.
Diffstat (limited to 'src/eval.c')
| -rw-r--r-- | src/eval.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/src/eval.c b/src/eval.c index 01e3db44082..734f01d81ae 100644 --- a/src/eval.c +++ b/src/eval.c | |||
| @@ -1450,7 +1450,7 @@ static Lisp_Object find_handler_clause (Lisp_Object, Lisp_Object); | |||
| 1450 | static bool maybe_call_debugger (Lisp_Object conditions, Lisp_Object sig, | 1450 | static bool maybe_call_debugger (Lisp_Object conditions, Lisp_Object sig, |
| 1451 | Lisp_Object data); | 1451 | Lisp_Object data); |
| 1452 | 1452 | ||
| 1453 | void | 1453 | static void |
| 1454 | process_quit_flag (void) | 1454 | process_quit_flag (void) |
| 1455 | { | 1455 | { |
| 1456 | Lisp_Object flag = Vquit_flag; | 1456 | Lisp_Object flag = Vquit_flag; |
| @@ -1462,6 +1462,15 @@ process_quit_flag (void) | |||
| 1462 | quit (); | 1462 | quit (); |
| 1463 | } | 1463 | } |
| 1464 | 1464 | ||
| 1465 | void | ||
| 1466 | maybe_quit (void) | ||
| 1467 | { | ||
| 1468 | if (!NILP (Vquit_flag) && NILP (Vinhibit_quit)) | ||
| 1469 | process_quit_flag (); | ||
| 1470 | else if (pending_signals) | ||
| 1471 | process_pending_signals (); | ||
| 1472 | } | ||
| 1473 | |||
| 1465 | DEFUN ("signal", Fsignal, Ssignal, 2, 2, 0, | 1474 | DEFUN ("signal", Fsignal, Ssignal, 2, 2, 0, |
| 1466 | doc: /* Signal an error. Args are ERROR-SYMBOL and associated DATA. | 1475 | doc: /* Signal an error. Args are ERROR-SYMBOL and associated DATA. |
| 1467 | This function does not return. | 1476 | This function does not return. |