# HG changeset patch # User Richard M. Stallman # Date 1121536927 0 # Node ID 3b6714810ffc5814ce53ef6b30616a9f2bd60359 # Parent 54d5227ff298fad9a27ac0b7972a55b3301d1df5 (byte-compile-and-recursion): New function. (byte-compile-and): Use byte-compile-and-recursion. diff -r 54d5227ff298 -r 3b6714810ffc lisp/emacs-lisp/bytecomp.el --- a/lisp/emacs-lisp/bytecomp.el Sat Jul 16 17:42:49 2005 +0000 +++ b/lisp/emacs-lisp/bytecomp.el Sat Jul 16 18:02:07 2005 +0000 @@ -3448,12 +3448,19 @@ (args (cdr form))) (if (null args) (byte-compile-form-do-effect t) - (while (cdr args) - (byte-compile-form (car args)) + (byte-compile-and-recursion args failtag)))) + +;; Handle compilation of a multi-argument `and' call. +;; We use tail recursion so we can use byte-compile-maybe-guarded. +(defun byte-compile-and-recursion (rest failtag) + (if (cdr rest) + (progn + (byte-compile-form (car rest)) (byte-compile-goto-if nil for-effect failtag) - (setq args (cdr args))) - (byte-compile-form-do-effect (car args)) - (byte-compile-out-tag failtag)))) + (byte-compile-maybe-guarded (car rest) + (byte-compile-and-recursion (cdr rest) failtag))) + (byte-compile-form-do-effect (car rest)) + (byte-compile-out-tag failtag))) (defun byte-compile-or (form) (let ((wintag (byte-compile-make-tag))