changeset 74061:3fd4ab1021bd

(byte-compile-maybe-guarded): Check `and' conditions for function or variable bindings.
author Chong Yidong <cyd@stupidchicken.com>
date Sat, 18 Nov 2006 21:07:17 +0000
parents 36520481d28f
children 7febd926d4ff
files lisp/emacs-lisp/bytecomp.el
diffstat 1 files changed, 31 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/emacs-lisp/bytecomp.el	Sat Nov 18 21:07:01 2006 +0000
+++ b/lisp/emacs-lisp/bytecomp.el	Sat Nov 18 21:07:17 2006 +0000
@@ -3398,35 +3398,42 @@
 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)))