diff options
| author | Stefan Monnier | 2015-05-25 10:53:52 -0400 |
|---|---|---|
| committer | Stefan Monnier | 2015-05-25 10:53:52 -0400 |
| commit | 9b995d55c566737ef7aa3432826e1b7b656ff1c7 (patch) | |
| tree | 9f7d8249de8583c1bca92d270015791f7f0955b4 | |
| parent | 969f3fb2e247cfcb8b5747d01cdd914998f4e8b1 (diff) | |
| download | emacs-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.el | 6 |
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 |