Subject: bug#23947: closed (Re: bug#23947: Regression in EIEIO)

From: [email-masked] (GNU bug Tracking System)
Date: Thu, 14 Jul 2016 19:09:02 +0000

Your bug report

#23947: Regression in EIEIO

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
23947: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=23947
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#23947: Regression in EIEIO
From: Stefan Monnier <[email-masked]>
To: [email-masked]
Date: Thu, 14 Jul 2016 15:09:55 -0400
List-Id: <debbugs-submit.debbugs.gnu.org>

Version: 25.1

Installed, thanks,

        Stefan

Subject: Regression in EIEIO
From: Stefan Monnier <[email-masked]>
To: [email-masked]
Date: Mon, 11 Jul 2016 13:27:50 -0400
List-Id: <debbugs-submit.debbugs.gnu.org>

Package: Emacs
Version: 25.0.95

I finally tracked down why GNU ELPA's "rudel" package wasn't working
with Emacs-25, and it turns out to be a combination of two bugs
in the new EIEIO code.

Rudel seems to be the heaviest user of EIEIO so far (e.g. the only user
of the :c3 method invocation order, since the eieio-core code had
a plain bug which made it signal an error whenever that was used).

The patch below lets Rudel setup a shared buffer, so at least the core
functionality now works.  To my eyes, this is a very safe patch which
just fixes an incompatibility and an error I introduced in the new EIEIO
code when moving to cl-generic, so I think it should go to emacs-25.

Any objection?

        Stefan

2016-07-11  Stefan Monnier  <[email-masked]>

	* lisp/emacs-lisp/eieio-compat.el (eieio--defmethod): Better obey
	EIEIO's `no-applicable-method' calling convention.
	* lisp/emacs-lisp/eieio-core.el (eieio--class-precedence-c3): `class'
	is not a symbol but a class object.

diff --git a/lisp/emacs-lisp/eieio-compat.el b/lisp/emacs-lisp/eieio-compat.el
index 6d4798b..6aba8a3 100644
--- a/lisp/emacs-lisp/eieio-compat.el
+++ b/lisp/emacs-lisp/eieio-compat.el
@@ -188,7 +188,8 @@ eieio--defmethod
             (`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))
diff --git a/lisp/emacs-lisp/eieio-core.el b/lisp/emacs-lisp/eieio-core.el
index 631e4a4..223c2a6 100644
--- a/lisp/emacs-lisp/eieio-core.el
+++ b/lisp/emacs-lisp/eieio-core.el
@@ -976,7 +976,7 @@ eieio--class/struct-parents
 
 (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 @@ eieio--generic-subclass-specializers
   (list eieio--generic-subclass-generalizer))
 
 
-;;;### (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" "\