diff options
| author | Paul Eggert | 2019-07-22 18:33:39 -0700 |
|---|---|---|
| committer | Paul Eggert | 2019-07-22 18:34:16 -0700 |
| commit | 3f4a9a5a3b267fbc13a8bebc4295bbfadd6ff03e (patch) | |
| tree | 27b50199a92bcfc6668f38a63e6b5d20cce2760a /src | |
| parent | c34496d0b956abc9d1ad55daa53ba626138233f4 (diff) | |
| download | emacs-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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/fns.c | 2 | ||||
| -rw-r--r-- | src/lisp.h | 1 | ||||
| -rw-r--r-- | src/pdumper.c | 2 |
3 files changed, 4 insertions, 1 deletions
| @@ -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 | ||
| 4020 | static Lisp_Object | 4020 | Lisp_Object |
| 4021 | hashfn_user_defined (Lisp_Object key, struct Lisp_Hash_Table *h) | 4021 | hashfn_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); | |||
| 3606 | EMACS_UINT sxhash (Lisp_Object, int); | 3606 | EMACS_UINT sxhash (Lisp_Object, int); |
| 3607 | Lisp_Object hashfn_eql (Lisp_Object, struct Lisp_Hash_Table *); | 3607 | Lisp_Object hashfn_eql (Lisp_Object, struct Lisp_Hash_Table *); |
| 3608 | Lisp_Object hashfn_equal (Lisp_Object, struct Lisp_Hash_Table *); | 3608 | Lisp_Object hashfn_equal (Lisp_Object, struct Lisp_Hash_Table *); |
| 3609 | Lisp_Object hashfn_user_defined (Lisp_Object, struct Lisp_Hash_Table *); | ||
| 3609 | Lisp_Object make_hash_table (struct hash_table_test, EMACS_INT, float, float, | 3610 | Lisp_Object make_hash_table (struct hash_table_test, EMACS_INT, float, float, |
| 3610 | Lisp_Object, bool); | 3611 | Lisp_Object, bool); |
| 3611 | ptrdiff_t hash_lookup (struct Lisp_Hash_Table *, Lisp_Object, Lisp_Object *); | 3612 | ptrdiff_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, | |||
| 2628 | static bool | 2628 | static bool |
| 2629 | dump_hash_table_stable_p (const struct Lisp_Hash_Table *hash) | 2629 | dump_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); |