summaryrefslogtreecommitdiff
path: root/lisp/emacs-lisp/cl-generic.el
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2022-01-05 14:28:08 -0500
committerStefan Monnier <monnier@iro.umontreal.ca>2022-01-05 14:28:37 -0500
commit61f8f7f68f3bac5dc7ab41532902c480417552d8 (patch)
treecbdb4ac02a50b88d062764d9bcd6b0e1dd2de9f7 /lisp/emacs-lisp/cl-generic.el
parent2b59a425832f6f89bb6b1267812711bfcc7a16cd (diff)
downloademacs-61f8f7f68f3bac5dc7ab41532902c480417552d8.tar.gz
emacs-61f8f7f68f3bac5dc7ab41532902c480417552d8.tar.bz2
emacs-61f8f7f68f3bac5dc7ab41532902c480417552d8.zip
cl-generic.el: Fix bug#46722
Fix longstanding bug due to unexpected interference via side-effect. * lisp/emacs-lisp/cl-generic.el (cl--generic-get-dispatcher): Copy the `dispatch` arg before storing it into the hash-table.
Diffstat (limited to 'lisp/emacs-lisp/cl-generic.el')
-rw-r--r--lisp/emacs-lisp/cl-generic.el4
1 files changed, 3 insertions, 1 deletions
diff --git a/lisp/emacs-lisp/cl-generic.el b/lisp/emacs-lisp/cl-generic.el
index 983694204df..5090e060372 100644
--- a/lisp/emacs-lisp/cl-generic.el
+++ b/lisp/emacs-lisp/cl-generic.el
@@ -604,7 +604,9 @@ The set of acceptable TYPEs (also called \"specializers\") is defined
(defun cl--generic-get-dispatcher (dispatch)
(with-memoization
- (gethash dispatch cl--generic-dispatchers)
+ ;; We need `copy-sequence` here because this `dispatch' object might be
+ ;; modified by side-effect in `cl-generic-define-method' (bug#46722).
+ (gethash (copy-sequence dispatch) cl--generic-dispatchers)
;; (message "cl--generic-get-dispatcher (%S)" dispatch)
(let* ((dispatch-arg (car dispatch))
(generalizers (cdr dispatch))