* lisp/emacs-lisp/eieio.el: Improve `constructor' compatibility.

Fixes: debbugs:19620

(eieio-constructor): Handle obsolete object name argument here...
(defclass): ...instead of in the constructor here.

* test/automated/eieio-tests.el
(eieio-test-37-obsolete-name-in-constructor): New test.
This commit is contained in:
Stefan Monnier 2015-01-17 09:41:51 -05:00
parent d80fed0963
commit 4610ce96c1
5 changed files with 35 additions and 13 deletions

View file

@ -212,6 +212,7 @@ CLASS is a symbol." ;FIXME: Is it a vector or a symbol?
(defmacro class-constructor (class)
"Return the symbol representing the constructor of CLASS."
(declare (debug t))
;; FIXME: How/when would this not be a costly identity function?
`(eieio--class-symbol (eieio--class-v ,class)))
(defmacro eieio--class-option-assoc (list option)

View file

@ -276,12 +276,6 @@ and reference them using the function `class-option'."
`(defun ,name (&rest slots)
,(format "Create a new object with name NAME of class type %S."
name)
(if (and slots
(let ((x (car slots)))
(or (stringp x) (null x))))
(funcall (if eieio-backward-compatibility #'ignore #'message)
"Obsolete name %S passed to %S constructor"
(pop slots) ',name))
(apply #'eieio-constructor ',name slots))))))
@ -656,7 +650,14 @@ SLOTS are the initialization slots used by `shared-initialize'.
This static method is called when an object is constructed.
It allocates the vector used to represent an EIEIO object, and then
calls `shared-initialize' on that object."
(let* ((new-object (copy-sequence (eieio--class-default-object-cache (eieio--class-v class)))))
(let* ((new-object (copy-sequence (eieio--class-default-object-cache
(eieio--class-v class)))))
(if (and slots
(let ((x (car slots)))
(or (stringp x) (null x))))
(funcall (if eieio-backward-compatibility #'ignore #'message)
"Obsolete name %S passed to %S constructor"
(pop slots) class))
;; Call the initialize method on the new object with the slots
;; that were passed down to us.
(initialize-instance new-object slots)