]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix eieio vs cl-generic incompatibilities found in Rudel (bug#23947)
authorStefan Monnier <monnier@iro.umontreal.ca>
Thu, 14 Jul 2016 19:05:49 +0000 (15:05 -0400)
committerStefan Monnier <monnier@iro.umontreal.ca>
Thu, 14 Jul 2016 19:05:49 +0000 (15:05 -0400)
* lisp/emacs-lisp/cl-generic.el (cl-generic-apply): New function.
* lisp/emacs-lisp/eieio-compat.el (eieio--defmethod): Fix incorrect
mapping between cl-no-applicable-method and EIEIO's no-applicable-method.
* lisp/emacs-lisp/eieio-core.el (eieio--class-precedence-c3):
`class' is not a symbol but a class object.

lisp/emacs-lisp/cl-generic.el
lisp/emacs-lisp/eieio-compat.el
lisp/emacs-lisp/eieio-core.el

index e5bab8dba9957509fb0f68b87b2875ab155b14e2..4f263c6bb8d1e5c44b915a18c4a3b4c91aa81305 100644 (file)
@@ -671,6 +671,15 @@ FUN is the function that should be called when METHOD calls
           (setq fun (cl-generic-call-method generic method fun)))
         fun)))))
 
+(defun cl-generic-apply (generic args)
+  "Like `apply' but takes a cl-generic object rather than a function."
+  ;; Handy in cl-no-applicable-method, for example.
+  ;; In Common Lisp, generic-function objects are funcallable.  Ideally
+  ;; we'd want the same in Elisp, but it would either require using a very
+  ;; different (and less efficient) representation of cl--generic objects,
+  ;; or non-trivial changes in the general infrastructure (compiler and such).
+  (apply (cl--generic-name generic) args))
+
 (defun cl--generic-arg-specializer (method dispatch-arg)
   (or (if (integerp dispatch-arg)
           (nth dispatch-arg
index 6d4798b92f9b1397ef5a516bcc68c2c46492ed0a..6aba8a3acbd078c01e38fa55a777760d009e3a20 100644 (file)
@@ -188,7 +188,8 @@ Summary:
             (`no-applicable-method
              (setq method 'cl-no-applicable-method)
              (setq specializers `(generic ,@specializers))
-             (lambda (generic arg &rest args) (apply code arg generic args)))
+             (lambda (generic arg &rest args)
+               (apply code arg (cl--generic-name generic) (cons arg args))))
             (_ code))))
     (cl-generic-define-method
      method (unless (memq kind '(nil :primary)) (list kind))
index 631e4a437f2628a431a7a5548bfa91afc6d38573..223c2a69a629c8faac97780c71617c5b18f39e8d 100644 (file)
@@ -976,7 +976,7 @@ If a consistent order does not exist, signal an error."
 
 (defun eieio--class-precedence-c3 (class)
   "Return all parents of CLASS in c3 order."
-  (let ((parents (eieio--class-parents (cl--find-class class))))
+  (let ((parents (eieio--class-parents class)))
     (eieio--c3-merge-lists
      (list class)
      (append
@@ -1101,7 +1101,7 @@ method invocation orders of the involved classes."
   (list eieio--generic-subclass-generalizer))
 
 \f
-;;;### (autoloads nil "eieio-compat" "eieio-compat.el" "6aca3c1b5f751a01331761da45fc4f5c")
+;;;### (autoloads nil "eieio-compat" "eieio-compat.el" "dba4205b1a0d7133f1311d975b4d0ebe")
 ;;; Generated autoloads from eieio-compat.el
 
 (autoload 'eieio--defalias "eieio-compat" "\