diff options
| author | Paul Eggert | 2016-12-27 10:32:44 -0800 |
|---|---|---|
| committer | Paul Eggert | 2016-12-27 10:38:15 -0800 |
| commit | a02ca7a231c3856efd57a502c6a73e6c251091e8 (patch) | |
| tree | aa5766c2c9f677ab0bfb81bcc3b920fabdc5305c /src/eval.c | |
| parent | e6161f648903d821865b9610b3b6aa0f82a5dcb7 (diff) | |
| download | emacs-a02ca7a231c3856efd57a502c6a73e6c251091e8.tar.gz emacs-a02ca7a231c3856efd57a502c6a73e6c251091e8.zip | |
Simplify prog1 implementation
Inspired by a suggestion from Chris Gregory in:
http://lists.gnu.org/archive/html/emacs-devel/2016-12/msg00965.html
On my platform, this generates exactly the same machine insns.
* src/eval.c (prog_ignore): Rename from unwind_body, since
it’s more general than that. All callers changed.
(Fprog1): Simplify by using prog_ignore.
(Fwhile): Clarify by using prog_ignore.
Diffstat (limited to 'src/eval.c')
| -rw-r--r-- | src/eval.c | 21 |
1 files changed, 6 insertions, 15 deletions
diff --git a/src/eval.c b/src/eval.c index ddcccc285d3..e50e26a11d2 100644 --- a/src/eval.c +++ b/src/eval.c | |||
| @@ -453,11 +453,10 @@ usage: (progn BODY...) */) | |||
| 453 | return val; | 453 | return val; |
| 454 | } | 454 | } |
| 455 | 455 | ||
| 456 | /* Evaluate BODY sequentially, discarding its value. Suitable for | 456 | /* Evaluate BODY sequentially, discarding its value. */ |
| 457 | record_unwind_protect. */ | ||
| 458 | 457 | ||
| 459 | void | 458 | void |
| 460 | unwind_body (Lisp_Object body) | 459 | prog_ignore (Lisp_Object body) |
| 461 | { | 460 | { |
| 462 | Fprogn (body); | 461 | Fprogn (body); |
| 463 | } | 462 | } |
| @@ -469,16 +468,8 @@ whose values are discarded. | |||
| 469 | usage: (prog1 FIRST BODY...) */) | 468 | usage: (prog1 FIRST BODY...) */) |
| 470 | (Lisp_Object args) | 469 | (Lisp_Object args) |
| 471 | { | 470 | { |
| 472 | Lisp_Object val; | 471 | Lisp_Object val = eval_sub (XCAR (args)); |
| 473 | Lisp_Object args_left; | 472 | prog_ignore (XCDR (args)); |
| 474 | |||
| 475 | args_left = args; | ||
| 476 | val = args; | ||
| 477 | |||
| 478 | val = eval_sub (XCAR (args_left)); | ||
| 479 | while (CONSP (args_left = XCDR (args_left))) | ||
| 480 | eval_sub (XCAR (args_left)); | ||
| 481 | |||
| 482 | return val; | 473 | return val; |
| 483 | } | 474 | } |
| 484 | 475 | ||
| @@ -988,7 +979,7 @@ usage: (while TEST BODY...) */) | |||
| 988 | while (!NILP (eval_sub (test))) | 979 | while (!NILP (eval_sub (test))) |
| 989 | { | 980 | { |
| 990 | QUIT; | 981 | QUIT; |
| 991 | Fprogn (body); | 982 | prog_ignore (body); |
| 992 | } | 983 | } |
| 993 | 984 | ||
| 994 | return Qnil; | 985 | return Qnil; |
| @@ -1191,7 +1182,7 @@ usage: (unwind-protect BODYFORM UNWINDFORMS...) */) | |||
| 1191 | Lisp_Object val; | 1182 | Lisp_Object val; |
| 1192 | ptrdiff_t count = SPECPDL_INDEX (); | 1183 | ptrdiff_t count = SPECPDL_INDEX (); |
| 1193 | 1184 | ||
| 1194 | record_unwind_protect (unwind_body, XCDR (args)); | 1185 | record_unwind_protect (prog_ignore, XCDR (args)); |
| 1195 | val = eval_sub (XCAR (args)); | 1186 | val = eval_sub (XCAR (args)); |
| 1196 | return unbind_to (count, val); | 1187 | return unbind_to (count, val); |
| 1197 | } | 1188 | } |