]> git.eshelyaron.com Git - emacs.git/commitdiff
(byte-compile-maybe-guarded): Check `and' conditions for function or
authorChong Yidong <cyd@stupidchicken.com>
Sat, 18 Nov 2006 21:07:17 +0000 (21:07 +0000)
committerChong Yidong <cyd@stupidchicken.com>
Sat, 18 Nov 2006 21:07:17 +0000 (21:07 +0000)
variable bindings.

lisp/emacs-lisp/bytecomp.el

index 02a88c13973837dd4efe5fa7f855bd3245b76e43..342ae2ab33a8d91ef9fbf5668777d757426ec1f9 100644 (file)
@@ -3398,35 +3398,42 @@ being undefined will be suppressed.
 If CONDITION's value is (not (featurep 'emacs)) or (featurep 'xemacs),
 that suppresses all warnings during execution of BODY."
   (declare (indent 1) (debug t))
-  `(let* ((fbound
-          (if (eq 'fboundp (car-safe ,condition))
-              (and (eq 'quote (car-safe (nth 1 ,condition)))
-                   ;; Ignore if the symbol is already on the
-                   ;; unresolved list.
-                   (not (assq (nth 1 (nth 1 ,condition)) ; the relevant symbol
-                              byte-compile-unresolved-functions))
-                   (nth 1 (nth 1 ,condition)))))
-         (bound (if (or (eq 'boundp (car-safe ,condition))
-                        (eq 'default-boundp (car-safe ,condition)))
-                    (and (eq 'quote (car-safe (nth 1 ,condition)))
-                         (nth 1 (nth 1 ,condition)))))
-         ;; Maybe add to the bound list.
-         (byte-compile-bound-variables
-          (if bound
-              (cons bound byte-compile-bound-variables)
-            byte-compile-bound-variables))
-         ;; Suppress all warnings, for code not used in Emacs.
-         (byte-compile-warnings
+  `(let* ((byte-compile-warnings
+          ;; Suppress all warnings, for code not used in Emacs.
           (if (member ,condition '((featurep 'xemacs)
                                    (not (featurep 'emacs))))
-              nil byte-compile-warnings)))
+              nil
+            byte-compile-warnings))
+         (byte-compile-bound-variables byte-compile-bound-variables)
+         binding fbound-list)
+     (mapc (lambda (subcondition)
+            (cond ((eq 'fboundp (car-safe subcondition))
+                   (setq binding (and (eq 'quote (car-safe (nth 1 subcondition)))
+                                      ;; Ignore if the symbol is already on the
+                                      ;; unresolved list.
+                                      (not (assq (nth 1 (nth 1 subcondition))
+                                                 byte-compile-unresolved-functions))
+                                      (nth 1 (nth 1 subcondition))))
+                   (if binding (setq fbound-list (cons binding fbound-list))))
+                  ((or (eq 'boundp (car-safe subcondition))
+                       (eq 'default-boundp (car-safe subcondition)))
+                   (setq binding (and (eq 'quote (car-safe (nth 1 subcondition)))
+                                      (nth 1 (nth 1 subcondition))))
+                   (if binding (setq byte-compile-bound-variables
+                                     (cons binding byte-compile-bound-variables))))))
+          ;; Inspect each element in an `and' condition; otherwise,
+          ;; inspect the condition itself.
+          (if (eq 'and (car-safe ,condition))
+              (cdr ,condition)
+            (list ,condition)))
      (unwind-protect
         (progn ,@body)
        ;; Maybe remove the function symbol from the unresolved list.
-       (if fbound
-          (setq byte-compile-unresolved-functions
-                (delq (assq fbound byte-compile-unresolved-functions)
-                      byte-compile-unresolved-functions))))))
+       (mapc (lambda (fun)
+              (setq byte-compile-unresolved-functions
+                    (delq (assq fun byte-compile-unresolved-functions)
+                          byte-compile-unresolved-functions)))
+            fbound-list))))
 
 (defun byte-compile-if (form)
   (byte-compile-form (car (cdr form)))