summaryrefslogtreecommitdiff
path: root/lisp
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-04-06 14:26:40 -0400
commit4161a368499a3326d13113aa5c6ab332047df767 (patch)
tree746dfeea7865cf48418c5444a2acadd29fbab16e /lisp
parent8c71ac606ec484d5e9cf967b41aadbddb5c8b694 (diff)
downloademacs-4161a368499a3326d13113aa5c6ab332047df767.tar.gz
emacs-4161a368499a3326d13113aa5c6ab332047df767.tar.bz2
emacs-4161a368499a3326d13113aa5c6ab332047df767.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. Backport from `master` (cherrypick from commit 61f8f7f68f).
Diffstat (limited to 'lisp')
-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 a7e24236a32..add8e7fda0c 100644
--- a/lisp/emacs-lisp/cl-generic.el
+++ b/lisp/emacs-lisp/cl-generic.el
@@ -602,7 +602,9 @@ The set of acceptable TYPEs (also called \"specializers\") is defined
(defun cl--generic-get-dispatcher (dispatch)
(cl--generic-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))