]> git.eshelyaron.com Git - emacs.git/commitdiff
(byte-compile-const-symbol-p):
authorStefan Monnier <monnier@iro.umontreal.ca>
Sat, 29 Aug 2009 14:44:45 +0000 (14:44 +0000)
committerStefan Monnier <monnier@iro.umontreal.ca>
Sat, 29 Aug 2009 14:44:45 +0000 (14:44 +0000)
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.

lisp/ChangeLog
lisp/emacs-lisp/bytecomp.el

index 50869b07c95025ae4f74298e06bff4c025dd48e8..528538545de5bee2aaefa5fc8032ac7f4f3b7105 100644 (file)
@@ -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)
index c234fd70a43095e94fed3dc9f39c7c2f339452d0..1aa63e3bec0ec39632286ddbea3cfc24d1c2e31e 100644 (file)
@@ -1506,7 +1506,14 @@ If ANY-VALUE is nil, only return non-nil if the value of the symbol is the
 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 @@ That command is designed for interactive use only" fn))
   (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)))))