>From 88d3e15f47b675d8d3fc922eb5a6ff7df8295b34 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 11 Aug 2020 02:16:54 -0700 Subject: [PATCH 7/7] 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. --- src/pdumper.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/pdumper.c b/src/pdumper.c index bc9d197ca2..94921dc9ea 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 -- 2.17.1