(byte-compile-maybe-guarded): Check `and' conditions for function or

variable bindings.
This commit is contained in:
Chong Yidong 2006-11-18 21:07:17 +00:00
parent f80832bcaa
commit 26cc7ed550

View 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)))