diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2015-01-15 00:19:44 -0500 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2015-01-15 00:19:44 -0500 |
commit | 483c98a00d02197dd912d490daf9e521399d16a7 (patch) | |
tree | 3e29fcbfd2e94adaeea6d5faa82dfc369d4f94da /lisp/emacs-lisp/eieio-core.el | |
parent | 9def17e92bbb61e877bf092b562a92946cf43210 (diff) | |
download | emacs-483c98a00d02197dd912d490daf9e521399d16a7.tar.gz emacs-483c98a00d02197dd912d490daf9e521399d16a7.tar.bz2 emacs-483c98a00d02197dd912d490daf9e521399d16a7.zip |
* lisp/emacs-lisp/eieio-core.el: Provide support for cl-generic.
(eieio--generic-tagcode): New function.
(cl-generic-tagcode-function): Use it.
(eieio--generic-tag-types): New function.
(cl-generic-tag-types-function): Use it.
(eieio-object-p): Tighten up the test.
* lisp/emacs-lisp/cl-generic.el (cl-generic-define-method): Fix paren typo.
* test/automated/eieio-test-methodinvoke.el (eieio-test-method-store): Add
keysym arg instead of relying on internal var eieio--generic-call-key.
Update all callers.
(eieio-test-cl-generic-1): New tests.
Diffstat (limited to 'lisp/emacs-lisp/eieio-core.el')
-rw-r--r-- | lisp/emacs-lisp/eieio-core.el | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/lisp/emacs-lisp/eieio-core.el b/lisp/emacs-lisp/eieio-core.el index 0f2da634ff3..bfa922bade6 100644 --- a/lisp/emacs-lisp/eieio-core.el +++ b/lisp/emacs-lisp/eieio-core.el @@ -264,7 +264,7 @@ Return nil if that option doesn't exist." (defsubst eieio-object-p (obj) "Return non-nil if OBJ is an EIEIO object." - (and (arrayp obj) + (and (vectorp obj) (condition-case nil (eq (aref (eieio--object-class-object obj) 0) 'defclass) (error nil)))) @@ -1303,10 +1303,34 @@ method invocation orders of the involved classes." (define-error 'unbound-slot "Unbound slot") (define-error 'inconsistent-class-hierarchy "Inconsistent class hierarchy") +;;; Hooking into cl-generic. + +(require 'cl-generic) + +(add-function :before-until cl-generic-tagcode-function + #'eieio--generic-tagcode) +(defun eieio--generic-tagcode (type name) + ;; CLHS says: + ;; A class must be defined before it can be used as a parameter + ;; specializer in a defmethod form. + ;; So we can ignore types that are not known to denote classes. + (and (class-p type) + ;; Prefer (aref ,name 0) over (eieio--class-tag ,name) so that + ;; the tagcode is identical to the tagcode used for cl-struct. + `(50 . (and (vectorp ,name) (aref ,name 0))))) + +(add-function :before-until cl-generic-tag-types-function + #'eieio--generic-tag-types) +(defun eieio--generic-tag-types (tag) + (and (symbolp tag) (boundp tag) (eieio--class-p (symbol-value tag)) + (mapcar #'eieio--class-symbol + (eieio--class-precedence-list (symbol-value tag))))) + ;;; Backward compatibility functions ;; To support .elc files compiled for older versions of EIEIO. (defun eieio-defclass (cname superclasses slots options) + (declare (obsolete eieio-defclass-internal "25.1")) (eval `(defclass ,cname ,superclasses ,slots ,@options))) |