emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

scratch/hash-table-perf 5cf627d70e1 30/35: Don't dump Qunbound


From: Mattias Engdegård
Subject: scratch/hash-table-perf 5cf627d70e1 30/35: Don't dump Qunbound
Date: Thu, 4 Jan 2024 10:56:44 -0500 (EST)

branch: scratch/hash-table-perf
commit 5cf627d70e1a2b63851c705fdf2f591fccf81628
Author: Mattias Engdegård <mattiase@acm.org>
Commit: Mattias Engdegård <mattiase@acm.org>

    Don't dump Qunbound
    
    The dumper uses a hash table to keep track of dumped objects but
    since the hash tables use Qunbound to mark an unused entry, we don't
    dump it. 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     |  1 +
 src/pdumper.c | 19 ++++++++++++++++++-
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/src/fns.c b/src/fns.c
index 88919a904b6..af35bfdf4ab 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -4812,6 +4812,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++;
diff --git a/src/pdumper.c b/src/pdumper.c
index bc7d8fac5fe..3f6240a5076 100644
--- a/src/pdumper.c
+++ b/src/pdumper.c
@@ -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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]