unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#9313: 24.0.50; Emacs 24 cannot load byte-compiled code from Emacs 23.3 when using EIEIO's defmethod
@ 2011-08-17 15:52 David Engster
  2011-08-22 21:47 ` Stefan Monnier
  0 siblings, 1 reply; 4+ messages in thread
From: David Engster @ 2011-08-17 15:52 UTC (permalink / raw)
  To: 9313

This is a very late followup to an older message from emacs-devel,
regarding the issue that Emacs24 after the lexbind merge cannot run
byte-compiled code from Emacs23.3 if that is using EIEIO's 'defmethod':

http://thread.gmane.org/gmane.emacs.devel/138030/focus=78338

In that message Stefan Monnier says that this is considered a bug, so
I'm writing this report. Also, this issue is popping up more frequently
now as people are migrating to Emacs24-bzr, but still have compiled Gnus
or CEDET sources with Emacs23, so I think this should be fixed before a
release.

Here's a recipe:

* Create a file ~/eieio-test/eieio-test.el with the following contents:

 (require 'eieio)

 (defclass someclass ()
   ((astring :initarg :astring
             :initform ""))
   "Some test class.")

 (defmethod somemethod ((arg someclass))
   "Some method."
   (message "Somemethod called."))

 (provide 'eieio-test)

* Byte-compile the file using Emacs 23.3:

  emacs23 --batch -f batch-byte-compile eieio-test.el

* Load Emacs24-bzr with

  emacs24 -Q -L ~/eieio-test

  and evaluate

  (require 'eieio-test)

* The following backtrace will appear:

Debugger entered--Lisp error: (void-function eieio-defmethod)
  (eieio-defmethod (quote somemethod) (quote (((arg someclass)) #[(arg) "\300\301!\207" [message "Somemethod called."] 2 "Some method."])))
  require(eieio-test)
  eval((require (quote eieio-test)) nil)


* Note that the following setups work:

  - Byte compile with Emacs23, require with Emacs23
  - Byte compile with Emacs24, require with Emacs24
  - Require uncompiled el-file.

* This issue is occuring since the lexbind merge.


Cheers,
David





^ permalink raw reply	[flat|nested] 4+ messages in thread

* bug#9313: 24.0.50; Emacs 24 cannot load byte-compiled code from Emacs 23.3 when using EIEIO's defmethod
  2011-08-17 15:52 bug#9313: 24.0.50; Emacs 24 cannot load byte-compiled code from Emacs 23.3 when using EIEIO's defmethod David Engster
@ 2011-08-22 21:47 ` Stefan Monnier
  2011-08-23 16:13   ` David Engster
  0 siblings, 1 reply; 4+ messages in thread
From: Stefan Monnier @ 2011-08-22 21:47 UTC (permalink / raw)
  To: David Engster; +Cc: 9313

> This is a very late followup to an older message from emacs-devel,
> regarding the issue that Emacs24 after the lexbind merge cannot run
> byte-compiled code from Emacs23.3 if that is using EIEIO's 'defmethod':

Does the patch below fix the problem for you?


        Stefan


=== modified file 'lisp/emacs-lisp/eieio.el'
--- lisp/emacs-lisp/eieio.el	2011-05-23 00:39:25 +0000
+++ lisp/emacs-lisp/eieio.el	2011-08-22 21:46:05 +0000
@@ -2864,6 +2864,106 @@
 )
 
 \f
+;;; Obsolete backward compatibility functions.
+;; Used to run byte-code compiled with Emacs-23.
+
+(defun eieio-defmethod (method args)
+  "Work part of the `defmethod' macro defining METHOD with ARGS."
+  (let ((key nil) (body nil) (firstarg nil) (argfix nil) (argclass nil) loopa)
+    ;; find optional keys
+    (setq key
+	  (cond ((or (eq ':BEFORE (car args))
+		     (eq ':before (car args)))
+		 (setq args (cdr args))
+		 method-before)
+		((or (eq ':AFTER (car args))
+		     (eq ':after (car args)))
+		 (setq args (cdr args))
+		 method-after)
+		((or (eq ':PRIMARY (car args))
+		     (eq ':primary (car args)))
+		 (setq args (cdr args))
+		 method-primary)
+		((or (eq ':STATIC (car args))
+		     (eq ':static (car args)))
+		 (setq args (cdr args))
+		 method-static)
+		;; Primary key
+		(t method-primary)))
+    ;; get body, and fix contents of args to be the arguments of the fn.
+    (setq body (cdr args)
+	  args (car args))
+    (setq loopa args)
+    ;; Create a fixed version of the arguments
+    (while loopa
+      (setq argfix (cons (if (listp (car loopa)) (car (car loopa)) (car loopa))
+			 argfix))
+      (setq loopa (cdr loopa)))
+    ;; make sure there is a generic
+    (eieio-defgeneric
+     method
+     (if (stringp (car body))
+	 (car body) (format "Generically created method `%s'." method)))
+    ;; create symbol for property to bind to.  If the first arg is of
+    ;; the form (varname vartype) and `vartype' is a class, then
+    ;; that class will be the type symbol.  If not, then it will fall
+    ;; under the type `primary' which is a non-specific calling of the
+    ;; function.
+    (setq firstarg (car args))
+    (if (listp firstarg)
+	(progn
+	  (setq argclass  (nth 1 firstarg))
+	  (if (not (class-p argclass))
+	      (error "Unknown class type %s in method parameters"
+		     (nth 1 firstarg))))
+      (if (= key -1)
+	  (signal 'wrong-type-argument (list :static 'non-class-arg)))
+      ;; generics are higher
+      (setq key (eieio-specialized-key-to-generic-key key)))
+    ;; Put this lambda into the symbol so we can find it
+    (if (byte-code-function-p (car-safe body))
+	(eieiomt-add method (car-safe body) key argclass)
+      (eieiomt-add method (append (list 'lambda (reverse argfix)) body)
+		   key argclass))
+    )
+
+  (when eieio-optimize-primary-methods-flag
+    ;; Optimizing step:
+    ;;
+    ;; If this method, after this setup, only has primary methods, then
+    ;; we can setup the generic that way.
+    (if (generic-primary-only-p method)
+	;; If there is only one primary method, then we can go one more
+	;; optimization step.
+	(if (generic-primary-only-one-p method)
+	    (eieio-defgeneric-reset-generic-form-primary-only-one method)
+	  (eieio-defgeneric-reset-generic-form-primary-only method))
+      (eieio-defgeneric-reset-generic-form method)))
+
+  method)
+(make-obsolete 'eieio-defmethod 'eieio--defmethod "24.1")
+
+(defun eieio-defgeneric (method doc-string)
+  "Engine part to `defgeneric' macro defining METHOD with DOC-STRING."
+  (if (and (fboundp method) (not (generic-p method))
+	   (or (byte-code-function-p (symbol-function method))
+	       (not (eq 'autoload (car (symbol-function method)))))
+	   )
+      (error "You cannot create a generic/method over an existing symbol: %s"
+	     method))
+  ;; Don't do this over and over.
+  (unless (fboundp 'method)
+    ;; This defun tells emacs where the first definition of this
+    ;; method is defined.
+    `(defun ,method nil)
+    ;; Make sure the method tables are installed.
+    (eieiomt-install method)
+    ;; Apply the actual body of this function.
+    (fset method (eieio-defgeneric-form method doc-string))
+    ;; Return the method
+    'method))
+(make-obsolete 'eieio-defgeneric nil "24.1")
+
 ;;; Interfacing with edebug
 ;;
 (defun eieio-edebug-prin1-to-string (object &optional noescape)






^ permalink raw reply	[flat|nested] 4+ messages in thread

* bug#9313: 24.0.50; Emacs 24 cannot load byte-compiled code from Emacs 23.3 when using EIEIO's defmethod
  2011-08-22 21:47 ` Stefan Monnier
@ 2011-08-23 16:13   ` David Engster
  2011-08-23 18:54     ` Stefan Monnier
  0 siblings, 1 reply; 4+ messages in thread
From: David Engster @ 2011-08-23 16:13 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 9313

Stefan Monnier writes:
>> This is a very late followup to an older message from emacs-devel,
>> regarding the issue that Emacs24 after the lexbind merge cannot run
>> byte-compiled code from Emacs23.3 if that is using EIEIO's 'defmethod':
>
> Does the patch below fix the problem for you?

Yes.

Thanks,
David





^ permalink raw reply	[flat|nested] 4+ messages in thread

* bug#9313: 24.0.50; Emacs 24 cannot load byte-compiled code from Emacs 23.3 when using EIEIO's defmethod
  2011-08-23 16:13   ` David Engster
@ 2011-08-23 18:54     ` Stefan Monnier
  0 siblings, 0 replies; 4+ messages in thread
From: Stefan Monnier @ 2011-08-23 18:54 UTC (permalink / raw)
  To: David Engster; +Cc: 9313-done

>>> This is a very late followup to an older message from emacs-devel,
>>> regarding the issue that Emacs24 after the lexbind merge cannot run
>>> byte-compiled code from Emacs23.3 if that is using EIEIO's 'defmethod':
>> Does the patch below fix the problem for you?
> Yes.

Thanks, installed,


        Stefan





^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2011-08-23 18:54 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-08-17 15:52 bug#9313: 24.0.50; Emacs 24 cannot load byte-compiled code from Emacs 23.3 when using EIEIO's defmethod David Engster
2011-08-22 21:47 ` Stefan Monnier
2011-08-23 16:13   ` David Engster
2011-08-23 18:54     ` Stefan Monnier

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).