diff options
author | Vitalie Spinu <spinuvit@gmail.com> | 2019-05-08 11:12:29 +0200 |
---|---|---|
committer | Vitalie Spinu <spinuvit@gmail.com> | 2019-05-08 11:12:29 +0200 |
commit | 1c6484e975e8b0e50d22980d02a3be6c9bf93b49 (patch) | |
tree | 468e78c685dacbf98d84e7c8a76762ae03c31622 /lisp/emacs-lisp/eieio-base.el | |
parent | 37436fe6d32539b03d1c4dbd535d5409bef5ac09 (diff) | |
download | emacs-1c6484e975e8b0e50d22980d02a3be6c9bf93b49.tar.gz emacs-1c6484e975e8b0e50d22980d02a3be6c9bf93b49.tar.bz2 emacs-1c6484e975e8b0e50d22980d02a3be6c9bf93b49.zip |
Fix incorrect cloning of eieio-instance-inheritor objects (Bug#34840)
* lisp/emacs-lisp/eieio-base.el (clone): Unbound slots of
eieio-instance-inheritor objects as documented in the docs string
and implemented in the original eieio implementation.
Diffstat (limited to 'lisp/emacs-lisp/eieio-base.el')
-rw-r--r-- | lisp/emacs-lisp/eieio-base.el | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/lisp/emacs-lisp/eieio-base.el b/lisp/emacs-lisp/eieio-base.el index 3aeda92db12..62f4c82026e 100644 --- a/lisp/emacs-lisp/eieio-base.el +++ b/lisp/emacs-lisp/eieio-base.el @@ -64,10 +64,18 @@ SLOT-NAME is the offending slot. FN is the function signaling the error." ;; Throw the regular signal. (cl-call-next-method))) -(cl-defmethod clone ((obj eieio-instance-inheritor) &rest _params) +(cl-defmethod clone ((obj eieio-instance-inheritor) &rest params) "Clone OBJ, initializing `:parent' to OBJ. All slots are unbound, except those initialized with PARAMS." - (let ((nobj (cl-call-next-method))) + ;; call next method without params as we makeunbound slots anyhow + (let ((nobj (if (stringp (car params)) + (cl-call-next-method obj (pop params)) + (cl-call-next-method obj)))) + (dolist (descriptor (eieio-class-slots (class-of nobj))) + (let ((slot (eieio-slot-descriptor-name descriptor))) + (slot-makeunbound nobj slot))) + (when params + (shared-initialize nobj params)) (oset nobj parent-instance obj) nobj)) |