mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-15 10:30:25 -08:00
Fix command repetition with lexical-binding (Bug#29334)
`call-interactively' relies on analyzing the source of `interactive' forms in order to preserve arguments like (region-end) in the command history, rather than just storing the resulting position. However, the byte-compiler does not preserve the source of the interactive form when lexical-binding is in effect, because `call-interactively' would evaluate the form with dynamic binding in that case. To fix this, change `call-interactively' so that it checks compiled functions for lexical-binding as well. Then the byte-compiler can preserve the source of interactive forms regardless of the value of lexical-binding. * src/callint.c (Fcall_interactively): Functions compiled with lexical-binding have their arglist encoded as an integer, use this to choose the right kind of binding for compiled functions too. * lisp/emacs-lisp/bytecomp.el (byte-compile-lambda): Preserve the uncompiled form of the interactive form when lexical-binding is enabled too.
This commit is contained in:
parent
f8b4e87d5d
commit
ce48658191
2 changed files with 4 additions and 6 deletions
|
|
@ -2839,11 +2839,7 @@ for symbols generated by the byte compiler itself."
|
|||
(while (consp (cdr form))
|
||||
(setq form (cdr form)))
|
||||
(setq form (car form)))
|
||||
(if (and (eq (car-safe form) 'list)
|
||||
;; The spec is evalled in callint.c in dynamic-scoping
|
||||
;; mode, so just leaving the form unchanged would mean
|
||||
;; it won't be eval'd in the right mode.
|
||||
(not lexical-binding))
|
||||
(if (eq (car-safe form) 'list)
|
||||
nil
|
||||
(setq int `(interactive ,newform)))))
|
||||
((cdr int)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue