]> git.eshelyaron.com Git - emacs.git/commitdiff
Better internal-make-closure optimisation
authorMattias Engdegård <mattiase@acm.org>
Sun, 4 Jun 2023 13:58:44 +0000 (15:58 +0200)
committerMattias Engdegård <mattiase@acm.org>
Sun, 4 Jun 2023 17:17:15 +0000 (19:17 +0200)
* 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.

lisp/emacs-lisp/byte-opt.el

index 562f21aa751c92ff9167395373be7bc695a48301..f64674d5a6c0c06cd603bdab75014a09f6a32865 100644 (file)
@@ -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)))