aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGerd Moellmann1999-08-21 19:29:32 +0000
committerGerd Moellmann1999-08-21 19:29:32 +0000
commit2e5da6761e5995a3438f488c9a8a49575acbee63 (patch)
tree2c9c038c8ca9148d268d148eae93df425389a9ec /src
parentc71106e5dd2dc758d4c3509d3ab50561ae16eb2a (diff)
downloademacs-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.c39
1 files changed, 13 insertions, 26 deletions
diff --git a/src/fns.c b/src/fns.c
index 2f97964b26e..c80604a24be 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -3305,8 +3305,6 @@ static int next_almost_prime P_ ((int));
3305static int get_key_arg P_ ((Lisp_Object, int, Lisp_Object *, char *)); 3305static int get_key_arg P_ ((Lisp_Object, int, Lisp_Object *, char *));
3306static Lisp_Object larger_vector P_ ((Lisp_Object, int, Lisp_Object)); 3306static Lisp_Object larger_vector P_ ((Lisp_Object, int, Lisp_Object));
3307static void maybe_resize_hash_table P_ ((struct Lisp_Hash_Table *)); 3307static void maybe_resize_hash_table P_ ((struct Lisp_Hash_Table *));
3308static int cmpfn_eq P_ ((struct Lisp_Hash_Table *, Lisp_Object, unsigned,
3309 Lisp_Object, unsigned));
3310static int cmpfn_eql P_ ((struct Lisp_Hash_Table *, Lisp_Object, unsigned, 3308static int cmpfn_eql P_ ((struct Lisp_Hash_Table *, Lisp_Object, unsigned,
3311 Lisp_Object, unsigned)); 3309 Lisp_Object, unsigned));
3312static int cmpfn_equal P_ ((struct Lisp_Hash_Table *, Lisp_Object, unsigned, 3310static 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
3428static int
3429cmpfn_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))