diff options
author | Mattias EngdegÄrd <mattiase@acm.org> | 2023-06-04 15:58:44 +0200 |
---|---|---|
committer | Mattias EngdegÄrd <mattiase@acm.org> | 2023-06-04 19:17:15 +0200 |
commit | 6058b4559d4b7d42bbcb6da787a95334aa8994ca (patch) | |
tree | e5cff3d6f424e08827581ffa4045d8276e7f7a5d /lisp/emacs-lisp/byte-opt.el | |
parent | 5d3d84066fa66b0f16505ee6e77c8c383277869f (diff) | |
download | emacs-6058b4559d4b7d42bbcb6da787a95334aa8994ca.tar.gz emacs-6058b4559d4b7d42bbcb6da787a95334aa8994ca.tar.bz2 emacs-6058b4559d4b7d42bbcb6da787a95334aa8994ca.zip |
Better internal-make-closure optimisation
* lisp/emacs-lisp/byte-opt.el (byte-optimize-form-code-walker):
Optimise closed-over values in closure creation like any other, which
can lead to stack variables being eliminated.
Diffstat (limited to 'lisp/emacs-lisp/byte-opt.el')
-rw-r--r-- | lisp/emacs-lisp/byte-opt.el | 14 |
1 files changed, 4 insertions, 10 deletions
diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el index 562f21aa751..f64674d5a6c 100644 --- a/lisp/emacs-lisp/byte-opt.el +++ b/lisp/emacs-lisp/byte-opt.el @@ -447,16 +447,10 @@ for speeding up processing.") . ,(byte-optimize-body exps for-effect))) ;; Needed as long as we run byte-optimize-form after cconv. - (`(internal-make-closure . ,_) - (and (not for-effect) - (progn - ;; Look up free vars and mark them to be kept, so that they - ;; won't be optimized away. - (dolist (var (caddr form)) - (let ((lexvar (assq var byte-optimize--lexvars))) - (when lexvar - (setcar (cdr lexvar) t)))) - form))) + (`(internal-make-closure ,vars ,env . ,rest) + (if for-effect + `(progn ,@(byte-optimize-body env t)) + `(,fn ,vars ,(mapcar #'byte-optimize-form env) . ,rest))) (`((lambda . ,_) . ,_) (let ((newform (macroexp--unfold-lambda form))) |