Reported by: Stefan Monnier <monnier <at> iro.umontreal.ca>
Date: Sat, 12 Sep 2015 03:41:01 UTC
Severity: normal
Tags: patch, wontfix
Found in version 25.0.50
Done: Lars Ingebrigtsen <larsi <at> gnus.org>
Bug is archived. No further changes may be made.
Message #8 received at 21466 <at> debbugs.gnu.org (full text, mbox):
From: Stefan Monnier <monnier <at> iro.umontreal.ca> To: 21466 <at> debbugs.gnu.org Cc: bug-cc-mode <at> gnu.org Subject: Re: bug#21466: [PATCH] Avoid defining (temporarily) vars and functions Date: Thu, 29 Oct 2015 09:09:29 -0400
Ping? Stefan >>>>> "Stefan" == Stefan Monnier <monnier <at> iro.umontreal.ca> writes: > 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 <at> 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))
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.