I've been trying to port some more code. (ido.el, coming soon.) This
requires a bunch of fboundp tests, but it's annoying that this spits out
compiler warnings. I can silence them with (declare-fboundp ...), but
this isn't supported on GNU Emacs.
The attached patch makes the byte-code compiler recognize (if (fboundp
...) ...) forms. The corresponding patch from GNU Emacs applied
cleanly.
I realize this may be controversial; let me know if you object. I'll
wait until Tuesday until pushing this.
2013-03-02 Michael Sperber <mike(a)xemacs.org>
* bytecomp.el (byte-compile-if): Port this patch from GNU Emacs:
Author: Dave Love <fx(a)gnu.org>
Date: Thu Dec 12 20:27:43 2002 +0000
(byte-compile-if): Suppress warnings from
things protected by `(if (fboundp ...' or `(if (boundp ...'.
--
Regards,
Mike
diff --git a/lisp/bytecomp.el b/lisp/bytecomp.el
--- a/lisp/bytecomp.el
+++ b/lisp/bytecomp.el
@@ -4160,19 +4160,53 @@
(defun byte-compile-if (form)
(byte-compile-form (car (cdr form)))
- (if (null (nthcdr 3 form))
- ;; No else-forms
- (let ((donetag (byte-compile-make-tag)))
- (byte-compile-goto-if nil for-effect donetag)
- (byte-compile-form (nth 2 form) for-effect)
- (byte-compile-out-tag donetag))
- (let ((donetag (byte-compile-make-tag)) (elsetag (byte-compile-make-tag)))
- (byte-compile-goto 'byte-goto-if-nil elsetag)
- (byte-compile-form (nth 2 form) for-effect)
- (byte-compile-goto 'byte-goto donetag)
- (byte-compile-out-tag elsetag)
- (byte-compile-body (cdr (cdr (cdr form))) for-effect)
- (byte-compile-out-tag donetag)))
+ ;; Check whether we have `(if (fboundp ...' or `(if (boundp ...'
+ ;; and avoid warnings about the relevent symbols in the consequent.
+ (let* ((clause (nth 1 form))
+ (fbound (if (eq 'fboundp (car-safe clause))
+ (and (eq 'quote (car-safe (nth 1 clause)))
+ ;; Ignore if the symbol is already on the
+ ;; unresolved list.
+ (not (assq
+ (nth 1 (nth 1 clause)) ; the relevant symbol
+ byte-compile-unresolved-functions))
+ (nth 1 (nth 1 clause)))))
+ (bound (if (eq 'boundp (car-safe clause))
+ (and (eq 'quote (car-safe (nth 1 clause)))
+ (nth 1 (nth 1 clause)))))
+ (donetag (byte-compile-make-tag)))
+ (if (null (nthcdr 3 form))
+ ;; No else-forms
+ (progn
+ (byte-compile-goto-if nil for-effect donetag)
+ ;; Maybe add to the bound list.
+ (let ((byte-compile-bound-variables
+ (if bound
+ (cons bound byte-compile-bound-variables)
+ byte-compile-bound-variables)))
+ (byte-compile-form (nth 2 form) for-effect))
+ ;; 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)))
+ (byte-compile-out-tag donetag))
+ (let ((elsetag (byte-compile-make-tag)))
+ (byte-compile-goto 'byte-goto-if-nil elsetag)
+ ;; As above for the first form.
+ (let ((byte-compile-bound-variables
+ (if bound
+ (cons bound byte-compile-bound-variables)
+ byte-compile-bound-variables)))
+ (byte-compile-form (nth 2 form) for-effect))
+ (if fbound
+ (setq byte-compile-unresolved-functions
+ (delq (assq fbound byte-compile-unresolved-functions)
+ byte-compile-unresolved-functions)))
+ (byte-compile-goto 'byte-goto donetag)
+ (byte-compile-out-tag elsetag)
+ (byte-compile-body (cdr (cdr (cdr form))) for-effect)
+ (byte-compile-out-tag donetag))))
(setq for-effect nil))
(defun byte-compile-cond (clauses)
_______________________________________________
XEmacs-Patches mailing list
XEmacs-Patches(a)xemacs.org
http://lists.xemacs.org/mailman/listinfo/xemacs-patches