]> git.eshelyaron.com Git - emacs.git/commitdiff
* lisp/emacs-lisp/cl-preloaded.el (cl-struct-define): Fix duplication
authorStefan Monnier <monnier@iro.umontreal.ca>
Tue, 21 Feb 2017 18:48:30 +0000 (13:48 -0500)
committerStefan Monnier <monnier@iro.umontreal.ca>
Tue, 21 Feb 2017 18:48:30 +0000 (13:48 -0500)
which resulted in incomplete list of parents in one copy of the
cl-structure-class class.

lisp/emacs-lisp/cl-preloaded.el

index 0b07941000239c0f500fa4a5eaac54fabbfb38d3..bba7b83a792df006209ea2d2b0d016880492e065 100644 (file)
     (add-to-list 'current-load-list `(define-type . ,name))
     (cl--struct-register-child parent-class tag)
     (unless (eq named t)
-      (eval `(defconst ,tag ',class) t)
+      ;; We used to use `defconst' instead of `set' but that
+      ;; has a side-effect of purecopying during the dump, so that the
+      ;; class object stored in the tag ends up being a *copy* of the
+      ;; one stored in the `cl--class' property!  We could have fixed
+      ;; this needless duplication by using the purecopied object, but
+      ;; that then breaks down a bit later when we modify the
+      ;; cl-structure-class class object to close the recursion
+      ;; between cl-structure-object and cl-structure-class (because
+      ;; modifying purecopied objects is not allowed.  Since this is
+      ;; done during dumping, we could relax this rule and allow the
+      ;; modification, but it's cumbersome).
+      ;; So in the end, it's easier to just avoid the duplication by
+      ;; avoiding the use of the purespace here.
+      (set tag class)
       ;; In the cl-generic support, we need to be able to check
       ;; if a vector is a cl-struct object, without knowing its particular type.
       ;; So we use the (otherwise) unused function slots of the tag symbol