]> git.eshelyaron.com Git - emacs.git/commitdiff
Do not pdump user-defined hashtabs
authorPaul Eggert <eggert@cs.ucla.edu>
Tue, 23 Jul 2019 01:33:39 +0000 (18:33 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Tue, 23 Jul 2019 01:34:16 +0000 (18:34 -0700)
* src/pdumper.c (dump_hash_table_stable_p):
Signal an error if a hash table has user-defined tests (Bug#36769).
* src/fns.c (hashfn_user_defined): Now extern.

src/fns.c
src/lisp.h
src/pdumper.c

index 8eefa7c72b2ed061907da90e3d3d1592212338ad..734a2e253c73aa78407f998805e810ffcc7d0625 100644 (file)
--- a/src/fns.c
+++ b/src/fns.c
@@ -4017,7 +4017,7 @@ hashfn_eql (Lisp_Object key, struct Lisp_Hash_Table *h)
 /* Given HT, return a hash code for KEY which uses a user-defined
    function to compare keys.  */
 
-static Lisp_Object
+Lisp_Object
 hashfn_user_defined (Lisp_Object key, struct Lisp_Hash_Table *h)
 {
   Lisp_Object args[] = { h->test.user_hash_function, key };
index 9d37629bc46ba0aaa5e58caa2c18a9d6b59b6fe4..e96fcfe94d3568a19eabab6c3b4b24881a4b295f 100644 (file)
@@ -3606,6 +3606,7 @@ EMACS_UINT hash_string (char const *, ptrdiff_t);
 EMACS_UINT sxhash (Lisp_Object, int);
 Lisp_Object hashfn_eql (Lisp_Object, struct Lisp_Hash_Table *);
 Lisp_Object hashfn_equal (Lisp_Object, struct Lisp_Hash_Table *);
+Lisp_Object hashfn_user_defined (Lisp_Object, struct Lisp_Hash_Table *);
 Lisp_Object make_hash_table (struct hash_table_test, EMACS_INT, float, float,
                              Lisp_Object, bool);
 ptrdiff_t hash_lookup (struct Lisp_Hash_Table *, Lisp_Object, Lisp_Object *);
index 2abac80a37252661b21a516c3c040ad59b12ffcd..cda8b40be4c883b4c98b9e918e7c96f2b5b9f1e6 100644 (file)
@@ -2628,6 +2628,8 @@ dump_vectorlike_generic (struct dump_context *ctx,
 static bool
 dump_hash_table_stable_p (const struct Lisp_Hash_Table *hash)
 {
+  if (hash->test.hashfn == hashfn_user_defined)
+    error ("cannot dump hash tables with user-defined tests");  /* Bug#36769 */
   bool is_eql = hash->test.hashfn == hashfn_eql;
   bool is_equal = hash->test.hashfn == hashfn_equal;
   ptrdiff_t size = HASH_TABLE_SIZE (hash);