mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-18 11:50:38 -08:00
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))
|
proposed-value))
|
||||||
(t
|
(t
|
||||||
proposed-value))))
|
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)
|
((stringp proposed-value)
|
||||||
;; Else, check for strings, remove properties.
|
;; Else, check for strings, remove properties.
|
||||||
|
|
|
||||||
|
|
@ -913,6 +913,25 @@ this object."
|
||||||
(object-write thing))
|
(object-write thing))
|
||||||
((consp thing)
|
((consp thing)
|
||||||
(eieio-list-prin1 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)
|
((eieio--class-p thing)
|
||||||
(princ (eieio--class-print-name thing)))
|
(princ (eieio--class-print-name thing)))
|
||||||
(t (prin1 thing))))
|
(t (prin1 thing))))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue