Function: byte-optimize-if

byte-optimize-if is a byte-compiled function defined in byte-opt.el.gz.

Signature

(byte-optimize-if FORM)

Source Code

;; Defined in /usr/src/emacs/lisp/emacs-lisp/byte-opt.el.gz
(defun byte-optimize-if (form)
  ;; (if (progn <insts> <test>) <rest>) ==> (progn <insts> (if <test> <rest>))
  ;; (if <true-constant> <then> <else...>) ==> <then>
  ;; (if <false-constant> <then> <else...>) ==> (progn <else...>)
  ;; (if <test> nil <else...>) ==> (if (not <test>) (progn <else...>))
  ;; (if <test> <then> nil) ==> (if <test> <then>)
  (let ((clause (nth 1 form)))
    (cond ((and (eq (car-safe clause) 'progn)
                (proper-list-p clause))
           (if (null (cddr clause))
               ;; A trivial `progn'.
               (byte-optimize-if `(if ,(cadr clause) ,@(nthcdr 2 form)))
             (nconc (butlast clause)
                    (list
                     (byte-optimize-if
                      `(if ,(car (last clause)) ,@(nthcdr 2 form)))))))
          ((byte-compile-trueconstp clause)
	   `(progn ,clause ,(nth 2 form)))
	  ((byte-compile-nilconstp clause)
           `(progn ,clause ,@(nthcdr 3 form)))
	  ((nth 2 form)
	   (if (equal '(nil) (nthcdr 3 form))
	       (list 'if clause (nth 2 form))
	     form))
	  ((or (nth 3 form) (nthcdr 4 form))
	   (list 'if
		 ;; Don't make a double negative;
		 ;; instead, take away the one that is there.
		 (if (and (consp clause) (memq (car clause) '(not null))
			  (= (length clause) 2)) ; (not xxxx) or (not (xxxx))
		     (nth 1 clause)
		   (list 'not clause))
		 (if (nthcdr 4 form)
		     (cons 'progn (nthcdr 3 form))
		   (nth 3 form))))
	  (t
	   (list 'progn clause nil)))))