[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
- scratch/hash-table-perf 3e9e68333ae 16/35: Remove rehash-threshold and rehash-size struct members, (continued)
- scratch/hash-table-perf 3e9e68333ae 16/35: Remove rehash-threshold and rehash-size struct members, Mattias Engdegård, 2024/01/04
- scratch/hash-table-perf 8e80d1930e3 20/35: Store hash values as EMACS_UINT instead of Lisp_Object, Mattias Engdegård, 2024/01/04
- scratch/hash-table-perf 05297736aa6 33/35: Adapt hash functions to produce a hash_hash_t eventually, Mattias Engdegård, 2024/01/04
- scratch/hash-table-perf 830838eb5f3 31/35: Use KEY=Qunbound instead of HASH=hash_unused for unused entries, Mattias Engdegård, 2024/01/04
- scratch/hash-table-perf 8b1b140bed9 32/35: * src/lisp.h (hash_hash_t): Change to uint32_t., Mattias Engdegård, 2024/01/04
- scratch/hash-table-perf 681a2877cc2 35/35: Hash-table documentation updates, Mattias Engdegård, 2024/01/04
- scratch/hash-table-perf d77c9540363 06/35: Refactor: extract hash computation to a function, Mattias Engdegård, 2024/01/04
- scratch/hash-table-perf e69035c6ef5 17/35: Leaner hash table dumping and thawing, Mattias Engdegård, 2024/01/04
- scratch/hash-table-perf 2d28042f56a 19/35: Use non-Lisp allocation for internal hash-table vectors, Mattias Engdegård, 2024/01/04
- scratch/hash-table-perf 1672d880e0c 29/35: Change hash_idx_t to int32_t on all platforms, Mattias Engdegård, 2024/01/04
- scratch/hash-table-perf 5cf627d70e1 30/35: Don't dump Qunbound,
Mattias Engdegård <=
- scratch/hash-table-perf ad3d2f8ed88 25/35: Share hash table test structs, Mattias Engdegård, 2024/01/04
- scratch/hash-table-perf 41e37c978e6 28/35: Rework index size and resize factor computations, Mattias Engdegård, 2024/01/04