diff options
author | Andrea Corallo <akrl@sdf.org> | 2021-02-21 22:08:01 +0100 |
---|---|---|
committer | Andrea Corallo <akrl@sdf.org> | 2021-02-21 22:08:01 +0100 |
commit | cf1e8e792f60949e09e3ad4c53fb61b0b7628229 (patch) | |
tree | 35080229c9e3b46e5db14a2f051c001ab8c6e586 /lisp/emacs-lisp/bytecomp.el | |
parent | 39792cf62987ecc1a772f6a2027d6b32c70e8312 (diff) | |
parent | d0c47652e527397cae96444c881bf60455c763c1 (diff) | |
download | emacs-cf1e8e792f60949e09e3ad4c53fb61b0b7628229.tar.gz emacs-cf1e8e792f60949e09e3ad4c53fb61b0b7628229.tar.bz2 emacs-cf1e8e792f60949e09e3ad4c53fb61b0b7628229.zip |
Merge remote-tracking branch 'savannah/master' into HEAD
Diffstat (limited to 'lisp/emacs-lisp/bytecomp.el')
-rw-r--r-- | lisp/emacs-lisp/bytecomp.el | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el index 0da7b83791e..25e1920cb90 100644 --- a/lisp/emacs-lisp/bytecomp.el +++ b/lisp/emacs-lisp/bytecomp.el @@ -2940,7 +2940,9 @@ If FORM is a lambda or a macro, byte-compile it as a function." ((eq arg '&optional) (when (memq '&optional (cdr list)) (error "Duplicate &optional"))) - ((memq arg vars) + ((and (memq arg vars) + ;; Allow repetitions for unused args. + (not (string-match "\\`_" (symbol-name arg)))) (byte-compile-warn "repeated variable %s in lambda-list" arg)) (t (push arg vars)))) @@ -3903,15 +3905,21 @@ discarding." (cl-assert (or (> (length env) 0) docstring-exp)) ;Otherwise, we don't need a closure. (cl-assert (byte-code-function-p fun)) - (byte-compile-form `(make-byte-code - ',(aref fun 0) ',(aref fun 1) - (vconcat (vector . ,env) ',(aref fun 2)) - ,@(let ((rest (nthcdr 3 (mapcar (lambda (x) `',x) fun)))) - (if docstring-exp - `(,(car rest) - ,docstring-exp - ,@(cddr rest)) - rest))))))) + (byte-compile-form + ;; Use symbols V0, V1 ... as placeholders for closure variables: + ;; they should be short (to save space in the .elc file), yet + ;; distinct when disassembled. + (let* ((dummy-vars (mapcar (lambda (i) (intern (format "V%d" i))) + (number-sequence 0 (1- (length env))))) + (proto-fun + (apply #'make-byte-code + (aref fun 0) (aref fun 1) + ;; Prepend dummy cells to the constant vector, + ;; to get the indices right when disassembling. + (vconcat dummy-vars (aref fun 2)) + (mapcar (lambda (i) (aref fun i)) + (number-sequence 3 (1- (length fun))))))) + `(make-closure ,proto-fun ,@env)))))) (defun byte-compile-get-closed-var (form) "Byte-compile the special `internal-get-closed-var' form." |