diff options
| author | Gerd Moellmann | 1999-08-21 19:29:32 +0000 |
|---|---|---|
| committer | Gerd Moellmann | 1999-08-21 19:29:32 +0000 |
| commit | 2e5da6761e5995a3438f488c9a8a49575acbee63 (patch) | |
| tree | 2c9c038c8ca9148d268d148eae93df425389a9ec /src | |
| parent | c71106e5dd2dc758d4c3509d3ab50561ae16eb2a (diff) | |
| download | emacs-2e5da6761e5995a3438f488c9a8a49575acbee63.tar.gz emacs-2e5da6761e5995a3438f488c9a8a49575acbee63.zip | |
(hash_lookup): Test with EQ before calling key comparion
function.
(hash_remove): Ditto.
(cmpfn_eq): Removed.
(cmpfn_eql): Don't test with EQ.
(cmpfn_equal): Ditto.
(make_hash_table): Set comparison function for `eq' to null.
Diffstat (limited to 'src')
| -rw-r--r-- | src/fns.c | 39 |
1 files changed, 13 insertions, 26 deletions
| @@ -3305,8 +3305,6 @@ static int next_almost_prime P_ ((int)); | |||
| 3305 | static int get_key_arg P_ ((Lisp_Object, int, Lisp_Object *, char *)); | 3305 | static int get_key_arg P_ ((Lisp_Object, int, Lisp_Object *, char *)); |
| 3306 | static Lisp_Object larger_vector P_ ((Lisp_Object, int, Lisp_Object)); | 3306 | static Lisp_Object larger_vector P_ ((Lisp_Object, int, Lisp_Object)); |
| 3307 | static void maybe_resize_hash_table P_ ((struct Lisp_Hash_Table *)); | 3307 | static void maybe_resize_hash_table P_ ((struct Lisp_Hash_Table *)); |
| 3308 | static int cmpfn_eq P_ ((struct Lisp_Hash_Table *, Lisp_Object, unsigned, | ||
| 3309 | Lisp_Object, unsigned)); | ||
| 3310 | static int cmpfn_eql P_ ((struct Lisp_Hash_Table *, Lisp_Object, unsigned, | 3308 | static int cmpfn_eql P_ ((struct Lisp_Hash_Table *, Lisp_Object, unsigned, |
| 3311 | Lisp_Object, unsigned)); | 3309 | Lisp_Object, unsigned)); |
| 3312 | static int cmpfn_equal P_ ((struct Lisp_Hash_Table *, Lisp_Object, unsigned, | 3310 | static int cmpfn_equal P_ ((struct Lisp_Hash_Table *, Lisp_Object, unsigned, |
| @@ -3422,20 +3420,6 @@ larger_vector (vec, new_size, init) | |||
| 3422 | ***********************************************************************/ | 3420 | ***********************************************************************/ |
| 3423 | 3421 | ||
| 3424 | /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code | 3422 | /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code |
| 3425 | HASH2 in hash table H using `eq'. Value is non-zero if KEY1 and | ||
| 3426 | KEY2 are the same. */ | ||
| 3427 | |||
| 3428 | static int | ||
| 3429 | cmpfn_eq (h, key1, hash1, key2, hash2) | ||
| 3430 | struct Lisp_Hash_Table *h; | ||
| 3431 | Lisp_Object key1, key2; | ||
| 3432 | unsigned hash1, hash2; | ||
| 3433 | { | ||
| 3434 | return EQ (key1, key2); | ||
| 3435 | } | ||
| 3436 | |||
| 3437 | |||
| 3438 | /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code | ||
| 3439 | HASH2 in hash table H using `eql'. Value is non-zero if KEY1 and | 3423 | HASH2 in hash table H using `eql'. Value is non-zero if KEY1 and |
| 3440 | KEY2 are the same. */ | 3424 | KEY2 are the same. */ |
| 3441 | 3425 | ||
| @@ -3445,10 +3429,9 @@ cmpfn_eql (h, key1, hash1, key2, hash2) | |||
| 3445 | Lisp_Object key1, key2; | 3429 | Lisp_Object key1, key2; |
| 3446 | unsigned hash1, hash2; | 3430 | unsigned hash1, hash2; |
| 3447 | { | 3431 | { |
| 3448 | return (EQ (key1, key2) | 3432 | return (FLOATP (key1) |
| 3449 | || (FLOATP (key1) | 3433 | && FLOATP (key2) |
| 3450 | && FLOATP (key2) | 3434 | && XFLOAT (key1)->data == XFLOAT (key2)->data); |
| 3451 | && XFLOAT (key1)->data == XFLOAT (key2)->data)); | ||
| 3452 | } | 3435 | } |
| 3453 | 3436 | ||
| 3454 | 3437 | ||
| @@ -3462,9 +3445,7 @@ cmpfn_equal (h, key1, hash1, key2, hash2) | |||
| 3462 | Lisp_Object key1, key2; | 3445 | Lisp_Object key1, key2; |
| 3463 | unsigned hash1, hash2; | 3446 | unsigned hash1, hash2; |
| 3464 | { | 3447 | { |
| 3465 | return (EQ (key1, key2) | 3448 | return hash1 == hash2 && !NILP (Fequal (key1, key2)); |
| 3466 | || (hash1 == hash2 | ||
| 3467 | && !NILP (Fequal (key1, key2)))); | ||
| 3468 | } | 3449 | } |
| 3469 | 3450 | ||
| 3470 | 3451 | ||
| @@ -3627,7 +3608,7 @@ make_hash_table (test, size, rehash_size, rehash_threshold, weak, | |||
| 3627 | } | 3608 | } |
| 3628 | else if (EQ (test, Qeq)) | 3609 | else if (EQ (test, Qeq)) |
| 3629 | { | 3610 | { |
| 3630 | h->cmpfn = cmpfn_eq; | 3611 | h->cmpfn = NULL; |
| 3631 | h->hashfn = hashfn_eq; | 3612 | h->hashfn = hashfn_eq; |
| 3632 | } | 3613 | } |
| 3633 | else if (EQ (test, Qequal)) | 3614 | else if (EQ (test, Qequal)) |
| @@ -3758,7 +3739,10 @@ hash_lookup (h, key, hash) | |||
| 3758 | while (!NILP (idx)) | 3739 | while (!NILP (idx)) |
| 3759 | { | 3740 | { |
| 3760 | int i = XFASTINT (idx); | 3741 | int i = XFASTINT (idx); |
| 3761 | if (h->cmpfn (h, key, hash_code, HASH_KEY (h, i), HASH_HASH (h, i))) | 3742 | if (EQ (key, HASH_KEY (h, i)) |
| 3743 | || (h->cmpfn | ||
| 3744 | && h->cmpfn (h, key, hash_code, | ||
| 3745 | HASH_KEY (h, i), HASH_HASH (h, i)))) | ||
| 3762 | break; | 3746 | break; |
| 3763 | idx = HASH_NEXT (h, i); | 3747 | idx = HASH_NEXT (h, i); |
| 3764 | } | 3748 | } |
| @@ -3820,7 +3804,10 @@ hash_remove (h, key) | |||
| 3820 | { | 3804 | { |
| 3821 | int i = XFASTINT (idx); | 3805 | int i = XFASTINT (idx); |
| 3822 | 3806 | ||
| 3823 | if (h->cmpfn (h, key, hash_code, HASH_KEY (h, i), HASH_HASH (h, i))) | 3807 | if (EQ (key, HASH_KEY (h, i)) |
| 3808 | || (h->cmpfn | ||
| 3809 | && h->cmpfn (h, key, hash_code, | ||
| 3810 | HASH_KEY (h, i), HASH_HASH (h, i)))) | ||
| 3824 | { | 3811 | { |
| 3825 | /* Take entry out of collision chain. */ | 3812 | /* Take entry out of collision chain. */ |
| 3826 | if (NILP (prev)) | 3813 | if (NILP (prev)) |