changeset 104703:d4c299706e80

(byte-compile-const-symbol-p): Recognize immutable variables like most-positive-fixnum. (byte-compile-setq-default): Check and warn if trying to assign to an immutable variable, or a non-variable.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Sat, 29 Aug 2009 14:44:45 +0000
parents 6eebfab07f22
children ac32d8c1536f
files lisp/ChangeLog lisp/emacs-lisp/bytecomp.el
diffstat 2 files changed, 22 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Sat Aug 29 08:10:34 2009 +0000
+++ b/lisp/ChangeLog	Sat Aug 29 14:44:45 2009 +0000
@@ -1,5 +1,10 @@
 2009-08-29  Stefan Monnier  <monnier@iro.umontreal.ca>
 
+	* emacs-lisp/bytecomp.el (byte-compile-const-symbol-p):
+	Recognize immutable variables like most-positive-fixnum.
+	(byte-compile-setq-default): Check and warn if trying to assign
+	to an immutable variable, or a non-variable.
+
 	* progmodes/cc-vars.el (c-comment-continuation-stars):
 	* progmodes/cc-engine.el (c-looking-at-bos):
 	* progmodes/cc-cmds.el (c-toggle-auto-state)
--- a/lisp/emacs-lisp/bytecomp.el	Sat Aug 29 08:10:34 2009 +0000
+++ b/lisp/emacs-lisp/bytecomp.el	Sat Aug 29 14:44:45 2009 +0000
@@ -1506,7 +1506,14 @@
 symbol itself."
   (or (memq symbol '(nil t))
       (keywordp symbol)
-      (if any-value (memq symbol byte-compile-const-variables))))
+      (if any-value
+	  (or (memq symbol byte-compile-const-variables)
+	      ;; FIXME: We should provide a less intrusive way to find out
+	      ;; is a variable is "constant".
+	      (and (boundp symbol)
+		   (condition-case nil
+		       (progn (set symbol (symbol-value symbol)) nil)
+		     (setting-constant t)))))))
 
 (defmacro byte-compile-constp (form)
   "Return non-nil if FORM is a constant."
@@ -3483,9 +3490,15 @@
   (let ((args (cdr form))
 	setters)
     (while args
-      (setq setters
-	    (cons (list 'set-default (list 'quote (car args)) (car (cdr args)))
-		  setters))
+      (let ((var (car args)))
+	(if (or (not (symbolp var))
+		(byte-compile-const-symbol-p var t))
+	    (byte-compile-warn
+	     "variable assignment to %s `%s'"
+	     (if (symbolp var) "constant" "nonvariable")
+	     (prin1-to-string var)))
+	(push (list 'set-default (list 'quote var) (car (cdr args)))
+	      setters))
       (setq args (cdr (cdr args))))
     (byte-compile-form (cons 'progn (nreverse setters)))))