]> granicus.if.org Git - python/commitdiff
Small lookmapping nits:
authorGuido van Rossum <guido@python.org>
Wed, 29 Jan 1997 15:53:56 +0000 (15:53 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 29 Jan 1997 15:53:56 +0000 (15:53 +0000)
- remove bogus initialization using uninitialized i
- derive initial incr from hash
- copy mp->ma_table into a local variable

Objects/dictobject.c
Objects/mappingobject.c

index bcd615df08192364103e020687fa30c4e0012684..8f3d3a6476d425122fd24ac047985a638ee55094 100644 (file)
@@ -169,14 +169,15 @@ lookmapping(mp, key, hash)
        register unsigned long sum = (unsigned long) hash;
        register mappingentry *freeslot = NULL;
        register int mask = mp->ma_size-1;
-       register mappingentry *ep = &mp->ma_table[i];
+       mappingentry *ep0 = mp->ma_table;
+       register mappingentry *ep;
        /* We must come up with (i, incr) such that 0 <= i < ma_size
           and 0 < incr < ma_size and both are a function of hash */
        i = (~sum) & mask;
        /* We use ~sum instead if sum, as degenerate hash functions, such
           as for ints <sigh>, can have lots of leading zeros. It's not
           really a performance risk, but better safe than sorry. */
-       ep = &mp->ma_table[i];
+       ep = &ep0[i];
        if (ep->me_key == NULL)
                return ep;
        if (ep->me_key == dummy)
@@ -185,16 +186,16 @@ lookmapping(mp, key, hash)
                 (ep->me_hash == hash && cmpobject(ep->me_key, key) == 0)) {
                return ep;
        }
-       /* Derive incr from i, just to make it more arbitrary. Note that
+       /* Derive incr from sum, just to make it more arbitrary. Note that
           incr must not be 0, or we will get into an infinite loop.*/
-       incr = i << 1;
+       incr = (sum ^ (sum >> 3)) & mask;
        if (!incr)
                incr = mask;
        if (incr > mask) /* Cycle through GF(2^n)-{0} */
                incr ^= mp->ma_poly; /* This will implicitly clear the
                                        highest bit */
        for (;;) {
-               ep = &mp->ma_table[(i+incr)&mask];
+               ep = &ep0[(i+incr)&mask];
                if (ep->me_key == NULL) {
                        if (freeslot != NULL)
                                return freeslot;
index bcd615df08192364103e020687fa30c4e0012684..8f3d3a6476d425122fd24ac047985a638ee55094 100644 (file)
@@ -169,14 +169,15 @@ lookmapping(mp, key, hash)
        register unsigned long sum = (unsigned long) hash;
        register mappingentry *freeslot = NULL;
        register int mask = mp->ma_size-1;
-       register mappingentry *ep = &mp->ma_table[i];
+       mappingentry *ep0 = mp->ma_table;
+       register mappingentry *ep;
        /* We must come up with (i, incr) such that 0 <= i < ma_size
           and 0 < incr < ma_size and both are a function of hash */
        i = (~sum) & mask;
        /* We use ~sum instead if sum, as degenerate hash functions, such
           as for ints <sigh>, can have lots of leading zeros. It's not
           really a performance risk, but better safe than sorry. */
-       ep = &mp->ma_table[i];
+       ep = &ep0[i];
        if (ep->me_key == NULL)
                return ep;
        if (ep->me_key == dummy)
@@ -185,16 +186,16 @@ lookmapping(mp, key, hash)
                 (ep->me_hash == hash && cmpobject(ep->me_key, key) == 0)) {
                return ep;
        }
-       /* Derive incr from i, just to make it more arbitrary. Note that
+       /* Derive incr from sum, just to make it more arbitrary. Note that
           incr must not be 0, or we will get into an infinite loop.*/
-       incr = i << 1;
+       incr = (sum ^ (sum >> 3)) & mask;
        if (!incr)
                incr = mask;
        if (incr > mask) /* Cycle through GF(2^n)-{0} */
                incr ^= mp->ma_poly; /* This will implicitly clear the
                                        highest bit */
        for (;;) {
-               ep = &mp->ma_table[(i+incr)&mask];
+               ep = &ep0[(i+incr)&mask];
                if (ep->me_key == NULL) {
                        if (freeslot != NULL)
                                return freeslot;