# HG changeset patch # User Chong Yidong # Date 1227941551 0 # Node ID 3291f859ce6591889392d7e3c07e593a7c9a9534 # Parent 32c3e2f6272afb252efed996cd6519f1fd660bd3 (x-gtk-stock-cache): New hash table. (x-gtk-map-stock): Perform caching to prevent excess consing during diff -r 32c3e2f6272a -r 3291f859ce65 lisp/term/x-win.el --- 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)