aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Eggert2019-07-22 18:33:39 -0700
committerPaul Eggert2019-07-22 18:34:16 -0700
commit3f4a9a5a3b267fbc13a8bebc4295bbfadd6ff03e (patch)
tree27b50199a92bcfc6668f38a63e6b5d20cce2760a
parentc34496d0b956abc9d1ad55daa53ba626138233f4 (diff)
downloademacs-3f4a9a5a3b267fbc13a8bebc4295bbfadd6ff03e.tar.gz
emacs-3f4a9a5a3b267fbc13a8bebc4295bbfadd6ff03e.zip
Do not pdump user-defined hashtabs
* 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.
-rw-r--r--src/fns.c2
-rw-r--r--src/lisp.h1
-rw-r--r--src/pdumper.c2
3 files changed, 4 insertions, 1 deletions
diff --git a/src/fns.c b/src/fns.c
index 8eefa7c72b2..734a2e253c7 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -4017,7 +4017,7 @@ hashfn_eql (Lisp_Object key, struct Lisp_Hash_Table *h)
4017/* Given HT, return a hash code for KEY which uses a user-defined 4017/* Given HT, return a hash code for KEY which uses a user-defined
4018 function to compare keys. */ 4018 function to compare keys. */
4019 4019
4020static Lisp_Object 4020Lisp_Object
4021hashfn_user_defined (Lisp_Object key, struct Lisp_Hash_Table *h) 4021hashfn_user_defined (Lisp_Object key, struct Lisp_Hash_Table *h)
4022{ 4022{
4023 Lisp_Object args[] = { h->test.user_hash_function, key }; 4023 Lisp_Object args[] = { h->test.user_hash_function, key };
diff --git a/src/lisp.h b/src/lisp.h
index 9d37629bc46..e96fcfe94d3 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -3606,6 +3606,7 @@ EMACS_UINT hash_string (char const *, ptrdiff_t);
3606EMACS_UINT sxhash (Lisp_Object, int); 3606EMACS_UINT sxhash (Lisp_Object, int);
3607Lisp_Object hashfn_eql (Lisp_Object, struct Lisp_Hash_Table *); 3607Lisp_Object hashfn_eql (Lisp_Object, struct Lisp_Hash_Table *);
3608Lisp_Object hashfn_equal (Lisp_Object, struct Lisp_Hash_Table *); 3608Lisp_Object hashfn_equal (Lisp_Object, struct Lisp_Hash_Table *);
3609Lisp_Object hashfn_user_defined (Lisp_Object, struct Lisp_Hash_Table *);
3609Lisp_Object make_hash_table (struct hash_table_test, EMACS_INT, float, float, 3610Lisp_Object make_hash_table (struct hash_table_test, EMACS_INT, float, float,
3610 Lisp_Object, bool); 3611 Lisp_Object, bool);
3611ptrdiff_t hash_lookup (struct Lisp_Hash_Table *, Lisp_Object, Lisp_Object *); 3612ptrdiff_t hash_lookup (struct Lisp_Hash_Table *, Lisp_Object, Lisp_Object *);
diff --git a/src/pdumper.c b/src/pdumper.c
index 2abac80a372..cda8b40be4c 100644
--- a/src/pdumper.c
+++ b/src/pdumper.c
@@ -2628,6 +2628,8 @@ dump_vectorlike_generic (struct dump_context *ctx,
2628static bool 2628static bool
2629dump_hash_table_stable_p (const struct Lisp_Hash_Table *hash) 2629dump_hash_table_stable_p (const struct Lisp_Hash_Table *hash)
2630{ 2630{
2631 if (hash->test.hashfn == hashfn_user_defined)
2632 error ("cannot dump hash tables with user-defined tests"); /* Bug#36769 */
2631 bool is_eql = hash->test.hashfn == hashfn_eql; 2633 bool is_eql = hash->test.hashfn == hashfn_eql;
2632 bool is_equal = hash->test.hashfn == hashfn_equal; 2634 bool is_equal = hash->test.hashfn == hashfn_equal;
2633 ptrdiff_t size = HASH_TABLE_SIZE (hash); 2635 ptrdiff_t size = HASH_TABLE_SIZE (hash);