Function: byte-compile-cond

byte-compile-cond is a byte-compiled function defined in bytecomp.el.gz.

Signature

(byte-compile-cond CLAUSES)

Source Code

;; Defined in /usr/src/emacs/lisp/emacs-lisp/bytecomp.el.gz
(defun byte-compile-cond (clauses)
  (let ((donetag (byte-compile-make-tag))
        nexttag clause)
    (setq clauses (cdr clauses))
    (while clauses
      (let ((switch-prefix (and byte-compile-cond-use-jump-table
                                (byte-compile--cond-switch-prefix clauses))))
        (if switch-prefix
            (progn
              (byte-compile-cond-jump-table (cdr switch-prefix) donetag)
              (setq clause nil)
              (setq clauses (car switch-prefix)))
          (setq clause (car clauses))
          (cond ((or (eq (car clause) t)
                     (and (eq (car-safe (car clause)) 'quote)
                          (car-safe (cdr-safe (car clause)))))
                 ;; Unconditional clause
                 (setq clause (cons t clause)
                       clauses nil))
                ((cdr clauses)
                 (byte-compile-form (car clause))
                 (if (null (cdr clause))
                     ;; First clause is a singleton.
                     (byte-compile-goto-if t byte-compile--for-effect donetag)
                   (setq nexttag (byte-compile-make-tag))
                   (byte-compile-goto 'byte-goto-if-nil nexttag)
                   (byte-compile-maybe-guarded (car clause)
                     (byte-compile-body (cdr clause) byte-compile--for-effect))
                   (byte-compile-goto 'byte-goto donetag)
                   (byte-compile-out-tag nexttag))))
          (setq clauses (cdr clauses)))))
    ;; Last clause
    (let ((guard (car clause)))
      (and (cdr clause) (not (eq guard t))
           (progn (byte-compile-form guard)
                  (byte-compile-goto-if nil byte-compile--for-effect donetag)
                  (setq clause (cdr clause))))
      (byte-compile-maybe-guarded guard
        (byte-compile-body-do-effect clause)))
    (byte-compile-out-tag donetag)))