Mercurial > emacs
changeset 63472:a89b059224fb
(add-to-ordered-list): Use a weak hash-table to avoid leaks.
author | Stefan Monnier <monnier@iro.umontreal.ca> |
---|---|
date | Wed, 15 Jun 2005 20:58:20 +0000 |
parents | cd6bb9751bfe |
children | 7124ec94d01e |
files | lisp/subr.el |
diffstat | 1 files changed, 14 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/subr.el Wed Jun 15 16:38:53 2005 +0000 +++ b/lisp/subr.el Wed Jun 15 20:58:20 2005 +0000 @@ -963,36 +963,32 @@ The test for presence of ELEMENT is done with `equal'. The resulting list is reordered so that the elements are in the -order given by each element's numeric list order. Elements which -are not symbols, and symbol elements without a numeric list order -are placed at the end of the list. +order given by each element's numeric list order. +Elements without a numeric list order are placed at the end of +the list. -If the third optional argument ORDER is non-nil and ELEMENT is -a symbol, set the symbol's list order to the given value. +If the third optional argument ORDER is non-nil, set the +element's list order to the given value. -The list order for each symbol is stored in LIST-VAR's +The list order for each element is stored in LIST-VAR's `list-order' property. The return value is the new value of LIST-VAR." - (let* ((ordering (get list-var 'list-order)) - (cur (and (symbolp element) (assq element ordering)))) + (let ((ordering (get list-var 'list-order))) + (unless ordering + (put list-var 'list-order + (setq ordering (make-hash-table :weakness 'key :test 'eq)))) (when order - (unless (symbolp element) - (error "cannot specify order for non-symbols")) - (if cur - (setcdr cur order) - (setq cur (cons element order)) - (setq ordering (cons cur ordering)) - (put list-var 'list-order ordering))) + (puthash element order ordering)) (add-to-list list-var element) (set list-var (sort (symbol-value list-var) (lambda (a b) - (let ((oa (and (symbolp a) (assq a ordering))) - (ob (and (symbolp b) (assq b ordering)))) + (let ((oa (gethash a ordering)) + (ob (gethash b ordering))) (cond ((not oa) nil) ((not ob) t) - (t (< (cdr oa) (cdr ob)))))))))) + (t (< oa ob))))))))) ;;; Load history