]> git.eshelyaron.com Git - emacs.git/commitdiff
Don't dump Qunbound
authorMattias Engdegård <mattiase@acm.org>
Wed, 22 Nov 2023 12:47:56 +0000 (13:47 +0100)
committerMattias Engdegård <mattiase@acm.org>
Sat, 13 Jan 2024 19:50:38 +0000 (20:50 +0100)
The dumper uses a hash table to keep track of dumped objects but as
this clashes with the use of Qunbound for marking unused hash table
entries, don't dump that value at all.  The symbol name is fixed up
after loading.

An alternative solution would be to use a different unique value for
unused entries.

* src/pdumper.c (dump_object_needs_dumping_p): Skip Qunbound.
(dump_vectorlike_generic): New function.
(pdumper_load): Call it.

src/fns.c
src/pdumper.c

index 3acbc7f86a1ce0082065d8a2b960db4cdad7e170..b68fb393703fde0088122c8ede19fb8047fd9821 100644 (file)
--- a/src/fns.c
+++ b/src/fns.c
@@ -4831,6 +4831,7 @@ ptrdiff_t
 hash_put (struct Lisp_Hash_Table *h, Lisp_Object key, Lisp_Object value,
          hash_hash_t hash)
 {
+  eassert (!BASE_EQ (key, Qunbound));
   /* Increment count after resizing because resizing may fail.  */
   maybe_resize_hash_table (h);
   h->count++;
index 1307752677669cbade1cd109019417f94c8fe3a8..38682816f0a26e28774b4ab0bc84c7b2bdfb36ea 100644 (file)
@@ -1337,7 +1337,9 @@ dump_object_needs_dumping_p (Lisp_Object object)
      included in the dump despite all references to them being
      bitwise-invariant.  */
   return (!dump_object_self_representing_p (object)
-         || dump_object_emacs_ptr (object));
+         || (dump_object_emacs_ptr (object)
+             /* Don't dump Qunbound -- it's not a legal hash table key.  */
+             && !BASE_EQ (object, Qunbound)));
 }
 
 static void
@@ -2551,6 +2553,19 @@ dump_symbol (struct dump_context *ctx,
   return offset;
 }
 
+/* Give Qunbound its name.
+   All other symbols are dumped and loaded but not Qunbound because it
+   cannot be used as a key in a hash table.
+   FIXME: A better solution would be to use a value other than Qunbound
+   as a marker for unused entries in hash tables.  */
+static void
+pdumper_init_symbol_unbound (void)
+{
+  eassert (NILP (SYMBOL_NAME (Qunbound)));
+  const char *name = "unbound";
+  init_symbol (Qunbound, make_pure_c_string (name, strlen (name)));
+}
+
 static dump_off
 dump_vectorlike_generic (struct dump_context *ctx,
                         const union vectorlike_header *header)
@@ -5749,6 +5764,8 @@ pdumper_load (const char *dump_filename, char *argv0)
   for (int i = 0; i < nr_dump_hooks; ++i)
     dump_hooks[i] ();
 
+  pdumper_init_symbol_unbound ();
+
 #ifdef HAVE_NATIVE_COMP
   pdumper_set_emacs_execdir (argv0);
 #else