>From 3f4a9a5a3b267fbc13a8bebc4295bbfadd6ff03e Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 22 Jul 2019 18:33:39 -0700 Subject: [PATCH] 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. --- src/fns.c | 2 +- src/lisp.h | 1 + src/pdumper.c | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/fns.c b/src/fns.c index 8eefa7c72b..734a2e253c 100644 --- 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 }; diff --git a/src/lisp.h b/src/lisp.h index 9d37629bc4..e96fcfe94d 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -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 *); diff --git a/src/pdumper.c b/src/pdumper.c index 2abac80a37..cda8b40be4 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -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); -- 2.17.1