]> git.eshelyaron.com Git - emacs.git/commitdiff
(cl-generic-define-method): Side effects are evil (bug#20644)
authorStefan Monnier <monnier@iro.umontreal.ca>
Mon, 25 May 2015 14:53:52 +0000 (10:53 -0400)
committerStefan Monnier <monnier@iro.umontreal.ca>
Mon, 25 May 2015 14:53:52 +0000 (10:53 -0400)
* 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.

lisp/emacs-lisp/cl-generic.el

index b3c127f48f748c332dc1a13a458b36198c676e52..24a04d445ded070d7ae9065282a64f17887f3852 100644 (file)
@@ -432,8 +432,10 @@ which case this method will be invoked when the argument is `eql' to VAL.
                           (> (cl--generic-generalizer-priority x)
                              (cl--generic-generalizer-priority y)))))))
         (setq i (1+ i))))
-    (if me (setcar me method)
-      (setf (cl--generic-method-table generic) (cons method mt)))
+    ;; We used to (setcar me method), but that can cause false positives in
+    ;; the hash-consing table of the method-builder (bug#20644).
+    ;; See the related FIXME in cl--generic-build-combined-method.
+    (setf (cl--generic-method-table generic) (cons method (delq (car me) mt)))
     (cl-pushnew `(cl-defmethod . (,(cl--generic-name generic) . ,specializers))
                 current-load-list :test #'equal)
     ;; FIXME: Try to avoid re-constructing a new function if the old one