Subject: bug#20914: eieio/slot/group

From: Pierre Lorenzon <[email-masked]>
Date: Mon, 29 Jun 2015 19:29:52 +0200 (CEST)

OK I got it !

The problem comes from use of `copy-sequence' in
`eieio-copy-parents-into-subclass' function of eieio-core. this
copy is not reccursive as explained in code comment but it
should be ! There's a joined patch that fixes the bug.

Regards

Pierre

--- 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)))