summaryrefslogtreecommitdiff
path: root/lisp/emacs-lisp/cl-generic.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/emacs-lisp/cl-generic.el')
-rw-r--r--lisp/emacs-lisp/cl-generic.el37
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)))