Provide byte-compiler warnings when set-default a read-only var.
* emacs-lisp/bytecomp.el (byte-compile-set-default): New function. (byte-compile-setq-default): Optimize for the single-var case and don't call byte-compile-form in this case to avoid inf-loop with byte-compile-set-default.
This commit is contained in:
parent
bd486b039f
commit
9ae0c31028
3 changed files with 46 additions and 30 deletions
|
@ -1,5 +1,10 @@
|
|||
2010-04-23 Stefan Monnier <monnier@iro.umontreal.ca>
|
||||
|
||||
* emacs-lisp/bytecomp.el (byte-compile-set-default): New function.
|
||||
(byte-compile-setq-default): Optimize for the
|
||||
single-var case and don't call byte-compile-form in this case to avoid
|
||||
inf-loop with byte-compile-set-default.
|
||||
|
||||
* progmodes/compile.el (compilation-start): Abbreviate default directory.
|
||||
|
||||
2010-04-23 Michael Albinus <michael.albinus@gmx.de>
|
||||
|
|
|
@ -3333,21 +3333,31 @@ If it is nil, then the handler is \"byte-compile-SYMBOL.\""
|
|||
(setq for-effect nil)))
|
||||
|
||||
(defun byte-compile-setq-default (form)
|
||||
(let ((bytecomp-args (cdr form))
|
||||
setters)
|
||||
(while bytecomp-args
|
||||
(let ((var (car bytecomp-args)))
|
||||
(and (or (not (symbolp var))
|
||||
(byte-compile-const-symbol-p var t))
|
||||
(byte-compile-warning-enabled-p 'constants)
|
||||
(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 bytecomp-args)))
|
||||
setters))
|
||||
(setq bytecomp-args (cdr (cdr bytecomp-args))))
|
||||
(byte-compile-form (cons 'progn (nreverse setters)))))
|
||||
(setq form (cdr form))
|
||||
(if (> (length form) 2)
|
||||
(let ((setters ()))
|
||||
(while (consp form)
|
||||
(push `(setq-default ,(pop form) ,(pop form)) setters))
|
||||
(byte-compile-form (cons 'progn (nreverse setters))))
|
||||
(let ((var (car form)))
|
||||
(and (or (not (symbolp var))
|
||||
(byte-compile-const-symbol-p var t))
|
||||
(byte-compile-warning-enabled-p 'constants)
|
||||
(byte-compile-warn
|
||||
"variable assignment to %s `%s'"
|
||||
(if (symbolp var) "constant" "nonvariable")
|
||||
(prin1-to-string var)))
|
||||
(byte-compile-normal-call `(set-default ',var ,@(cdr form))))))
|
||||
|
||||
(byte-defop-compiler-1 set-default)
|
||||
(defun byte-compile-set-default (form)
|
||||
(let ((varexp (car-safe (cdr-safe form))))
|
||||
(if (eq (car-safe varexp) 'quote)
|
||||
;; If the varexp is constant, compile it as a setq-default
|
||||
;; so we get more warnings.
|
||||
(byte-compile-setq-default `(setq-default ,(car-safe (cdr varexp))
|
||||
,@(cddr form)))
|
||||
(byte-compile-normal-call form))))
|
||||
|
||||
(defun byte-compile-quote (form)
|
||||
(byte-compile-constant (car (cdr form))))
|
||||
|
|
|
@ -232,6 +232,7 @@ holds a keymap."
|
|||
submap key)
|
||||
;; We'll pick up the last valid entry in the list of keys if
|
||||
;; there's more than one.
|
||||
;; FIXME: Aren't they *all* "valid"?? --Stef
|
||||
(dolist (k keys)
|
||||
;; We're looking for a binding of the command in a submap of
|
||||
;; the menu bar map, so the key sequence must be two or more
|
||||
|
@ -242,24 +243,24 @@ holds a keymap."
|
|||
;; Last element in the bound key sequence:
|
||||
(kk (aref k (1- (length k)))))
|
||||
(if (and (keymapp m)
|
||||
(symbolp kk))
|
||||
(symbolp kk)) ;FIXME: Why? --Stef
|
||||
(setq submap m
|
||||
key kk)))))
|
||||
(when (and (symbolp submap) (boundp submap))
|
||||
(setq submap (eval submap)))
|
||||
(let ((defn (assq key (cdr submap))))
|
||||
(if (eq (cadr defn) 'menu-item)
|
||||
(define-key-after in-map (vector key)
|
||||
(append (cdr defn) (list :image image-exp) props))
|
||||
(setq defn (cdr defn))
|
||||
(when submap
|
||||
(let ((defn nil))
|
||||
;; Here, we're essentially doing a "lookup-key without get_keyelt".
|
||||
(map-keymap (lambda (k b) (if (eq k key) (setq defn b)))
|
||||
submap)
|
||||
(define-key-after in-map (vector key)
|
||||
(let ((rest (cdr defn)))
|
||||
;; If the rest of the definition starts
|
||||
;; with a list of menu cache info, get rid of that.
|
||||
(if (and (consp rest) (consp (car rest)))
|
||||
(setq rest (cdr rest)))
|
||||
(append `(menu-item ,(car defn) ,rest)
|
||||
(list :image image-exp) props)))))))
|
||||
(if (eq (car defn) 'menu-item)
|
||||
(append (cdr defn) (list :image image-exp) props)
|
||||
(let ((rest (cdr defn)))
|
||||
;; If the rest of the definition starts
|
||||
;; with a list of menu cache info, get rid of that.
|
||||
(if (and (consp rest) (consp (car rest)))
|
||||
(setq rest (cdr rest)))
|
||||
(append `(menu-item ,(car defn) ,rest)
|
||||
(list :image image-exp) props))))))))
|
||||
|
||||
;;; Set up some global items. Additions/deletions up for grabs.
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue