Function: cl--generic-build-combined-method

cl--generic-build-combined-method is a byte-compiled function defined in cl-generic.el.gz.

Signature

(cl--generic-build-combined-method GENERIC METHODS)

Source Code

;; Defined in /usr/src/emacs/lisp/emacs-lisp/cl-generic.el.gz
(defun cl--generic-build-combined-method (generic methods)
  ;; Since `cl-generic-combine-methods' is itself a generic function,
  ;; there is a chicken and egg problem when computing a combined
  ;; method for `cl-generic-combine-methods'.
  ;; We break such infinite recursion by detecting it and falling
  ;; back to `cl--generic-standard-method-combination' when it happens.
  ;; FIXME: Since the fields of `generic' are modified, the
  ;; `cl--generic-combined-method-memoization' hash-table won't work
  ;; right, because the hashes will change!  It's not terribly serious,
  ;; but reduces the effectiveness of the table.
  (let ((key (cons generic methods)))
    (pcase (gethash key cl--generic-combined-method-memoization)
      (:cl--generic--under-construction
       ;; Fallback to the standard method combination.
       (setf (gethash key cl--generic-combined-method-memoization)
             (cl--generic-standard-method-combination generic methods)))
      ('nil
       (setf (gethash key cl--generic-combined-method-memoization)
             :cl--generic--under-construction)
       (let ((f nil))
         (unwind-protect
             (setq f (cl-generic-combine-methods generic methods))
           (setf (gethash key cl--generic-combined-method-memoization) f))))
      (f f))))