[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#21466: [PATCH] Avoid defining (temporarily) vars and functions
From: |
Lars Ingebrigtsen |
Subject: |
bug#21466: [PATCH] Avoid defining (temporarily) vars and functions |
Date: |
Wed, 23 Mar 2022 21:13:35 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) |
Alan Mackenzie <acm@muc.de> writes:
> So, I don't object on principle to the principle of the patch, just
> there are these little irritations about it, and it will need me to
> study it more closely to check nothing subtle would get lost (I doubt it
> would).
The patch no longer applied to Emacs 29, so I've respun it.
diff --git a/lisp/progmodes/cc-bytecomp.el b/lisp/progmodes/cc-bytecomp.el
index 4b8154dafe..277ba29a89 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)
@@ -177,16 +175,6 @@ cc-bytecomp-setup-environment
(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"))))
@@ -236,22 +224,6 @@ cc-bytecomp-restore-environment
"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"))))
@@ -385,23 +357,26 @@ cc-bytecomp-defvar
This can be used to silence the byte compiler. Don't use within
`eval-when-compile'."
(declare (debug nil))
- `(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 FUN as a function during compilation of the file.
@@ -414,42 +389,25 @@ cc-bytecomp-defun
existing functions since the byte compiler might need the definition
at compile time, e.g. for macros and inline functions."
(declare (debug nil))
- `(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 SYMBOL during compilation (and evaluation) of the file.
-Don't use outside `eval-when-compile'."
- (declare (debug t))
- `(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 SYMBOL is bound as a variable outside the compilation.
@@ -457,7 +415,8 @@ cc-bytecomp-boundp
variables that have been bound during compilation with
`cc-bytecomp-defvar'."
(declare (debug t))
- (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)))
@@ -469,7 +428,8 @@ cc-bytecomp-fboundp
`cc-bytecomp-defun'."
(declare (debug t))
(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))
However, it leads to a number of warnings when compiling, so either my
respin is faulty, or something's changed to make it not work any more?
In c-fontify-recorded-types-and-refs:
progmodes/cc-fonts.el:491:8: Warning: function
`c-fontify-recorded-types-and-refs' defined multiple times in this file
ELC progmodes/cc-styles.elc
In c-font-lock-declarators:
progmodes/cc-fonts.el:1063:8: Warning: function `c-font-lock-declarators'
defined multiple times in this file
progmodes/cc-fonts.el:2300:35: Warning: reference to free variable
`c-preprocessor-face-name'
progmodes/cc-fonts.el:2300:35: Warning: reference to free variable
`c-preprocessor-face-name'
progmodes/cc-fonts.el:2496:37: Warning: reference to free variable
`c-preprocessor-face-name'
progmodes/cc-fonts.el:2496:37: Warning: reference to free variable
`c-preprocessor-face-name'
progmodes/cc-fonts.el:2501:37: Warning: reference to free variable
`c-reference-face-name'
In c-font-lock-objc-method:
progmodes/cc-fonts.el:2527:8: Warning: function `c-font-lock-objc-method'
defined multiple times in this file
progmodes/cc-fonts.el:2602:38: Warning: reference to free variable
`c-preprocessor-face-name'
progmodes/cc-fonts.el:2602:38: Warning: reference to free variable
`c-preprocessor-face-name'
progmodes/cc-fonts.el:2650:38: Warning: reference to free variable
`c-reference-face-name'
progmodes/cc-fonts.el:2678:37: Warning: reference to free variable
`c-preprocessor-face-name'
progmodes/cc-fonts.el:2678:37: Warning: reference to free variable
`c-preprocessor-face-name'
progmodes/cc-fonts.el:2683:37: Warning: reference to free variable
`c-reference-face-name'
progmodes/cc-fonts.el:2711:38: Warning: reference to free variable
`c-preprocessor-face-name'
progmodes/cc-fonts.el:2711:38: Warning: reference to free variable
`c-preprocessor-face-name'
progmodes/cc-fonts.el:2716:38: Warning: reference to free variable
`c-reference-face-name'
- bug#21466: [PATCH] Avoid defining (temporarily) vars and functions,
Lars Ingebrigtsen <=