aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Monnier2015-05-25 10:53:52 -0400
committerStefan Monnier2015-05-25 10:53:52 -0400
commit9b995d55c566737ef7aa3432826e1b7b656ff1c7 (patch)
tree9f7d8249de8583c1bca92d270015791f7f0955b4
parent969f3fb2e247cfcb8b5747d01cdd914998f4e8b1 (diff)
downloademacs-9b995d55c566737ef7aa3432826e1b7b656ff1c7.tar.gz
emacs-9b995d55c566737ef7aa3432826e1b7b656ff1c7.zip
(cl-generic-define-method): Side effects are evil (bug#20644)
* lisp/emacs-lisp/cl-generic.el (cl-generic-define-method): Don't reuse cons-cells that might be used as keys in an `equal' hash-table.
-rw-r--r--lisp/emacs-lisp/cl-generic.el6
1 files changed, 4 insertions, 2 deletions
diff --git a/lisp/emacs-lisp/cl-generic.el b/lisp/emacs-lisp/cl-generic.el
index b3c127f48f7..24a04d445de 100644
--- a/lisp/emacs-lisp/cl-generic.el
+++ b/lisp/emacs-lisp/cl-generic.el
@@ -432,8 +432,10 @@ which case this method will be invoked when the argument is `eql' to VAL.
432 (> (cl--generic-generalizer-priority x) 432 (> (cl--generic-generalizer-priority x)
433 (cl--generic-generalizer-priority y))))))) 433 (cl--generic-generalizer-priority y)))))))
434 (setq i (1+ i)))) 434 (setq i (1+ i))))
435 (if me (setcar me method) 435 ;; We used to (setcar me method), but that can cause false positives in
436 (setf (cl--generic-method-table generic) (cons method mt))) 436 ;; the hash-consing table of the method-builder (bug#20644).
437 ;; See the related FIXME in cl--generic-build-combined-method.
438 (setf (cl--generic-method-table generic) (cons method (delq (car me) mt)))
437 (cl-pushnew `(cl-defmethod . (,(cl--generic-name generic) . ,specializers)) 439 (cl-pushnew `(cl-defmethod . (,(cl--generic-name generic) . ,specializers))
438 current-load-list :test #'equal) 440 current-load-list :test #'equal)
439 ;; FIXME: Try to avoid re-constructing a new function if the old one 441 ;; FIXME: Try to avoid re-constructing a new function if the old one