]> git.eshelyaron.com Git - emacs.git/commitdiff
* Rework 'comp-normalize-valset' (bug#71116)
authorAndrea Corallo <acorallo@gnu.org>
Mon, 27 May 2024 15:38:22 +0000 (17:38 +0200)
committerEshel Yaron <me@eshelyaron.com>
Mon, 27 May 2024 20:34:49 +0000 (22:34 +0200)
* lisp/emacs-lisp/comp-cstr.el (comp-normalize-valset): Rework to
improve consistency.

(cherry picked from commit 509e7f877baca1df25274f2e0e861d4499dfc25d)

lisp/emacs-lisp/comp-cstr.el

index 8d83356f20f2665ce1610d94b7574fe387618b68..532e089080b914f31f477ec4b73e678f3b0f45a7 100644 (file)
@@ -231,20 +231,22 @@ Return them as multiple value."
 
 (defun comp-normalize-valset (valset)
   "Sort and remove duplicates from VALSET then return it."
-  (cl-sort (cl-remove-duplicates valset :test #'eq)
-           (lambda (x y)
-             (cond
-              ((and (symbolp x) (symbolp y))
-               (string< x y))
-              ((and (symbolp x) (not (symbolp y)))
-               t)
-              ((and (not (symbolp x)) (symbolp y))
-               nil)
-              ((or (consp x) (consp y)
-                   nil))
-              (t
-               (< (sxhash-equal x)
-                  (sxhash-equal y)))))))
+  ;; Sort valset as much as possible (by type and by value for symbols
+  ;; and strings) to increase cache hits.  But refrain to use
+  ;; `sxhash-equal' to be reproducible across on different builds.
+  (cl-loop
+   with vals = (cl-remove-duplicates valset :test #'eq)
+   with type-val = (cl-loop
+                    for type in (cl-remove-duplicates (mapcar #'cl-type-of vals)
+                                                      :test #'eq)
+                    collect (cons type nil))
+   for x in vals
+   do (push x (cdr (assq (cl-type-of x) type-val)))
+   finally return (cl-loop
+                   for (type . values) in (cl-sort type-val #'string< :key #'car)
+                   append (if (memq type '(symbol string))
+                              (cl-sort values #'string<)
+                            values))))
 
 (defun comp-union-valsets (&rest valsets)
   "Union values present into VALSETS."