From: Stefan Monnier <monnier@iro.umontreal.ca>
To: 21466@debbugs.gnu.org
Cc: bug-cc-mode@gnu.org
Subject: bug#21466: [PATCH] Avoid defining (temporarily) vars and functions
Date: Fri, 11 Sep 2015 23:36:45 -0400 [thread overview]
Message-ID: <jwvlhcc1f76.fsf@iro.umontreal.ca> (raw)
Package: Emacs
Version: 25.0.50
CC-mode currently defines various non-CC-mode variables and functions
with dummy values, as a way to avoid byte-compiler warnings when using
those external vars/functions.
Since this is dangerous business, CC-mode has to be extra careful to
undo such settings when they're not needed any more.
It might have made sense back in the days when the byte-compiler did not
offer built-in ways to silence those warnings, but nowadays we can
do better.
Any objections to the patch below (which also removes the unused
cc-bytecomp-put, while we're at it)?
Stefan
2015-09-12 Stefan Monnier <monnier@iro.umontreal.ca>
* lisp/progmodes/cc-bytecomp.el: Use newer compiler-silencers.
(cc-bytecomp-defvar): Use just (defvar <foo>) when that is known to
silence the byte-compiler warnings.
(cc-bytecomp-defun): Use just (declare-function <foo>) when that is
known to silence the byte-compiler warnings.
(cc-bytecomp-boundp, cc-bytecomp-fboundp): Change accordingly.
(cc-bytecomp-put): Remove, unused.
(cc-bytecomp-original-properties): Remove var.
(cc-bytecomp-setup-environment, cc-bytecomp-restore-environment):
Don't use cc-bytecomp-original-properties any more.
diff --git a/lisp/progmodes/cc-bytecomp.el b/lisp/progmodes/cc-bytecomp.el
index 81b7a82..fff2a9e 100644
--- a/lisp/progmodes/cc-bytecomp.el
+++ b/lisp/progmodes/cc-bytecomp.el
@@ -75,12 +75,10 @@
(defvar cc-bytecomp-unbound-variables nil)
(defvar cc-bytecomp-original-functions nil)
-(defvar cc-bytecomp-original-properties nil)
(defvar cc-bytecomp-loaded-files nil)
(setq cc-bytecomp-unbound-variables nil)
(setq cc-bytecomp-original-functions nil)
-(setq cc-bytecomp-original-properties nil)
(setq cc-bytecomp-loaded-files nil)
(defvar cc-bytecomp-environment-set nil)
@@ -173,16 +171,6 @@ perhaps a `cc-bytecomp-restore-environment' is forgotten somewhere"))
(cc-bytecomp-debug-msg
"cc-bytecomp-setup-environment: Covered function %s" fun))))
(setq p (cdr p)))
- (setq p cc-bytecomp-original-properties)
- (while p
- (let ((sym (car (car (car p))))
- (prop (cdr (car (car p))))
- (tempdef (car (cdr (car p)))))
- (put sym prop tempdef)
- (cc-bytecomp-debug-msg
- "cc-bytecomp-setup-environment: Bound property %s for %s to %s"
- prop sym tempdef))
- (setq p (cdr p)))
(setq cc-bytecomp-environment-set t)
(cc-bytecomp-debug-msg
"cc-bytecomp-setup-environment: Done"))))
@@ -232,22 +220,6 @@ perhaps a `cc-bytecomp-restore-environment' is forgotten somewhere"))
"cc-bytecomp-restore-environment: Not restoring function %s"
fun))))
(setq p (cdr p)))
- (setq p cc-bytecomp-original-properties)
- (while p
- (let ((sym (car (car (car p))))
- (prop (cdr (car (car p))))
- (tempdef (car (cdr (car p))))
- (origdef (cdr (cdr (car p)))))
- (if (eq (get sym prop) tempdef)
- (progn
- (put sym prop origdef)
- (cc-bytecomp-debug-msg
- "cc-bytecomp-restore-environment: Restored property %s for %s to %s"
- prop sym origdef))
- (cc-bytecomp-debug-msg
- "cc-bytecomp-restore-environment: Not restoring property %s for %s"
- prop sym)))
- (setq p (cdr p)))
(setq cc-bytecomp-environment-set nil)
(cc-bytecomp-debug-msg
"cc-bytecomp-restore-environment: Done"))))
@@ -348,25 +320,28 @@ afterwards. Don't use within `eval-when-compile'."
(eval-when-compile (cc-bytecomp-setup-environment))))
(defmacro cc-bytecomp-defvar (var)
- "Binds the symbol as a variable during compilation of the file,
+ "Bind the symbol as a variable during compilation of the file,
to silence the byte compiler. Don't use within `eval-when-compile'."
- `(eval-when-compile
- (if (boundp ',var)
- (cc-bytecomp-debug-msg
- "cc-bytecomp-defvar: %s bound already as variable" ',var)
- (if (not (memq ',var cc-bytecomp-unbound-variables))
- (progn
- (cc-bytecomp-debug-msg
- "cc-bytecomp-defvar: Saving %s (as unbound)" ',var)
- (setq cc-bytecomp-unbound-variables
- (cons ',var cc-bytecomp-unbound-variables))))
- (if (cc-bytecomp-is-compiling)
- (progn
- (defvar ,var)
- (set ',var (intern (concat "cc-bytecomp-ignore-var:"
- (symbol-name ',var))))
- (cc-bytecomp-debug-msg
- "cc-bytecomp-defvar: Covered variable %s" ',var))))))
+ (if (not (featurep 'xemacs))
+ `(defvar ,var)
+ ;; Not sure if XEmacs's ‘defvar’ works in the same way.
+ `(eval-when-compile
+ (if (boundp ',var)
+ (cc-bytecomp-debug-msg
+ "cc-bytecomp-defvar: %s bound already as variable" ',var)
+ (if (not (memq ',var cc-bytecomp-unbound-variables))
+ (progn
+ (cc-bytecomp-debug-msg
+ "cc-bytecomp-defvar: Saving %s (as unbound)" ',var)
+ (setq cc-bytecomp-unbound-variables
+ (cons ',var cc-bytecomp-unbound-variables))))
+ (if (cc-bytecomp-is-compiling)
+ (progn
+ (defvar ,var)
+ (set ',var (intern (concat "cc-bytecomp-ignore-var:"
+ (symbol-name ',var))))
+ (cc-bytecomp-debug-msg
+ "cc-bytecomp-defvar: Covered variable %s" ',var)))))))
(defmacro cc-bytecomp-defun (fun)
"Bind the symbol as a function during compilation of the file,
@@ -377,48 +352,33 @@ definition. That means that this macro will not shut up warnings
about incorrect number of arguments. It's dangerous to try to replace
existing functions since the byte compiler might need the definition
at compile time, e.g. for macros and inline functions."
- `(eval-when-compile
- (if (fboundp ',fun)
- (cc-bytecomp-debug-msg
- "cc-bytecomp-defun: %s bound already as function" ',fun)
- (if (not (assq ',fun cc-bytecomp-original-functions))
- (progn
- (cc-bytecomp-debug-msg
- "cc-bytecomp-defun: Saving %s (as unbound)" ',fun)
- (setq cc-bytecomp-original-functions
- (cons (list ',fun nil 'unbound)
- cc-bytecomp-original-functions))))
- (if (cc-bytecomp-is-compiling)
- (progn
- (fset ',fun (intern (concat "cc-bytecomp-ignore-fun:"
- (symbol-name ',fun))))
- (cc-bytecomp-debug-msg
- "cc-bytecomp-defun: Covered function %s" ',fun))))))
-
-(defmacro cc-bytecomp-put (symbol propname value)
- "Set a property on a symbol during compilation (and evaluation) of
-the file. Don't use outside `eval-when-compile'."
- `(eval-when-compile
- (if (not (assoc (cons ,symbol ,propname) cc-bytecomp-original-properties))
- (progn
+ (if (fboundp 'declare-function)
+ `(declare-function ,fun nil)
+ `(eval-when-compile
+ (if (fboundp ',fun)
(cc-bytecomp-debug-msg
- "cc-bytecomp-put: Saving property %s for %s with value %s"
- ,propname ,symbol (get ,symbol ,propname))
- (setq cc-bytecomp-original-properties
- (cons (cons (cons ,symbol ,propname)
- (cons ,value (get ,symbol ,propname)))
- cc-bytecomp-original-properties))))
- (put ,symbol ,propname ,value)
- (cc-bytecomp-debug-msg
- "cc-bytecomp-put: Bound property %s for %s to %s"
- ,propname ,symbol ,value)))
+ "cc-bytecomp-defun: %s bound already as function" ',fun)
+ (if (not (assq ',fun cc-bytecomp-original-functions))
+ (progn
+ (cc-bytecomp-debug-msg
+ "cc-bytecomp-defun: Saving %s (as unbound)" ',fun)
+ (setq cc-bytecomp-original-functions
+ (cons (list ',fun nil 'unbound)
+ cc-bytecomp-original-functions))))
+ (if (cc-bytecomp-is-compiling)
+ (progn
+ (fset ',fun (intern (concat "cc-bytecomp-ignore-fun:"
+ (symbol-name ',fun))))
+ (cc-bytecomp-debug-msg
+ "cc-bytecomp-defun: Covered function %s" ',fun)))))))
(defmacro cc-bytecomp-boundp (symbol)
"Return non-nil if the given symbol is bound as a variable outside
the compilation. This is the same as using `boundp' but additionally
exclude any variables that have been bound during compilation with
`cc-bytecomp-defvar'."
- (if (and (cc-bytecomp-is-compiling)
+ (if (and (featurep 'xemacs)
+ (cc-bytecomp-is-compiling)
(memq (car (cdr symbol)) cc-bytecomp-unbound-variables))
nil
`(boundp ,symbol)))
@@ -429,7 +389,8 @@ the compilation. This is the same as using `fboundp' but additionally
exclude any functions that have been bound during compilation with
`cc-bytecomp-defun'."
(let (fun-elem)
- (if (and (cc-bytecomp-is-compiling)
+ (if (and (not (fboundp 'declare-function))
+ (cc-bytecomp-is-compiling)
(setq fun-elem (assq (car (cdr symbol))
cc-bytecomp-original-functions))
(eq (elt fun-elem 2) 'unbound))
next reply other threads:[~2015-09-12 3:36 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-12 3:36 Stefan Monnier [this message]
2015-10-29 13:09 ` bug#21466: [PATCH] Avoid defining (temporarily) vars and functions Stefan Monnier
2019-11-06 1:29 ` Stefan Kangas
2021-05-10 11:45 ` Lars Ingebrigtsen
2021-05-11 20:34 ` Alan Mackenzie
[not found] ` <YJrqVlJR4iMvf2s1@ACM>
2021-05-11 22:03 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2021-07-23 13:14 ` Lars Ingebrigtsen
2021-07-23 15:01 ` Glenn Morris
2021-07-24 10:26 ` Lars Ingebrigtsen
2022-03-23 20:13 ` Lars Ingebrigtsen
2022-03-25 21:09 ` Alan Mackenzie
2022-03-26 14:45 ` Alan Mackenzie
2022-03-26 16:47 ` Lars Ingebrigtsen
2022-03-26 19:51 ` Alan Mackenzie
2022-03-29 12:26 ` Lars Ingebrigtsen
2022-03-29 21:02 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=jwvlhcc1f76.fsf@iro.umontreal.ca \
--to=monnier@iro.umontreal.ca \
--cc=21466@debbugs.gnu.org \
--cc=bug-cc-mode@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.