From 7ad5d427730fea3865bc678c6673ffd58b6af653 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Mattias=20Engdeg=C3=A5rd?= Date: Wed, 22 Nov 2023 13:47:56 +0100 Subject: [PATCH] Don't dump Qunbound 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 | 1 + src/pdumper.c | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/fns.c b/src/fns.c index 3acbc7f86a1..b68fb393703 100644 --- 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++; diff --git a/src/pdumper.c b/src/pdumper.c index 13077526776..38682816f0a 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 -- 2.39.2