emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] master 4af3354 02/42: Make less garbage in overlay heavy buffers


From: Noam Postavsky
Subject: [elpa] master 4af3354 02/42: Make less garbage in overlay heavy buffers
Date: Sun, 22 Dec 2019 17:37:55 -0500 (EST)

branch: master
commit 4af33546d83ab45ec14165e2a9a7a2147a7963c9
Author: Noam Postavsky <address@hidden>
Commit: Noam Postavsky <address@hidden>

    Make less garbage in overlay heavy buffers
    
    * yasnippet.el (yas-active-snippets): Use dolist+when-push instead of
    mapcar+delq.
---
 yasnippet.el | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/yasnippet.el b/yasnippet.el
index eeeb33f..b6e3d0e 100644
--- a/yasnippet.el
+++ b/yasnippet.el
@@ -3273,12 +3273,19 @@ equivalent to a range covering the whole buffer."
          (setq beg (point-min) end (point-max)))
         ((not end)
          (setq end (1+ beg))))
-  (cl-sort
-   (delete-dups ;; Snippets have multiple overlays.
-    (delq nil
-          (mapcar (lambda (ov) (overlay-get ov 'yas--snippet))
-                  (overlays-in beg end))))
-   #'>= :key #'yas--snippet-id))
+
+  ;; Note: don't use `mapcar' here, since it would allocate in
+  ;; proportion to the amount of overlays, even though the list of
+  ;; active snippets should be very small.  That is important because
+  ;; this function is called in the post-command hook (via
+  ;; `yas--check-commit-snippet').
+  (let ((snippets nil))
+    (dolist (ov (overlays-in beg end))
+      (let ((snippet (overlay-get ov 'yas--snippet)))
+        ;; Snippets have multiple overlays, so check for dups.
+        (when (and snippet (not (memq snippet snippets)))
+          (push snippet snippets))))
+    (cl-sort snippets #'>= :key #'yas--snippet-id)))
 
 (define-obsolete-function-alias 'yas--snippets-at-point
   'yas-active-snippets "0.12")



reply via email to

[Prev in Thread] Current Thread [Next in Thread]