From e65e2bd0aacec14b8bc91d79c20eb802e013077a Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sat, 18 Dec 2021 23:05:26 -0500 Subject: [PATCH] * lisp/emacs-lisp/cl-generic.el (cl-generic--oclosure-generalizer): Fix precedence --- lisp/emacs-lisp/cl-generic.el | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lisp/emacs-lisp/cl-generic.el b/lisp/emacs-lisp/cl-generic.el index 072902f6af0..44018da30e1 100644 --- a/lisp/emacs-lisp/cl-generic.el +++ b/lisp/emacs-lisp/cl-generic.el @@ -1279,6 +1279,9 @@ Used internally for the (major-mode MODE) context specializers." ;;; Dispatch on OClosure type +;; It would make sense to put this into `oclosure.el' except that when +;; `oclosure.el' is loaded `cl-defmethod' is not available yet. + (defun cl--generic-oclosure-tag (name &rest _) `(oclosure-type ,name)) @@ -1289,7 +1292,11 @@ Used internally for the (major-mode MODE) context specializers." (cl--class-allparents class))))) (cl-generic-define-generalizer cl-generic--oclosure-generalizer - 50 #'cl--generic-oclosure-tag + ;; Give slightly higher priority than the struct specializer, so that + ;; for a generic function with methods dispatching structs and on OClosures, + ;; we first try `oclosure-type' before `type-of' since `type-of' will return + ;; non-nil for an OClosure as well. + 51 #'cl--generic-oclosure-tag #'cl-generic--oclosure-specializers) (cl-defmethod cl-generic-generalizers :extra "oclosure-struct" (type) -- 2.39.5