diff options
Diffstat (limited to 'lisp/emacs-lisp/cl-generic.el')
-rw-r--r-- | lisp/emacs-lisp/cl-generic.el | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/lisp/emacs-lisp/cl-generic.el b/lisp/emacs-lisp/cl-generic.el index 3aa26fba3c3..d1d57fe40bd 100644 --- a/lisp/emacs-lisp/cl-generic.el +++ b/lisp/emacs-lisp/cl-generic.el @@ -509,7 +509,7 @@ Presumes point is at the end of the `cl-defmethod' symbol." (let ((n 2)) (while (and (ignore-errors (forward-sexp 1) t) (not (eq (char-before) ?\)))) - (cl-incf n)) + (incf n)) n))) ;;;###autoload @@ -654,11 +654,7 @@ The set of acceptable TYPEs (also called \"specializers\") is defined (symbol-function sym))) ;; Prevent `defalias' from recording this as the definition site of ;; the generic function. - current-load-list - ;; BEWARE! Don't purify this function definition, since that leads - ;; to memory corruption if the hash-tables it holds are modified - ;; (the GC doesn't trace those pointers). - (purify-flag nil)) + current-load-list) (when (listp old-adv-cc) (set-advertised-calling-convention gfun old-adv-cc nil)) ;; But do use `defalias', so that it interacts properly with nadvice, @@ -1086,13 +1082,36 @@ MET-NAME is as returned by `cl--generic-load-hist-format'." nil t) (re-search-forward base-re nil t)))) -;; WORKAROUND: This can't be a defconst due to bug#21237. -(defvar cl--generic-find-defgeneric-regexp "(\\(?:cl-\\)?defgeneric[ \t]+%s\\_>") +(defun cl--generic-search-method-make-form-matcher (met-name) + (let ((name (car met-name)) + (qualifiers (cadr met-name)) + (specializers (cddr met-name))) + (lambda (form) + (pcase form + (`(cl-generic-define-method + (function ,(pred (eq name))) + (quote ,(and (pred listp) m-qualifiers)) + (quote ,(and (pred listp) m-args)) + ,_call-con + ,_function) + (ignore-errors + (let* ((m-spec-args (car (cl--generic-split-args m-args))) + (m-specializers + (mapcar (lambda (spec-arg) + (if (eq '&context (car-safe (car spec-arg))) + spec-arg (cdr spec-arg))) + m-spec-args))) + (and (equal qualifiers m-qualifiers) + (equal specializers m-specializers))))))))) + +(defconst cl--generic-find-defgeneric-regexp "(\\(?:cl-\\)?defgeneric[ \t]+%s\\_>") (with-eval-after-load 'find-func (defvar find-function-regexp-alist) (add-to-list 'find-function-regexp-alist - `(cl-defmethod . ,#'cl--generic-search-method)) + `(cl-defmethod + . (,#'cl--generic-search-method + . ,#'cl--generic-search-method-make-form-matcher))) (add-to-list 'find-function-regexp-alist '(cl-defgeneric . cl--generic-find-defgeneric-regexp))) |