--- eieio-core..orig.el 2015-06-28 07:26:49.000000000 +0200 +++ eieio-core.el 2015-06-29 19:20:28.000000000 +0200 @@ -660,9 +660,32 @@ (let ((pslots (eieio--class-slots pcv)) (pinit (eieio--class-initarg-tuples pcv))) (dotimes (i (length pslots)) - (let* ((sd (cl--copy-slot-descriptor (aref pslots i))) + ;;; -- Props should be copied as well + ;;; PLN Mon Jun 29 17:25:54 2015 + ;; + ;; Due to the way `cl--copy-slot-descriptor' acts + ;; props in the copied object will not be a new + ;; sequence but a reference to the parent + ;; sequence. Hence when modifying this sequence + ;; parent slot props will be altered as well : and it + ;; SHOULD NOT ! + ;; + (let* ((pslot (aref pslots i)) + (sd (cl--copy-slot-descriptor pslot)) (init (car (rassq (cl--slot-descriptor-name sd) pinit)))) + ;; + ;; Simply applying a `copy-sequence' on the props + ;; will not work since props itself is a sequence + ;; whose elements will not be copied and only + ;; reference elements of the old props plist. A + ;; reccursive copy should be performed. + ;; + (setf (cl--slot-descriptor-props sd) + (copy-tree + (cl--slot-descriptor-props pslot))) (eieio--add-new-slot newc sd init nil nil sn)) + ;; + ;;; -- End Props should be copied as well )) ;; while/let ;; Now duplicate all the class alloc slots. (let ((pcslots (eieio--class-class-slots pcv)))