branch: externals/truename-cache
commit 7221e53aaed2526417de06aa9241b1168595d35e
Author: Martin Edström <[email protected]>
Commit: Martin Edström <[email protected]>

    Do not transform alist->table->alist
    
    Less GC.
    
    Should later write tests to assert that:
    
    (equal truename-cache--results (seq-uniq truename-cache--results))
---
 truename-cache.el | 37 +++++++++++++++++++------------------
 1 file changed, 19 insertions(+), 18 deletions(-)

diff --git a/truename-cache.el b/truename-cache.el
index c3ef1130d8..8409106045 100644
--- a/truename-cache.el
+++ b/truename-cache.el
@@ -358,8 +358,8 @@ of `file-name-handler-alist'."
                                            local-name-handlers 
remote-name-handlers))))
 
 (defvar truename-cache--dedupped-dirs (make-hash-table :test 'equal))
-(defvar truename-cache--dedupped-results (make-hash-table :test 'equal))
 (defvar truename-cache--visited (make-hash-table :test 'equal))
+(defvar truename-cache--results nil)
 
 (cl-defun truename-cache-collect-files-and-attributes
     ( &rest args &key
@@ -585,7 +585,7 @@ Otherwise, they are quietly skipped."
                               (not (string-match-p FULL-DIR-DENY-RE 
true-dir))))
                 collect true-dir)))))
       (clrhash truename-cache--visited)
-      (clrhash truename-cache--dedupped-results)
+      (setq truename-cache--results nil)
       (with-temp-buffer  ; No buffer-env
         (truename-cache--init-abbreviator)
         ;; NOTE: Do the recursive analyses first, lest a flat dir
@@ -594,21 +594,20 @@ Otherwise, they are quietly skipped."
           (truename-cache--analyze-recursively dir args))
         (dolist (dir all-flat-dirs)
           (truename-cache--analyze dir args)))
-      (let ((final-alist (map-into truename-cache--dedupped-results 'list)))
-        (when abbrev
-          (cl-assert (or (eq abbrev 'full) (eq abbrev 'dir)))
-          (when (not side-effect)
-            (error "Argument ABBREV non-nil depends on SIDE-EFFECT t"))
-          (if (eq abbrev 'dir)
-              (cl-loop
-               for cell in final-alist
-               do (setcar cell (gethash (car cell)
-                                        truename-cache--true<>dir-abbr)))
+      (when abbrev
+        (cl-assert (or (eq abbrev 'full) (eq abbrev 'dir)))
+        (when (not side-effect)
+          (error "Argument ABBREV non-nil depends on SIDE-EFFECT t"))
+        (if (eq abbrev 'dir)
             (cl-loop
-             for cell in final-alist
+             for cell in truename-cache--results
              do (setcar cell (gethash (car cell)
-                                      truename-cache--true<>full-abbr)))))
-        final-alist))))
+                                      truename-cache--true<>dir-abbr)))
+          (cl-loop
+           for cell in truename-cache--results
+           do (setcar cell (gethash (car cell)
+                                    truename-cache--true<>full-abbr)))))
+      truename-cache--results)))
 
 (defun truename-cache--analyze-recursively (true-dir args)
   "Analyze TRUE-DIR recursively.
@@ -644,11 +643,12 @@ non-symlink file in REL-DIR, becomes the true name of 
that file."
       args
     (cl-loop
      with case-fold-fs = (file-name-case-insensitive-p true-dir)
-     for (bare-name . attr)
+     for cell
      in (if assert-readable
             (directory-files-and-attributes rel-dir nil nil t 'integer)
           (ignore-error permission-denied
             (directory-files-and-attributes rel-dir nil nil t 'integer)))
+     as (bare-name . attr) = cell
      as rel-name = (file-name-concat rel-dir bare-name)
      as true-name = (file-name-concat true-dir bare-name)
      when (and bare-name
@@ -698,7 +698,7 @@ non-symlink file in REL-DIR, becomes the true name of that 
file."
                           (and (eq t (file-attribute-type attr))
                                (progn (setq resolved-is-dir t)
                                       return-dirs)))
-                  (puthash resolved attr truename-cache--dedupped-results)
+                  (push (cons resolved attr) truename-cache--results)
                   (when side-effect
                     (let ((case-fold-search (file-name-case-insensitive-p 
resolved)))
                       (truename-cache--populate resolved true-name))))
@@ -717,7 +717,8 @@ non-symlink file in REL-DIR, becomes the true name of that 
file."
             nil))
 
      do
-     (puthash true-name attr truename-cache--dedupped-results)
+     (setcar cell true-name)
+     (push cell truename-cache--results)
      (when side-effect
        (let ((case-fold-search case-fold-fs))
          (truename-cache--populate true-name))))))

Reply via email to