summaryrefslogtreecommitdiff
path: root/src/pdumper.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2020-08-11 02:16:54 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2020-08-11 02:27:44 -0700
commit25b416888847db26fa6de2e64d628851a275e10c (patch)
tree6f2cd5b0d009f20e096f96b6e4f5948ddd797704 /src/pdumper.c
parent53132c1639beb2fc8687d88a6e17fffa4216b440 (diff)
downloademacs-25b416888847db26fa6de2e64d628851a275e10c.tar.gz
pdumper avoid listing hash table contents
* src/pdumper.c (hash_table_contents): Create a vector directly, instead of creating a list and then converting that to a vector.
Diffstat (limited to 'src/pdumper.c')
-rw-r--r--src/pdumper.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/src/pdumper.c b/src/pdumper.c
index bc9d197ca23..94921dc9ea1 100644
--- a/src/pdumper.c
+++ b/src/pdumper.c
@@ -2617,25 +2617,28 @@ hash_table_contents (struct Lisp_Hash_Table *h)
{
if (h->test.hashfn == hashfn_user_defined)
error ("cannot dump hash tables with user-defined tests"); /* Bug#36769 */
- Lisp_Object contents = Qnil;
+
+ ptrdiff_t size = HASH_TABLE_SIZE (h);
+ Lisp_Object key_and_value = make_uninit_vector (2 * size);
+ ptrdiff_t n = 0;
/* Make sure key_and_value ends up in the same order; charset.c
relies on it by expecting hash table indices to stay constant
across the dump. */
- for (ptrdiff_t i = 0; i < HASH_TABLE_SIZE (h) - h->count; i++)
- {
- dump_push (&contents, Qnil);
- dump_push (&contents, Qunbound);
- }
-
- for (ptrdiff_t i = HASH_TABLE_SIZE (h) - 1; i >= 0; --i)
+ for (ptrdiff_t i = 0; i < size; i++)
if (!NILP (HASH_HASH (h, i)))
{
- dump_push (&contents, HASH_VALUE (h, i));
- dump_push (&contents, HASH_KEY (h, i));
+ ASET (key_and_value, n++, HASH_KEY (h, i));
+ ASET (key_and_value, n++, HASH_VALUE (h, i));
}
- return CALLN (Fapply, Qvector, contents);
+ while (n < 2 * size)
+ {
+ ASET (key_and_value, n++, Qunbound);
+ ASET (key_and_value, n++, Qnil);
+ }
+
+ return key_and_value;
}
static dump_off