Handle hash tables and vectors when reading/writing EIEIO objects
* 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.
This commit is contained in:
parent
cda219c3df
commit
e1cc2037a9
2 changed files with 39 additions and 0 deletions
|
@ -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.
|
||||
|
|
|
@ -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))))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue