diff options
| author | Paul Eggert | 2019-07-20 19:40:03 -0700 |
|---|---|---|
| committer | Paul Eggert | 2019-07-20 20:13:46 -0700 |
| commit | b6f194a0fb6dbd1b19aa01f95a955f5b8b23b40e (patch) | |
| tree | 009e3beff4781c98e733657d60003b3eee97e068 /src | |
| parent | 5018b663c6c0d31f27fb44630a69d9e0bd73273d (diff) | |
| download | emacs-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.c | 8 | ||||
| -rw-r--r-- | src/category.c | 9 | ||||
| -rw-r--r-- | src/charset.c | 2 | ||||
| -rw-r--r-- | src/composite.c | 5 | ||||
| -rw-r--r-- | src/emacs-module.c | 3 | ||||
| -rw-r--r-- | src/fns.c | 103 | ||||
| -rw-r--r-- | src/image.c | 3 | ||||
| -rw-r--r-- | src/json.c | 3 | ||||
| -rw-r--r-- | src/lisp.h | 12 | ||||
| -rw-r--r-- | src/lread.c | 3 | ||||
| -rw-r--r-- | src/macfont.m | 3 | ||||
| -rw-r--r-- | src/profiler.c | 34 |
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) | |||
| 48 | static Lisp_Object | 48 | static Lisp_Object |
| 49 | hash_get_category_set (Lisp_Object table, Lisp_Object category_set) | 49 | hash_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 | |||
| 164 | get_composition_id (ptrdiff_t charpos, ptrdiff_t bytepos, ptrdiff_t nchars, | 164 | get_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) |
| @@ -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 | ||
| 3937 | static bool | 3937 | static Lisp_Object |
| 3938 | cmpfn_eql (struct hash_table_test *ht, | 3938 | cmpfn_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 | ||
| 3948 | static bool | 3946 | static Lisp_Object |
| 3949 | cmpfn_equal (struct hash_table_test *ht, | 3947 | cmpfn_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 | ||
| 3960 | static bool | 3956 | static Lisp_Object |
| 3961 | cmpfn_user_defined (struct hash_table_test *ht, | 3957 | cmpfn_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 | ||
| 3971 | static EMACS_UINT | 3966 | static Lisp_Object |
| 3972 | hashfn_eq (struct hash_table_test *ht, Lisp_Object key) | 3967 | hashfn_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 | ||
| 3980 | EMACS_UINT | 3975 | Lisp_Object |
| 3981 | hashfn_equal (struct hash_table_test *ht, Lisp_Object key) | 3976 | hashfn_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 | ||
| 3989 | EMACS_UINT | 3984 | Lisp_Object |
| 3990 | hashfn_eql (struct hash_table_test *ht, Lisp_Object key) | 3985 | hashfn_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 | ||
| 4000 | static EMACS_UINT | 3993 | static Lisp_Object |
| 4001 | hashfn_user_defined (struct hash_table_test *ht, Lisp_Object key) | 3994 | hashfn_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 | ||
| 4007 | struct hash_table_test const | 4000 | struct 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 | ||
| 4258 | ptrdiff_t | 4251 | ptrdiff_t |
| 4259 | hash_lookup (struct Lisp_Hash_Table *h, Lisp_Object key, EMACS_UINT *hash) | 4252 | hash_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 | ||
| 4288 | ptrdiff_t | 4279 | ptrdiff_t |
| 4289 | hash_put (struct Lisp_Hash_Table *h, Lisp_Object key, Lisp_Object value, | 4280 | hash_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, | |||
| 4321 | void | 4310 | void |
| 4322 | hash_remove_from_table (struct Lisp_Hash_Table *h, Lisp_Object key) | 4311 | hash_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)). | |||
| 4685 | Hash codes are not guaranteed to be preserved across Emacs sessions. */) | 4673 | Hash 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 | ||
| 4691 | DEFUN ("sxhash-eql", Fsxhash_eql, Ssxhash_eql, 1, 1, 0, | 4679 | DEFUN ("sxhash-eql", Fsxhash_eql, Ssxhash_eql, 1, 1, 0, |
| @@ -4695,7 +4683,7 @@ If (eql A B), then (= (sxhash-eql A) (sxhash-eql B)). | |||
| 4695 | Hash codes are not guaranteed to be preserved across Emacs sessions. */) | 4683 | Hash 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 | ||
| 4701 | DEFUN ("sxhash-equal", Fsxhash_equal, Ssxhash_equal, 1, 1, 0, | 4689 | DEFUN ("sxhash-equal", Fsxhash_equal, Ssxhash_equal, 1, 1, 0, |
| @@ -4705,7 +4693,7 @@ If (equal A B), then (= (sxhash-equal A) (sxhash-equal B)). | |||
| 4705 | Hash codes are not guaranteed to be preserved across Emacs sessions. */) | 4693 | Hash 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 | ||
| 4711 | DEFUN ("make-hash-table", Fmake_hash_table, Smake_hash_table, 0, MANY, 0, | 4699 | DEFUN ("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 | ||
| 2246 | struct Lisp_Hash_Table | 2246 | struct Lisp_Hash_Table |
| @@ -3591,13 +3591,13 @@ extern void hexbuf_digest (char *, void const *, int); | |||
| 3591 | extern char *extract_data_from_object (Lisp_Object, ptrdiff_t *, ptrdiff_t *); | 3591 | extern char *extract_data_from_object (Lisp_Object, ptrdiff_t *, ptrdiff_t *); |
| 3592 | EMACS_UINT hash_string (char const *, ptrdiff_t); | 3592 | EMACS_UINT hash_string (char const *, ptrdiff_t); |
| 3593 | EMACS_UINT sxhash (Lisp_Object, int); | 3593 | EMACS_UINT sxhash (Lisp_Object, int); |
| 3594 | EMACS_UINT hashfn_eql (struct hash_table_test *ht, Lisp_Object key); | 3594 | Lisp_Object hashfn_eql (Lisp_Object, struct hash_table_test *); |
| 3595 | EMACS_UINT hashfn_equal (struct hash_table_test *ht, Lisp_Object key); | 3595 | Lisp_Object hashfn_equal (Lisp_Object, struct hash_table_test *); |
| 3596 | Lisp_Object make_hash_table (struct hash_table_test, EMACS_INT, float, float, | 3596 | Lisp_Object make_hash_table (struct hash_table_test, EMACS_INT, float, float, |
| 3597 | Lisp_Object, bool); | 3597 | Lisp_Object, bool); |
| 3598 | ptrdiff_t hash_lookup (struct Lisp_Hash_Table *, Lisp_Object, EMACS_UINT *); | 3598 | ptrdiff_t hash_lookup (struct Lisp_Hash_Table *, Lisp_Object, Lisp_Object *); |
| 3599 | ptrdiff_t hash_put (struct Lisp_Hash_Table *, Lisp_Object, Lisp_Object, | 3599 | ptrdiff_t hash_put (struct Lisp_Hash_Table *, Lisp_Object, Lisp_Object, |
| 3600 | EMACS_UINT); | 3600 | Lisp_Object); |
| 3601 | void hash_remove_from_table (struct Lisp_Hash_Table *, Lisp_Object); | 3601 | void hash_remove_from_table (struct Lisp_Hash_Table *, Lisp_Object); |
| 3602 | extern struct hash_table_test const hashtest_eq, hashtest_eql, hashtest_equal; | 3602 | extern struct hash_table_test const hashtest_eq, hashtest_eql, hashtest_equal; |
| 3603 | extern void validate_subarray (Lisp_Object, Lisp_Object, Lisp_Object, | 3603 | extern 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 | ||
| 37 | typedef struct Lisp_Hash_Table log_t; | 37 | typedef struct Lisp_Hash_Table log_t; |
| 38 | 38 | ||
| 39 | static bool cmpfn_profiler ( | 39 | static Lisp_Object cmpfn_profiler (Lisp_Object, Lisp_Object, |
| 40 | struct hash_table_test *, Lisp_Object, Lisp_Object); | 40 | struct hash_table_test *); |
| 41 | 41 | static Lisp_Object hashfn_profiler (Lisp_Object, struct hash_table_test *); | |
| 42 | static EMACS_UINT hashfn_profiler ( | ||
| 43 | struct hash_table_test *, Lisp_Object); | ||
| 44 | 42 | ||
| 45 | static const struct hash_table_test hashtest_profiler = | 43 | static 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 | ||
| 532 | static bool | 530 | static Lisp_Object |
| 533 | cmpfn_profiler (struct hash_table_test *t, | 531 | cmpfn_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 | ||
| 550 | static EMACS_UINT | 547 | static Lisp_Object |
| 551 | hashfn_profiler (struct hash_table_test *ht, Lisp_Object bt) | 548 | hashfn_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 | ||
| 572 | static void syms_of_profiler_for_pdumper (void); | 570 | static void syms_of_profiler_for_pdumper (void); |