]> git.eshelyaron.com Git - emacs.git/commitdiff
Handle hash tables and vectors when reading/writing EIEIO objects
authorEric Abrahamsen <eric@ericabrahamsen.net>
Tue, 5 Dec 2017 22:41:50 +0000 (14:41 -0800)
committerEric Abrahamsen <eric@ericabrahamsen.net>
Sat, 9 Dec 2017 16:55:58 +0000 (08:55 -0800)
* lisp/emacs-lisp/eieio.el (eieio-override-prin1): EIEIO objects
  printed with `prin1' can no longer be read with `read'. Make sure
  they are printed with object-write instead, even when they're inside
  hash tables and vectors.
* lisp/emacs-lisp/eieio-base.el (eieio-persistent-validate/fix-slot-value):
  Check for written representations of objects inside hash tables and
  vectors, and reconstruct them.

lisp/emacs-lisp/eieio-base.el
lisp/emacs-lisp/eieio.el

index f11056faecc27e8edef8cb9c6ee930a2fa31f5c8..a07e1f13acff985998bd3992a1b59957ad3f89ab 100644 (file)
@@ -354,6 +354,26 @@ Second, any text properties will be stripped from strings."
                   proposed-value))
                 (t
                  proposed-value))))
+        ;; For hash-tables and vectors, the top-level `read' will not
+        ;; "look inside" member values, so we need to do that
+        ;; explicitly.
+        ((hash-table-p proposed-value)
+         (maphash
+          (lambda (key value)
+            (when (class-p (car-safe value))
+              (setf (gethash key proposed-value)
+                    (eieio-persistent-convert-list-to-object
+                     value))))
+          proposed-value)
+         proposed-value)
+
+        ((vectorp proposed-value)
+         (dotimes (i (length proposed-value))
+           (when (class-p (car-safe (aref proposed-value i)))
+             (aset proposed-value i
+                   (eieio-persistent-convert-list-to-object
+                    (aref proposed-value i)))))
+         proposed-value)
 
         ((stringp proposed-value)
          ;; Else, check for strings, remove properties.
index 75f1097acf160e2cb029a94d5ab8f8592f5e5892..c73b7a8c3f10dee6f2841e61b890a598500677fc 100644 (file)
@@ -913,6 +913,25 @@ this object."
         (object-write thing))
        ((consp thing)
         (eieio-list-prin1 thing))
+       ((hash-table-p thing)
+         (let ((copy (copy-hash-table thing)))
+          (maphash
+           (lambda (key val)
+             (setf (gethash key copy)
+                   (read
+                    (with-output-to-string
+                      (eieio-override-prin1 val)))))
+           copy)
+          (prin1 copy)))
+       ((vectorp thing)
+         (let ((copy (copy-sequence thing)))
+         (dotimes (i (length copy))
+           (aset copy i
+                 (read
+                  (with-output-to-string
+                    (eieio-override-prin1
+                     (aref copy i))))))
+         (prin1 copy)))
        ((eieio--class-p thing)
         (princ (eieio--class-print-name thing)))
        (t (prin1 thing))))