]> git.eshelyaron.com Git - emacs.git/commitdiff
Simplify prog1 implementation
authorPaul Eggert <eggert@cs.ucla.edu>
Tue, 27 Dec 2016 18:32:44 +0000 (10:32 -0800)
committerPaul Eggert <eggert@cs.ucla.edu>
Tue, 27 Dec 2016 18:38:15 +0000 (10:38 -0800)
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.

src/bytecode.c
src/eval.c
src/lisp.h

index d484dbb25c67ff3e373ea6e84ddd7b8207fc0fbd..3bb96c2ed2d3091355d1d936fb378310c4f44973 100644 (file)
@@ -809,7 +809,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
          {
            Lisp_Object handler = POP;
            /* Support for a function here is new in 24.4.  */
-           record_unwind_protect (FUNCTIONP (handler) ? bcall0 : unwind_body,
+           record_unwind_protect (FUNCTIONP (handler) ? bcall0 : prog_ignore,
                                   handler);
            NEXT;
          }
index ddcccc285d36593430065cbf12d5d8a0ce0024ca..e50e26a11d2ab61a5a23cc48fc952f06881ff958 100644 (file)
@@ -453,11 +453,10 @@ usage: (progn BODY...)  */)
   return val;
 }
 
-/* Evaluate BODY sequentially, discarding its value.  Suitable for
-   record_unwind_protect.  */
+/* Evaluate BODY sequentially, discarding its value.  */
 
 void
-unwind_body (Lisp_Object body)
+prog_ignore (Lisp_Object body)
 {
   Fprogn (body);
 }
@@ -469,16 +468,8 @@ whose values are discarded.
 usage: (prog1 FIRST BODY...)  */)
   (Lisp_Object args)
 {
-  Lisp_Object val;
-  Lisp_Object args_left;
-
-  args_left = args;
-  val = args;
-
-  val = eval_sub (XCAR (args_left));
-  while (CONSP (args_left = XCDR (args_left)))
-    eval_sub (XCAR (args_left));
-
+  Lisp_Object val = eval_sub (XCAR (args));
+  prog_ignore (XCDR (args));
   return val;
 }
 
@@ -988,7 +979,7 @@ usage: (while TEST BODY...)  */)
   while (!NILP (eval_sub (test)))
     {
       QUIT;
-      Fprogn (body);
+      prog_ignore (body);
     }
 
   return Qnil;
@@ -1191,7 +1182,7 @@ usage: (unwind-protect BODYFORM UNWINDFORMS...)  */)
   Lisp_Object val;
   ptrdiff_t count = SPECPDL_INDEX ();
 
-  record_unwind_protect (unwind_body, XCDR (args));
+  record_unwind_protect (prog_ignore, XCDR (args));
   val = eval_sub (XCAR (args));
   return unbind_to (count, val);
 }
index dc2c7a60085f6ebeea4b1ebc2fc4509ac421391b..1a586cab0d050dfd5c95a298cfdfc1504b35a58d 100644 (file)
@@ -3867,7 +3867,7 @@ extern Lisp_Object safe_call1 (Lisp_Object, Lisp_Object);
 extern Lisp_Object safe_call2 (Lisp_Object, Lisp_Object, Lisp_Object);
 extern void init_eval (void);
 extern void syms_of_eval (void);
-extern void unwind_body (Lisp_Object);
+extern void prog_ignore (Lisp_Object);
 extern ptrdiff_t record_in_backtrace (Lisp_Object, Lisp_Object *, ptrdiff_t);
 extern void mark_specpdl (union specbinding *first, union specbinding *ptr);
 extern void get_backtrace (Lisp_Object array);