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.
This commit is contained in:
Vitalie Spinu 2019-05-08 11:12:29 +02:00
parent 37436fe6d3
commit 1c6484e975
2 changed files with 51 additions and 2 deletions

View file

@ -696,6 +696,17 @@ Do not override for `prot-2'."
(setq eitest-II3 (clone eitest-II2 "eitest-II3 Test."))
(oset eitest-II3 slot3 'penguin)
;; Test that slots are non-initialized slots are unbounded
(oref eitest-II2 slot1)
(should (slot-boundp eitest-II2 'slot1))
(should-not (slot-boundp eitest-II2 'slot2))
(should-not (slot-boundp eitest-II2 'slot3))
(should-not (slot-boundp eitest-II3 'slot2))
(should-not (slot-boundp eitest-II3 'slot1))
(should-not (slot-boundp eitest-II3 'slot2))
(should (eieio-instance-inheritor-slot-boundp eitest-II3 'slot2))
(should (slot-boundp eitest-II3 'slot3))
;; Test level 1 inheritance
(should (eq (oref eitest-II3 slot1) 'moose))
;; Test level 2 inheritance
@ -913,6 +924,36 @@ Subclasses to override slot attributes.")
(should (string= "aa-1" (oref D object-name)))
(should (string= "aa-2" (oref E object-name)))))
(defclass TII (eieio-instance-inheritor)
((a :initform 1 :initarg :a)
(b :initarg :b)
(c :initarg :c))
"Instance Inheritor test class.")
(ert-deftest eieio-test-39-clone-instance-inheritor-with-args ()
(let* ((A (TII))
(B (clone A :b "bb"))
(C (clone B :a "aa")))
(should (string= "aa" (oref C :a)))
(should (string= "bb" (oref C :b)))
(should (slot-boundp A :a))
(should-not (slot-boundp A :b))
(should-not (slot-boundp A :c))
(should-not (slot-boundp B :a))
(should (slot-boundp B :b))
(should-not (slot-boundp A :c))
(should (slot-boundp C :a))
(should-not (slot-boundp C :b))
(should-not (slot-boundp C :c))
(should (eieio-instance-inheritor-slot-boundp C :a))
(should (eieio-instance-inheritor-slot-boundp C :b))
(should-not (eieio-instance-inheritor-slot-boundp C :c))))
(provide 'eieio-tests)