changeset 100024:3291f859ce65

(x-gtk-stock-cache): New hash table. (x-gtk-map-stock): Perform caching to prevent excess consing during
author Chong Yidong <cyd@stupidchicken.com>
date Sat, 29 Nov 2008 06:52:31 +0000
parents 32c3e2f6272a
children 4015958e8d9d
files lisp/term/x-win.el
diffstat 1 files changed, 24 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/term/x-win.el	Sat Nov 29 06:51:18 2008 +0000
+++ b/lisp/term/x-win.el	Sat Nov 29 06:52:31 2008 +0000
@@ -1674,21 +1674,31 @@
 				       (string :tag "Stock/named")))))
   :group 'x)
 
+(defconst x-gtk-stock-cache (make-hash-table :weakness t :test 'equal))
+
 (defun x-gtk-map-stock (file)
-  "Map icon with file name FILE to a Gtk+ stock name, using `x-gtk-stock-map'."
-  (if (stringp file)
-      (save-match-data
-	(let* ((file-sans (file-name-sans-extension file))
-	       (key (and (string-match "/\\([^/]+/[^/]+/[^/]+$\\)" file-sans)
-			 (match-string 1 file-sans)))
-	       (value))
-	  (mapc (lambda (elem)
-		  (let ((assoc (if (symbolp elem) (symbol-value elem) elem)))
-		    (or value (setq value (assoc-string (or key file-sans)
-							assoc)))))
-		icon-map-list)
-	  (and value (cdr value))))
-    nil))
+  "Map icon with file name FILE to a Gtk+ stock name.
+This uses `icon-map-list' to map icon file names to stock icon names."
+  (when (stringp file)
+    (or (gethash file x-gtk-stock-cache)
+	(puthash
+	 file
+	 (save-match-data
+	   (let* ((file-sans (file-name-sans-extension file))
+		  (key (and (string-match "/\\([^/]+/[^/]+/[^/]+$\\)"
+					  file-sans)
+			    (match-string 1 file-sans)))
+		  (icon-map icon-map-list)
+		  elem value)
+	     (while (and (null value) icon-map)
+	       (setq elem (car icon-map)
+		     value (assoc-string (or key file-sans)
+					 (if (symbolp elem)
+					     (symbol-value elem)
+					   elem))
+		     icon-map (cdr icon-map)))
+	     (and value (cdr value))))
+	 x-gtk-stock-cache))))
 
 (provide 'x-win)