diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2009-08-29 14:44:45 +0000 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2009-08-29 14:44:45 +0000 |
commit | d988dbf687f64c173f8dea5dec13886b04ffda6c (patch) | |
tree | e0eaa96dfb280d8b687935cc09fc2ea58480a5b1 /lisp | |
parent | 76a87a4d3ca9884afc5cb663990deccdf72ef6f3 (diff) | |
download | emacs-d988dbf687f64c173f8dea5dec13886b04ffda6c.tar.gz emacs-d988dbf687f64c173f8dea5dec13886b04ffda6c.tar.bz2 emacs-d988dbf687f64c173f8dea5dec13886b04ffda6c.zip |
(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.
Diffstat (limited to 'lisp')
-rw-r--r-- | lisp/ChangeLog | 5 | ||||
-rw-r--r-- | lisp/emacs-lisp/bytecomp.el | 21 |
2 files changed, 22 insertions, 4 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 50869b07c95..528538545de 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -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) diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el index c234fd70a43..1aa63e3bec0 100644 --- a/lisp/emacs-lisp/bytecomp.el +++ b/lisp/emacs-lisp/bytecomp.el @@ -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))))) |