]> git.eshelyaron.com Git - emacs.git/commitdiff
Allow zero hash table size
authorMattias Engdegård <mattiase@acm.org>
Sat, 4 Nov 2023 14:16:38 +0000 (15:16 +0100)
committerMattias Engdegård <mattiase@acm.org>
Sat, 13 Jan 2024 19:50:38 +0000 (20:50 +0100)
This avoids any extra allocation for such vectors, including empty
tables read by the Lisp reader, and provides extra safety essentially
for free.

* src/fns.c (make_hash_table): Allow tables to be 0-sized.  The index
will always have at least one entry, to avoid extra look-up costs.
* src/alloc.c (process_mark_stack): Don't mark pure objects,
because empty vectors are pure.

src/alloc.c
src/fns.c
src/lisp.h

index 17ed711a318f7968299c43cd9b0b6dd641ac2834..636b4972c848b70da5b4acfc9df435ca89963385 100644 (file)
@@ -7242,7 +7242,8 @@ process_mark_stack (ptrdiff_t base_sp)
                      eassert (h->next_weak == NULL);
                      h->next_weak = weak_hash_tables;
                      weak_hash_tables = h;
-                     set_vector_marked (XVECTOR (h->key_and_value));
+                     if (!PURE_P (h->key_and_value))
+                       set_vector_marked (XVECTOR (h->key_and_value));
                    }
                  break;
                }
index 74fdf29417e32eae9015490ad9f81df91a3371d3..a1659884b5ed7c9f03c3d5f725d27715ac1dfcec 100644 (file)
--- a/src/fns.c
+++ b/src/fns.c
@@ -4555,9 +4555,6 @@ make_hash_table (struct hash_table_test test, EMACS_INT size,
   eassert (SYMBOLP (test.name));
   eassert (0 <= size && size <= MOST_POSITIVE_FIXNUM);
 
-  if (size == 0)
-    size = 1;
-
   /* Allocate a table and initialize it.  */
   h = allocate_hash_table ();
 
@@ -4576,7 +4573,9 @@ make_hash_table (struct hash_table_test test, EMACS_INT size,
   /* Set up the free list.  */
   for (i = 0; i < size - 1; ++i)
     set_hash_next_slot (h, i, i + 1);
-  h->next_free = 0;
+  if (size > 0)
+    set_hash_next_slot (h, size - 1, -1);
+  h->next_free = size > 0 ? 0 : -1;
 
   XSET_HASH_TABLE (table, h);
   eassert (HASH_TABLE_P (table));
index d9b828b0328d15edce5099ae88c8009898c1a617..f863df6bca0a17f5b4502c7cbf87ddb2f25ee413 100644 (file)
@@ -2560,9 +2560,7 @@ HASH_HASH (const struct Lisp_Hash_Table *h, ptrdiff_t idx)
 INLINE ptrdiff_t
 HASH_TABLE_SIZE (const struct Lisp_Hash_Table *h)
 {
-  ptrdiff_t size = ASIZE (h->next);
-  eassume (0 < size);
-  return size;
+  return ASIZE (h->next);
 }
 
 /* Compute hash value for KEY in hash table H.  */