mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-12 17:10:43 -08:00
Don't rewrite set to setq of lexical variables
Only perform the rewrite (set 'VAR X) -> (setq VAR X) for dynamic variables, as `set` isn't supposed to affect lexical vars (and never does so when interpreted). * lisp/emacs-lisp/byte-opt.el (byte-optimize-set): * test/lisp/emacs-lisp/bytecomp-tests.el (bytecomp-tests--xx): New. (bytecomp-tests--test-cases): Add test cases. * test/lisp/emacs-lisp/bytecomp-resources/warn-variable-set-nonvariable.el: Remove obsolete test.
This commit is contained in:
parent
e9f42b1cba
commit
e4964de952
3 changed files with 22 additions and 15 deletions
|
|
@ -1531,15 +1531,16 @@ See Info node `(elisp) Integer Basics'."
|
|||
|
||||
(put 'set 'byte-optimizer #'byte-optimize-set)
|
||||
(defun byte-optimize-set (form)
|
||||
(let ((var (car-safe (cdr-safe form))))
|
||||
(cond
|
||||
((and (eq (car-safe var) 'quote) (consp (cdr var)))
|
||||
`(setq ,(cadr var) ,@(cddr form)))
|
||||
((and (eq (car-safe var) 'make-local-variable)
|
||||
(eq (car-safe (setq var (car-safe (cdr var)))) 'quote)
|
||||
(consp (cdr var)))
|
||||
`(progn ,(cadr form) (setq ,(cadr var) ,@(cddr form))))
|
||||
(t form))))
|
||||
(pcase (cdr form)
|
||||
;; Make sure we only turn `set' into `setq' for dynamic variables.
|
||||
(`((quote ,(and var (guard (and (symbolp var)
|
||||
(not (macroexp--const-symbol-p var))
|
||||
(not (assq var byte-optimize--lexvars))))))
|
||||
,newval)
|
||||
`(setq ,var ,newval))
|
||||
(`(,(and ml `(make-local-variable ,(and v `(quote ,_)))) ,newval)
|
||||
`(progn ,ml (,(car form) ,v ,newval)))
|
||||
(_ form)))
|
||||
|
||||
;; enumerating those functions which need not be called if the returned
|
||||
;; value is not used. That is, something like
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue