diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2020-08-11 02:16:54 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2020-08-11 02:27:44 -0700 |
commit | 25b416888847db26fa6de2e64d628851a275e10c (patch) | |
tree | 6f2cd5b0d009f20e096f96b6e4f5948ddd797704 /src/pdumper.c | |
parent | 53132c1639beb2fc8687d88a6e17fffa4216b440 (diff) | |
download | emacs-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.c | 25 |
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 |