aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Eggert2019-07-20 19:40:03 -0700
committerPaul Eggert2019-07-20 20:13:46 -0700
commitb6f194a0fb6dbd1b19aa01f95a955f5b8b23b40e (patch)
tree009e3beff4781c98e733657d60003b3eee97e068 /src
parent5018b663c6c0d31f27fb44630a69d9e0bd73273d (diff)
downloademacs-b6f194a0fb6dbd1b19aa01f95a955f5b8b23b40e.tar.gz
emacs-b6f194a0fb6dbd1b19aa01f95a955f5b8b23b40e.zip
Simplify hashfn/cmpfn calling convention
* src/fns.c (cmpfn_eql, cmpfn_equal, cmpfn_user_defined) (hashfn_eq, hashfn_equal, hashfn_eql, hashfn_user_defined): * src/profiler.c (cmpfn_profiler, hashfn_profiler): Use new calling convention where the return value is a fixnum instead of EMACS_UINT. While we’re at it, put the hash table at the end, since that’s a bit simpler and generates better code (at least on the x86-64). All callers changed. * src/fns.c (hash_lookup): Store fixnum rather than EMACS_UINT. All callers changed. (hash_put): Take a fixnum rather than an EMACS_UINT. All callers changed. Remove unnecessary eassert (XUFIXNUM does it). * src/lisp.h (struct hash_table_test): Adjust signatures of cmpfn and hashfn.
Diffstat (limited to 'src')
-rw-r--r--src/bytecode.c8
-rw-r--r--src/category.c9
-rw-r--r--src/charset.c2
-rw-r--r--src/composite.c5
-rw-r--r--src/emacs-module.c3
-rw-r--r--src/fns.c103
-rw-r--r--src/image.c3
-rw-r--r--src/json.c3
-rw-r--r--src/lisp.h12
-rw-r--r--src/lread.c3
-rw-r--r--src/macfont.m3
-rw-r--r--src/profiler.c34
12 files changed, 82 insertions, 106 deletions
diff --git a/src/bytecode.c b/src/bytecode.c
index 29dff44f007..e82de026a82 100644
--- a/src/bytecode.c
+++ b/src/bytecode.c
@@ -1409,16 +1409,16 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
1409 if (h->count <= 5) 1409 if (h->count <= 5)
1410 { /* Do a linear search if there are not many cases 1410 { /* Do a linear search if there are not many cases
1411 FIXME: 5 is arbitrarily chosen. */ 1411 FIXME: 5 is arbitrarily chosen. */
1412 Lisp_Object hash_code = h->test.cmpfn 1412 Lisp_Object hash_code
1413 ? make_fixnum (h->test.hashfn (&h->test, v1)) : Qnil; 1413 = h->test.cmpfn ? h->test.hashfn (v1, &h->test) : Qnil;
1414 1414
1415 for (i = h->count; 0 <= --i; ) 1415 for (i = h->count; 0 <= --i; )
1416 if (EQ (v1, HASH_KEY (h, i)) 1416 if (EQ (v1, HASH_KEY (h, i))
1417 || (h->test.cmpfn 1417 || (h->test.cmpfn
1418 && EQ (hash_code, HASH_HASH (h, i)) 1418 && EQ (hash_code, HASH_HASH (h, i))
1419 && h->test.cmpfn (&h->test, v1, HASH_KEY (h, i)))) 1419 && !NILP (h->test.cmpfn (v1, HASH_KEY (h, i),
1420 &h->test))))
1420 break; 1421 break;
1421
1422 } 1422 }
1423 else 1423 else
1424 i = hash_lookup (h, v1, NULL); 1424 i = hash_lookup (h, v1, NULL);
diff --git a/src/category.c b/src/category.c
index 132fae9d404..9e460cfc64e 100644
--- a/src/category.c
+++ b/src/category.c
@@ -48,18 +48,15 @@ bset_category_table (struct buffer *b, Lisp_Object val)
48static Lisp_Object 48static Lisp_Object
49hash_get_category_set (Lisp_Object table, Lisp_Object category_set) 49hash_get_category_set (Lisp_Object table, Lisp_Object category_set)
50{ 50{
51 struct Lisp_Hash_Table *h;
52 ptrdiff_t i;
53 EMACS_UINT hash;
54
55 if (NILP (XCHAR_TABLE (table)->extras[1])) 51 if (NILP (XCHAR_TABLE (table)->extras[1]))
56 set_char_table_extras 52 set_char_table_extras
57 (table, 1, 53 (table, 1,
58 make_hash_table (hashtest_equal, DEFAULT_HASH_SIZE, 54 make_hash_table (hashtest_equal, DEFAULT_HASH_SIZE,
59 DEFAULT_REHASH_SIZE, DEFAULT_REHASH_THRESHOLD, 55 DEFAULT_REHASH_SIZE, DEFAULT_REHASH_THRESHOLD,
60 Qnil, false)); 56 Qnil, false));
61 h = XHASH_TABLE (XCHAR_TABLE (table)->extras[1]); 57 struct Lisp_Hash_Table *h = XHASH_TABLE (XCHAR_TABLE (table)->extras[1]);
62 i = hash_lookup (h, category_set, &hash); 58 Lisp_Object hash;
59 ptrdiff_t i = hash_lookup (h, category_set, &hash);
63 if (i >= 0) 60 if (i >= 0)
64 return HASH_KEY (h, i); 61 return HASH_KEY (h, i);
65 hash_put (h, category_set, Qnil, hash); 62 hash_put (h, category_set, Qnil, hash);
diff --git a/src/charset.c b/src/charset.c
index 85535e8bff1..8c54381dc48 100644
--- a/src/charset.c
+++ b/src/charset.c
@@ -842,7 +842,7 @@ usage: (define-charset-internal ...) */)
842 /* Charset attr vector. */ 842 /* Charset attr vector. */
843 Lisp_Object attrs; 843 Lisp_Object attrs;
844 Lisp_Object val; 844 Lisp_Object val;
845 EMACS_UINT hash_code; 845 Lisp_Object hash_code;
846 struct Lisp_Hash_Table *hash_table = XHASH_TABLE (Vcharset_hash_table); 846 struct Lisp_Hash_Table *hash_table = XHASH_TABLE (Vcharset_hash_table);
847 int i, j; 847 int i, j;
848 struct charset charset; 848 struct charset charset;
diff --git a/src/composite.c b/src/composite.c
index 183062de460..c36663f8e97 100644
--- a/src/composite.c
+++ b/src/composite.c
@@ -164,11 +164,10 @@ ptrdiff_t
164get_composition_id (ptrdiff_t charpos, ptrdiff_t bytepos, ptrdiff_t nchars, 164get_composition_id (ptrdiff_t charpos, ptrdiff_t bytepos, ptrdiff_t nchars,
165 Lisp_Object prop, Lisp_Object string) 165 Lisp_Object prop, Lisp_Object string)
166{ 166{
167 Lisp_Object id, length, components, key, *key_contents; 167 Lisp_Object id, length, components, key, *key_contents, hash_code;
168 ptrdiff_t glyph_len; 168 ptrdiff_t glyph_len;
169 struct Lisp_Hash_Table *hash_table = XHASH_TABLE (composition_hash_table); 169 struct Lisp_Hash_Table *hash_table = XHASH_TABLE (composition_hash_table);
170 ptrdiff_t hash_index; 170 ptrdiff_t hash_index;
171 EMACS_UINT hash_code;
172 enum composition_method method; 171 enum composition_method method;
173 struct composition *cmp; 172 struct composition *cmp;
174 ptrdiff_t i; 173 ptrdiff_t i;
@@ -656,7 +655,7 @@ composition_gstring_put_cache (Lisp_Object gstring, ptrdiff_t len)
656 struct Lisp_Hash_Table *h = XHASH_TABLE (gstring_hash_table); 655 struct Lisp_Hash_Table *h = XHASH_TABLE (gstring_hash_table);
657 hash_rehash_if_needed (h); 656 hash_rehash_if_needed (h);
658 Lisp_Object header = LGSTRING_HEADER (gstring); 657 Lisp_Object header = LGSTRING_HEADER (gstring);
659 EMACS_UINT hash = h->test.hashfn (&h->test, header); 658 Lisp_Object hash = h->test.hashfn (header, &h->test);
660 if (len < 0) 659 if (len < 0)
661 { 660 {
662 ptrdiff_t glyph_len = LGSTRING_GLYPH_LEN (gstring); 661 ptrdiff_t glyph_len = LGSTRING_GLYPH_LEN (gstring);
diff --git a/src/emacs-module.c b/src/emacs-module.c
index 8c09ea6bb6c..4b991a1c744 100644
--- a/src/emacs-module.c
+++ b/src/emacs-module.c
@@ -362,8 +362,7 @@ module_make_global_ref (emacs_env *env, emacs_value ref)
362{ 362{
363 MODULE_FUNCTION_BEGIN (NULL); 363 MODULE_FUNCTION_BEGIN (NULL);
364 struct Lisp_Hash_Table *h = XHASH_TABLE (Vmodule_refs_hash); 364 struct Lisp_Hash_Table *h = XHASH_TABLE (Vmodule_refs_hash);
365 Lisp_Object new_obj = value_to_lisp (ref); 365 Lisp_Object new_obj = value_to_lisp (ref), hashcode;
366 EMACS_UINT hashcode;
367 ptrdiff_t i = hash_lookup (h, new_obj, &hashcode); 366 ptrdiff_t i = hash_lookup (h, new_obj, &hashcode);
368 367
369 if (i >= 0) 368 if (i >= 0)
diff --git a/src/fns.c b/src/fns.c
index d4f6842f276..d9503c491eb 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -2373,7 +2373,7 @@ internal_equal (Lisp_Object o1, Lisp_Object o2, enum equal_kind equal_kind,
2373 case Lisp_Cons: case Lisp_Vectorlike: 2373 case Lisp_Cons: case Lisp_Vectorlike:
2374 { 2374 {
2375 struct Lisp_Hash_Table *h = XHASH_TABLE (ht); 2375 struct Lisp_Hash_Table *h = XHASH_TABLE (ht);
2376 EMACS_UINT hash; 2376 Lisp_Object hash;
2377 ptrdiff_t i = hash_lookup (h, o1, &hash); 2377 ptrdiff_t i = hash_lookup (h, o1, &hash);
2378 if (i >= 0) 2378 if (i >= 0)
2379 { /* `o1' was seen already. */ 2379 { /* `o1' was seen already. */
@@ -3934,74 +3934,67 @@ HASH_INDEX (struct Lisp_Hash_Table *h, ptrdiff_t idx)
3934/* Ignore HT and compare KEY1 and KEY2 using 'eql'. 3934/* Ignore HT and compare KEY1 and KEY2 using 'eql'.
3935 Value is true if KEY1 and KEY2 are the same. */ 3935 Value is true if KEY1 and KEY2 are the same. */
3936 3936
3937static bool 3937static Lisp_Object
3938cmpfn_eql (struct hash_table_test *ht, 3938cmpfn_eql (Lisp_Object key1, Lisp_Object key2, struct hash_table_test *ht)
3939 Lisp_Object key1,
3940 Lisp_Object key2)
3941{ 3939{
3942 return !NILP (Feql (key1, key2)); 3940 return Feql (key1, key2);
3943} 3941}
3944 3942
3945/* Ignore HT and compare KEY1 and KEY2 using 'equal'. 3943/* Ignore HT and compare KEY1 and KEY2 using 'equal'.
3946 Value is true if KEY1 and KEY2 are the same. */ 3944 Value is true if KEY1 and KEY2 are the same. */
3947 3945
3948static bool 3946static Lisp_Object
3949cmpfn_equal (struct hash_table_test *ht, 3947cmpfn_equal (Lisp_Object key1, Lisp_Object key2, struct hash_table_test *ht)
3950 Lisp_Object key1,
3951 Lisp_Object key2)
3952{ 3948{
3953 return !NILP (Fequal (key1, key2)); 3949 return Fequal (key1, key2);
3954} 3950}
3955 3951
3956 3952
3957/* Given HT, compare KEY1 and KEY2 using HT->user_cmp_function. 3953/* Given HT, compare KEY1 and KEY2 using HT->user_cmp_function.
3958 Value is true if KEY1 and KEY2 are the same. */ 3954 Value is true if KEY1 and KEY2 are the same. */
3959 3955
3960static bool 3956static Lisp_Object
3961cmpfn_user_defined (struct hash_table_test *ht, 3957cmpfn_user_defined (Lisp_Object key1, Lisp_Object key2,
3962 Lisp_Object key1, 3958 struct hash_table_test *ht)
3963 Lisp_Object key2)
3964{ 3959{
3965 return !NILP (call2 (ht->user_cmp_function, key1, key2)); 3960 return call2 (ht->user_cmp_function, key1, key2);
3966} 3961}
3967 3962
3968/* Ignore HT and return a hash code for KEY which uses 'eq' to compare keys. 3963/* Ignore HT and return a hash code for KEY which uses 'eq' to compare
3969 The hash code is at most INTMASK. */ 3964 keys. */
3970 3965
3971static EMACS_UINT 3966static Lisp_Object
3972hashfn_eq (struct hash_table_test *ht, Lisp_Object key) 3967hashfn_eq (Lisp_Object key, struct hash_table_test *ht)
3973{ 3968{
3974 return XHASH (key) ^ XTYPE (key); 3969 return make_fixnum (XHASH (key) ^ XTYPE (key));
3975} 3970}
3976 3971
3977/* Ignore HT and return a hash code for KEY which uses 'equal' to compare keys. 3972/* Ignore HT and return a hash code for KEY which uses 'equal' to compare keys.
3978 The hash code is at most INTMASK. */ 3973 The hash code is at most INTMASK. */
3979 3974
3980EMACS_UINT 3975Lisp_Object
3981hashfn_equal (struct hash_table_test *ht, Lisp_Object key) 3976hashfn_equal (Lisp_Object key, struct hash_table_test *ht)
3982{ 3977{
3983 return sxhash (key, 0); 3978 return make_fixnum (sxhash (key, 0));
3984} 3979}
3985 3980
3986/* Ignore HT and return a hash code for KEY which uses 'eql' to compare keys. 3981/* Ignore HT and return a hash code for KEY which uses 'eql' to compare keys.
3987 The hash code is at most INTMASK. */ 3982 The hash code is at most INTMASK. */
3988 3983
3989EMACS_UINT 3984Lisp_Object
3990hashfn_eql (struct hash_table_test *ht, Lisp_Object key) 3985hashfn_eql (Lisp_Object key, struct hash_table_test *ht)
3991{ 3986{
3992 return ((FLOATP (key) || BIGNUMP (key)) 3987 return (FLOATP (key) || BIGNUMP (key) ? hashfn_equal : hashfn_eq) (key, ht);
3993 ? hashfn_equal (ht, key)
3994 : hashfn_eq (ht, key));
3995} 3988}
3996 3989
3997/* Given HT, return a hash code for KEY which uses a user-defined 3990/* Given HT, return a hash code for KEY which uses a user-defined
3998 function to compare keys. The hash code is at most INTMASK. */ 3991 function to compare keys. */
3999 3992
4000static EMACS_UINT 3993static Lisp_Object
4001hashfn_user_defined (struct hash_table_test *ht, Lisp_Object key) 3994hashfn_user_defined (Lisp_Object key, struct hash_table_test *ht)
4002{ 3995{
4003 Lisp_Object hash = call1 (ht->user_hash_function, key); 3996 Lisp_Object hash = call1 (ht->user_hash_function, key);
4004 return hashfn_eq (ht, hash); 3997 return hashfn_eq (hash, ht);
4005} 3998}
4006 3999
4007struct hash_table_test const 4000struct hash_table_test const
@@ -4224,8 +4217,8 @@ hash_table_rehash (struct Lisp_Hash_Table *h)
4224 if (!NILP (HASH_HASH (h, i))) 4217 if (!NILP (HASH_HASH (h, i)))
4225 { 4218 {
4226 Lisp_Object key = HASH_KEY (h, i); 4219 Lisp_Object key = HASH_KEY (h, i);
4227 EMACS_UINT hash_code = h->test.hashfn (&h->test, key); 4220 Lisp_Object hash_code = h->test.hashfn (key, &h->test);
4228 set_hash_hash_slot (h, i, make_fixnum (hash_code)); 4221 set_hash_hash_slot (h, i, hash_code);
4229 } 4222 }
4230 4223
4231 /* Reset the index so that any slot we don't fill below is marked 4224 /* Reset the index so that any slot we don't fill below is marked
@@ -4256,25 +4249,23 @@ hash_table_rehash (struct Lisp_Hash_Table *h)
4256 matching KEY, or -1 if not found. */ 4249 matching KEY, or -1 if not found. */
4257 4250
4258ptrdiff_t 4251ptrdiff_t
4259hash_lookup (struct Lisp_Hash_Table *h, Lisp_Object key, EMACS_UINT *hash) 4252hash_lookup (struct Lisp_Hash_Table *h, Lisp_Object key, Lisp_Object *hash)
4260{ 4253{
4261 EMACS_UINT hash_code;
4262 ptrdiff_t start_of_bucket, i; 4254 ptrdiff_t start_of_bucket, i;
4263 4255
4264 hash_rehash_if_needed (h); 4256 hash_rehash_if_needed (h);
4265 4257
4266 hash_code = h->test.hashfn (&h->test, key); 4258 Lisp_Object hash_code = h->test.hashfn (key, &h->test);
4267 eassert ((hash_code & ~INTMASK) == 0);
4268 if (hash) 4259 if (hash)
4269 *hash = hash_code; 4260 *hash = hash_code;
4270 4261
4271 start_of_bucket = hash_code % ASIZE (h->index); 4262 start_of_bucket = XUFIXNUM (hash_code) % ASIZE (h->index);
4272 4263
4273 for (i = HASH_INDEX (h, start_of_bucket); 0 <= i; i = HASH_NEXT (h, i)) 4264 for (i = HASH_INDEX (h, start_of_bucket); 0 <= i; i = HASH_NEXT (h, i))
4274 if (EQ (key, HASH_KEY (h, i)) 4265 if (EQ (key, HASH_KEY (h, i))
4275 || (h->test.cmpfn 4266 || (h->test.cmpfn
4276 && hash_code == XUFIXNUM (HASH_HASH (h, i)) 4267 && EQ (hash_code, HASH_HASH (h, i))
4277 && h->test.cmpfn (&h->test, key, HASH_KEY (h, i)))) 4268 && !NILP (h->test.cmpfn (key, HASH_KEY (h, i), &h->test))))
4278 break; 4269 break;
4279 4270
4280 return i; 4271 return i;
@@ -4287,14 +4278,12 @@ hash_lookup (struct Lisp_Hash_Table *h, Lisp_Object key, EMACS_UINT *hash)
4287 4278
4288ptrdiff_t 4279ptrdiff_t
4289hash_put (struct Lisp_Hash_Table *h, Lisp_Object key, Lisp_Object value, 4280hash_put (struct Lisp_Hash_Table *h, Lisp_Object key, Lisp_Object value,
4290 EMACS_UINT hash) 4281 Lisp_Object hash)
4291{ 4282{
4292 ptrdiff_t start_of_bucket, i; 4283 ptrdiff_t start_of_bucket, i;
4293 4284
4294 hash_rehash_if_needed (h); 4285 hash_rehash_if_needed (h);
4295 4286
4296 eassert ((hash & ~INTMASK) == 0);
4297
4298 /* Increment count after resizing because resizing may fail. */ 4287 /* Increment count after resizing because resizing may fail. */
4299 maybe_resize_hash_table (h); 4288 maybe_resize_hash_table (h);
4300 h->count++; 4289 h->count++;
@@ -4306,10 +4295,10 @@ hash_put (struct Lisp_Hash_Table *h, Lisp_Object key, Lisp_Object value,
4306 set_hash_value_slot (h, i, value); 4295 set_hash_value_slot (h, i, value);
4307 4296
4308 /* Remember its hash code. */ 4297 /* Remember its hash code. */
4309 set_hash_hash_slot (h, i, make_fixnum (hash)); 4298 set_hash_hash_slot (h, i, hash);
4310 4299
4311 /* Add new entry to its collision chain. */ 4300 /* Add new entry to its collision chain. */
4312 start_of_bucket = hash % ASIZE (h->index); 4301 start_of_bucket = XUFIXNUM (hash) % ASIZE (h->index);
4313 set_hash_next_slot (h, i, HASH_INDEX (h, start_of_bucket)); 4302 set_hash_next_slot (h, i, HASH_INDEX (h, start_of_bucket));
4314 set_hash_index_slot (h, start_of_bucket, i); 4303 set_hash_index_slot (h, start_of_bucket, i);
4315 return i; 4304 return i;
@@ -4321,9 +4310,8 @@ hash_put (struct Lisp_Hash_Table *h, Lisp_Object key, Lisp_Object value,
4321void 4310void
4322hash_remove_from_table (struct Lisp_Hash_Table *h, Lisp_Object key) 4311hash_remove_from_table (struct Lisp_Hash_Table *h, Lisp_Object key)
4323{ 4312{
4324 EMACS_UINT hash_code = h->test.hashfn (&h->test, key); 4313 Lisp_Object hash_code = h->test.hashfn (key, &h->test);
4325 eassert ((hash_code & ~INTMASK) == 0); 4314 ptrdiff_t start_of_bucket = XUFIXNUM (hash_code) % ASIZE (h->index);
4326 ptrdiff_t start_of_bucket = hash_code % ASIZE (h->index);
4327 ptrdiff_t prev = -1; 4315 ptrdiff_t prev = -1;
4328 4316
4329 hash_rehash_if_needed (h); 4317 hash_rehash_if_needed (h);
@@ -4334,8 +4322,8 @@ hash_remove_from_table (struct Lisp_Hash_Table *h, Lisp_Object key)
4334 { 4322 {
4335 if (EQ (key, HASH_KEY (h, i)) 4323 if (EQ (key, HASH_KEY (h, i))
4336 || (h->test.cmpfn 4324 || (h->test.cmpfn
4337 && hash_code == XUFIXNUM (HASH_HASH (h, i)) 4325 && EQ (hash_code, HASH_HASH (h, i))
4338 && h->test.cmpfn (&h->test, key, HASH_KEY (h, i)))) 4326 && !NILP (h->test.cmpfn (key, HASH_KEY (h, i), &h->test))))
4339 { 4327 {
4340 /* Take entry out of collision chain. */ 4328 /* Take entry out of collision chain. */
4341 if (prev < 0) 4329 if (prev < 0)
@@ -4685,7 +4673,7 @@ If (eq A B), then (= (sxhash-eq A) (sxhash-eq B)).
4685Hash codes are not guaranteed to be preserved across Emacs sessions. */) 4673Hash codes are not guaranteed to be preserved across Emacs sessions. */)
4686 (Lisp_Object obj) 4674 (Lisp_Object obj)
4687{ 4675{
4688 return make_fixnum (hashfn_eq (NULL, obj)); 4676 return hashfn_eq (obj, NULL);
4689} 4677}
4690 4678
4691DEFUN ("sxhash-eql", Fsxhash_eql, Ssxhash_eql, 1, 1, 0, 4679DEFUN ("sxhash-eql", Fsxhash_eql, Ssxhash_eql, 1, 1, 0,
@@ -4695,7 +4683,7 @@ If (eql A B), then (= (sxhash-eql A) (sxhash-eql B)).
4695Hash codes are not guaranteed to be preserved across Emacs sessions. */) 4683Hash codes are not guaranteed to be preserved across Emacs sessions. */)
4696 (Lisp_Object obj) 4684 (Lisp_Object obj)
4697{ 4685{
4698 return make_fixnum (hashfn_eql (NULL, obj)); 4686 return hashfn_eql (obj, NULL);
4699} 4687}
4700 4688
4701DEFUN ("sxhash-equal", Fsxhash_equal, Ssxhash_equal, 1, 1, 0, 4689DEFUN ("sxhash-equal", Fsxhash_equal, Ssxhash_equal, 1, 1, 0,
@@ -4705,7 +4693,7 @@ If (equal A B), then (= (sxhash-equal A) (sxhash-equal B)).
4705Hash codes are not guaranteed to be preserved across Emacs sessions. */) 4693Hash codes are not guaranteed to be preserved across Emacs sessions. */)
4706 (Lisp_Object obj) 4694 (Lisp_Object obj)
4707{ 4695{
4708 return make_fixnum (hashfn_equal (NULL, obj)); 4696 return hashfn_equal (obj, NULL);
4709} 4697}
4710 4698
4711DEFUN ("make-hash-table", Fmake_hash_table, Smake_hash_table, 0, MANY, 0, 4699DEFUN ("make-hash-table", Fmake_hash_table, Smake_hash_table, 0, MANY, 0,
@@ -4951,9 +4939,8 @@ VALUE. In any case, return VALUE. */)
4951 struct Lisp_Hash_Table *h = check_hash_table (table); 4939 struct Lisp_Hash_Table *h = check_hash_table (table);
4952 CHECK_IMPURE (table, h); 4940 CHECK_IMPURE (table, h);
4953 4941
4954 ptrdiff_t i; 4942 Lisp_Object hash;
4955 EMACS_UINT hash; 4943 ptrdiff_t i = hash_lookup (h, key, &hash);
4956 i = hash_lookup (h, key, &hash);
4957 if (i >= 0) 4944 if (i >= 0)
4958 set_hash_value_slot (h, i, value); 4945 set_hash_value_slot (h, i, value);
4959 else 4946 else
diff --git a/src/image.c b/src/image.c
index b081d4b9123..355c849491a 100644
--- a/src/image.c
+++ b/src/image.c
@@ -4606,8 +4606,7 @@ xpm_put_color_table_h (Lisp_Object color_table,
4606 Lisp_Object color) 4606 Lisp_Object color)
4607{ 4607{
4608 struct Lisp_Hash_Table *table = XHASH_TABLE (color_table); 4608 struct Lisp_Hash_Table *table = XHASH_TABLE (color_table);
4609 EMACS_UINT hash_code; 4609 Lisp_Object chars = make_unibyte_string (chars_start, chars_len), hash_code;
4610 Lisp_Object chars = make_unibyte_string (chars_start, chars_len);
4611 4610
4612 hash_lookup (table, chars, &hash_code); 4611 hash_lookup (table, chars, &hash_code);
4613 hash_put (table, chars, color, hash_code); 4612 hash_put (table, chars, color, hash_code);
diff --git a/src/json.c b/src/json.c
index 21c4b946b4e..d05f2c54e2c 100644
--- a/src/json.c
+++ b/src/json.c
@@ -867,8 +867,7 @@ json_to_lisp (json_t *json, struct json_configuration *conf)
867 json_t *value; 867 json_t *value;
868 json_object_foreach (json, key_str, value) 868 json_object_foreach (json, key_str, value)
869 { 869 {
870 Lisp_Object key = build_string_from_utf8 (key_str); 870 Lisp_Object key = build_string_from_utf8 (key_str), hash;
871 EMACS_UINT hash;
872 ptrdiff_t i = hash_lookup (h, key, &hash); 871 ptrdiff_t i = hash_lookup (h, key, &hash);
873 /* Keys in JSON objects are unique, so the key can't 872 /* Keys in JSON objects are unique, so the key can't
874 be present yet. */ 873 be present yet. */
diff --git a/src/lisp.h b/src/lisp.h
index 50a61cadd7b..e5edb8fd125 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -2237,10 +2237,10 @@ struct hash_table_test
2237 Lisp_Object user_cmp_function; 2237 Lisp_Object user_cmp_function;
2238 2238
2239 /* C function to compare two keys. */ 2239 /* C function to compare two keys. */
2240 bool (*cmpfn) (struct hash_table_test *t, Lisp_Object, Lisp_Object); 2240 Lisp_Object (*cmpfn) (Lisp_Object, Lisp_Object, struct hash_table_test *t);
2241 2241
2242 /* C function to compute hash code. */ 2242 /* C function to compute hash code. */
2243 EMACS_UINT (*hashfn) (struct hash_table_test *t, Lisp_Object); 2243 Lisp_Object (*hashfn) (Lisp_Object, struct hash_table_test *t);
2244}; 2244};
2245 2245
2246struct Lisp_Hash_Table 2246struct Lisp_Hash_Table
@@ -3591,13 +3591,13 @@ extern void hexbuf_digest (char *, void const *, int);
3591extern char *extract_data_from_object (Lisp_Object, ptrdiff_t *, ptrdiff_t *); 3591extern char *extract_data_from_object (Lisp_Object, ptrdiff_t *, ptrdiff_t *);
3592EMACS_UINT hash_string (char const *, ptrdiff_t); 3592EMACS_UINT hash_string (char const *, ptrdiff_t);
3593EMACS_UINT sxhash (Lisp_Object, int); 3593EMACS_UINT sxhash (Lisp_Object, int);
3594EMACS_UINT hashfn_eql (struct hash_table_test *ht, Lisp_Object key); 3594Lisp_Object hashfn_eql (Lisp_Object, struct hash_table_test *);
3595EMACS_UINT hashfn_equal (struct hash_table_test *ht, Lisp_Object key); 3595Lisp_Object hashfn_equal (Lisp_Object, struct hash_table_test *);
3596Lisp_Object make_hash_table (struct hash_table_test, EMACS_INT, float, float, 3596Lisp_Object make_hash_table (struct hash_table_test, EMACS_INT, float, float,
3597 Lisp_Object, bool); 3597 Lisp_Object, bool);
3598ptrdiff_t hash_lookup (struct Lisp_Hash_Table *, Lisp_Object, EMACS_UINT *); 3598ptrdiff_t hash_lookup (struct Lisp_Hash_Table *, Lisp_Object, Lisp_Object *);
3599ptrdiff_t hash_put (struct Lisp_Hash_Table *, Lisp_Object, Lisp_Object, 3599ptrdiff_t hash_put (struct Lisp_Hash_Table *, Lisp_Object, Lisp_Object,
3600 EMACS_UINT); 3600 Lisp_Object);
3601void hash_remove_from_table (struct Lisp_Hash_Table *, Lisp_Object); 3601void hash_remove_from_table (struct Lisp_Hash_Table *, Lisp_Object);
3602extern struct hash_table_test const hashtest_eq, hashtest_eql, hashtest_equal; 3602extern struct hash_table_test const hashtest_eq, hashtest_eql, hashtest_equal;
3603extern void validate_subarray (Lisp_Object, Lisp_Object, Lisp_Object, 3603extern void validate_subarray (Lisp_Object, Lisp_Object, Lisp_Object,
diff --git a/src/lread.c b/src/lread.c
index 3152fcf867d..eecb5e141df 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -3161,8 +3161,7 @@ read1 (Lisp_Object readcharfun, int *pch, bool first_in_list)
3161 Lisp_Object placeholder = Fcons (Qnil, Qnil); 3161 Lisp_Object placeholder = Fcons (Qnil, Qnil);
3162 struct Lisp_Hash_Table *h 3162 struct Lisp_Hash_Table *h
3163 = XHASH_TABLE (read_objects_map); 3163 = XHASH_TABLE (read_objects_map);
3164 EMACS_UINT hash; 3164 Lisp_Object number = make_fixnum (n), hash;
3165 Lisp_Object number = make_fixnum (n);
3166 3165
3167 ptrdiff_t i = hash_lookup (h, number, &hash); 3166 ptrdiff_t i = hash_lookup (h, number, &hash);
3168 if (i >= 0) 3167 if (i >= 0)
diff --git a/src/macfont.m b/src/macfont.m
index 301951f34a5..7170e801407 100644
--- a/src/macfont.m
+++ b/src/macfont.m
@@ -986,8 +986,7 @@ macfont_set_family_cache (Lisp_Object symbol, CFStringRef string)
986{ 986{
987 struct Lisp_Hash_Table *h; 987 struct Lisp_Hash_Table *h;
988 ptrdiff_t i; 988 ptrdiff_t i;
989 EMACS_UINT hash; 989 Lisp_Object hash, value;
990 Lisp_Object value;
991 990
992 if (!HASH_TABLE_P (macfont_family_cache)) 991 if (!HASH_TABLE_P (macfont_family_cache))
993 macfont_family_cache = CALLN (Fmake_hash_table, QCtest, Qeq); 992 macfont_family_cache = CALLN (Fmake_hash_table, QCtest, Qeq);
diff --git a/src/profiler.c b/src/profiler.c
index 87be30acc30..e9b6a37d06b 100644
--- a/src/profiler.c
+++ b/src/profiler.c
@@ -36,11 +36,9 @@ saturated_add (EMACS_INT a, EMACS_INT b)
36 36
37typedef struct Lisp_Hash_Table log_t; 37typedef struct Lisp_Hash_Table log_t;
38 38
39static bool cmpfn_profiler ( 39static Lisp_Object cmpfn_profiler (Lisp_Object, Lisp_Object,
40 struct hash_table_test *, Lisp_Object, Lisp_Object); 40 struct hash_table_test *);
41 41static Lisp_Object hashfn_profiler (Lisp_Object, struct hash_table_test *);
42static EMACS_UINT hashfn_profiler (
43 struct hash_table_test *, Lisp_Object);
44 42
45static const struct hash_table_test hashtest_profiler = 43static const struct hash_table_test hashtest_profiler =
46 { 44 {
@@ -165,7 +163,7 @@ record_backtrace (log_t *log, EMACS_INT count)
165 careful to avoid memory allocation since we're in a signal 163 careful to avoid memory allocation since we're in a signal
166 handler, and we optimize the code to try and avoid computing the 164 handler, and we optimize the code to try and avoid computing the
167 hash+lookup twice. See fns.c:Fputhash for reference. */ 165 hash+lookup twice. See fns.c:Fputhash for reference. */
168 EMACS_UINT hash; 166 Lisp_Object hash;
169 ptrdiff_t j = hash_lookup (log, backtrace, &hash); 167 ptrdiff_t j = hash_lookup (log, backtrace, &hash);
170 if (j >= 0) 168 if (j >= 0)
171 { 169 {
@@ -529,30 +527,30 @@ the same lambda expression, or are really unrelated function. */)
529 return res ? Qt : Qnil; 527 return res ? Qt : Qnil;
530} 528}
531 529
532static bool 530static Lisp_Object
533cmpfn_profiler (struct hash_table_test *t, 531cmpfn_profiler (Lisp_Object bt1, Lisp_Object bt2, struct hash_table_test *t)
534 Lisp_Object bt1, Lisp_Object bt2)
535{ 532{
536 if (VECTORP (bt1) && VECTORP (bt2)) 533 if (VECTORP (bt1) && VECTORP (bt2))
537 { 534 {
538 ptrdiff_t l = ASIZE (bt1); 535 ptrdiff_t l = ASIZE (bt1);
539 if (l != ASIZE (bt2)) 536 if (l != ASIZE (bt2))
540 return false; 537 return Qnil;
541 for (ptrdiff_t i = 0; i < l; i++) 538 for (ptrdiff_t i = 0; i < l; i++)
542 if (NILP (Ffunction_equal (AREF (bt1, i), AREF (bt2, i)))) 539 if (NILP (Ffunction_equal (AREF (bt1, i), AREF (bt2, i))))
543 return false; 540 return Qnil;
544 return true; 541 return Qt;
545 } 542 }
546 else 543 else
547 return EQ (bt1, bt2); 544 return EQ (bt1, bt2) ? Qt : Qnil;
548} 545}
549 546
550static EMACS_UINT 547static Lisp_Object
551hashfn_profiler (struct hash_table_test *ht, Lisp_Object bt) 548hashfn_profiler (Lisp_Object bt, struct hash_table_test *ht)
552{ 549{
550 EMACS_UINT hash;
553 if (VECTORP (bt)) 551 if (VECTORP (bt))
554 { 552 {
555 EMACS_UINT hash = 0; 553 hash = 0;
556 ptrdiff_t l = ASIZE (bt); 554 ptrdiff_t l = ASIZE (bt);
557 for (ptrdiff_t i = 0; i < l; i++) 555 for (ptrdiff_t i = 0; i < l; i++)
558 { 556 {
@@ -563,10 +561,10 @@ hashfn_profiler (struct hash_table_test *ht, Lisp_Object bt)
563 ? XHASH (XCDR (XCDR (f))) : XHASH (f)); 561 ? XHASH (XCDR (XCDR (f))) : XHASH (f));
564 hash = sxhash_combine (hash, hash1); 562 hash = sxhash_combine (hash, hash1);
565 } 563 }
566 return SXHASH_REDUCE (hash);
567 } 564 }
568 else 565 else
569 return XHASH (bt); 566 hash = XHASH (bt);
567 return make_fixnum (SXHASH_REDUCE (hash));
570} 568}
571 569
572static void syms_of_profiler_for_pdumper (void); 570static void syms_of_profiler_for_pdumper (void);