Author: Maciej Fijalkowski <[email protected]>
Branch: 
Changeset: r61625:4c2efe56c1db
Date: 2013-02-22 19:39 +0200
http://bitbucket.org/pypy/pypy/changeset/4c2efe56c1db/

Log:    give up and use r_uint here

diff --git a/rpython/rtyper/lltypesystem/rdict.py 
b/rpython/rtyper/lltypesystem/rdict.py
--- a/rpython/rtyper/lltypesystem/rdict.py
+++ b/rpython/rtyper/lltypesystem/rdict.py
@@ -11,8 +11,8 @@
 from rpython.annotator.model import SomeInteger
 
 
-HIGHEST_BIT = intmask(1 << (LONG_BIT - 1))
-MASK = intmask(HIGHEST_BIT - 1)
+HIGHEST_BIT = r_uint(intmask(1 << (LONG_BIT - 1)))
+MASK = r_uint(intmask(HIGHEST_BIT - 1))
 
 # ____________________________________________________________
 #
@@ -386,55 +386,44 @@
 #  be direct_call'ed from rtyped flow graphs, which means that they will
 #  get flowed and annotated, mostly with SomePtr.
 
[email protected](None, SomeInteger(nonneg=True))
 def ll_everused_from_flag(entries, i):
     return entries[i].f_everused
 
[email protected](None, SomeInteger(nonneg=True))
 def ll_everused_from_key(entries, i):
     return bool(entries[i].key)
 
[email protected](None, SomeInteger(nonneg=True))
 def ll_everused_from_value(entries, i):
     return bool(entries[i].value)
 
[email protected](None, SomeInteger(nonneg=True))
 def ll_valid_from_flag(entries, i):
     return entries[i].f_valid
 
[email protected](None, SomeInteger(nonneg=True))
 def ll_mark_deleted_in_flag(entries, i):
     entries[i].f_valid = False
 
[email protected](None, SomeInteger(nonneg=True))
 def ll_valid_from_key(entries, i):
     ENTRIES = lltype.typeOf(entries).TO
     dummy = ENTRIES.dummy_obj.ll_dummy_value
     return entries.everused(i) and entries[i].key != dummy
 
[email protected](None, SomeInteger(nonneg=True))
 def ll_mark_deleted_in_key(entries, i):
     ENTRIES = lltype.typeOf(entries).TO
     dummy = ENTRIES.dummy_obj.ll_dummy_value
     entries[i].key = dummy
 
[email protected](None, SomeInteger(nonneg=True))
 def ll_valid_from_value(entries, i):
     ENTRIES = lltype.typeOf(entries).TO
     dummy = ENTRIES.dummy_obj.ll_dummy_value
     return entries.everused(i) and entries[i].value != dummy
 
[email protected](None, SomeInteger(nonneg=True))
 def ll_mark_deleted_in_value(entries, i):
     ENTRIES = lltype.typeOf(entries).TO
     dummy = ENTRIES.dummy_obj.ll_dummy_value
     entries[i].value = dummy
 
[email protected](None, SomeInteger(nonneg=True))
 def ll_hash_from_cache(entries, i):
     return entries[i].f_hash
 
[email protected](None, SomeInteger(nonneg=True))
 def ll_hash_recomputed(entries, i):
     ENTRIES = lltype.typeOf(entries).TO
     return ENTRIES.fasthashfn(entries[i].key)
@@ -525,7 +514,6 @@
 
 @jit.look_inside_iff(lambda d, i: jit.isvirtual(d) and jit.isconstant(i))
 def _ll_dict_del(d, i):
-    assert i >= 0
     d.entries.mark_deleted(i)
     d.num_items -= 1
     # clear the key and the value if they are GC pointers
@@ -585,8 +573,7 @@
     ENTRIES = lltype.typeOf(entries).TO
     direct_compare = not hasattr(ENTRIES, 'no_direct_compare')
     mask = len(entries) - 1
-    i = hash & mask
-    assert i >= 0
+    i = r_uint(hash & mask)
     # do the first try before any looping
     if entries.valid(i):
         checkingkey = entries[i].key
@@ -605,7 +592,7 @@
                 return i   # found the entry
         freeslot = -1
     elif entries.everused(i):
-        freeslot = i
+        freeslot = intmask(i)
     else:
         return i | HIGHEST_BIT # pristine entry -- lookup failed
 
@@ -614,16 +601,14 @@
     perturb = r_uint(hash)
     while 1:
         # compute the next index using unsigned arithmetic
-        i = r_uint(i)
         i = (i << 2) + i + perturb + 1
-        i = intmask(i) & mask
-        assert i >= 0
+        i = i & mask
         # keep 'i' as a signed number here, to consistently pass signed
         # arguments to the small helper methods.
         if not entries.everused(i):
             if freeslot == -1:
-                freeslot = i
-            return freeslot | HIGHEST_BIT
+                freeslot = intmask(i)
+            return r_uint(freeslot) | HIGHEST_BIT
         elif entries.valid(i):
             checkingkey = entries[i].key
             if direct_compare and checkingkey == key:
@@ -641,7 +626,7 @@
                 if found:
                     return i   # found the entry
         elif freeslot == -1:
-            freeslot = i
+            freeslot = intmask(i)
         perturb >>= PERTURB_SHIFT
 
 def ll_dict_lookup_clean(d, hash):
@@ -650,14 +635,11 @@
     # It only finds the next free slot for the given hash.
     entries = d.entries
     mask = len(entries) - 1
-    i = hash & mask
-    assert i >= 0
+    i = r_uint(hash & mask)
     perturb = r_uint(hash)
     while entries.everused(i):
-        i = r_uint(i)
         i = (i << 2) + i + perturb + 1
-        i = intmask(i) & mask
-        assert i >= 0
+        i = i & mask
         perturb >>= PERTURB_SHIFT
     return i
 
@@ -926,14 +908,14 @@
     r = lltype.malloc(ELEM.TO)
     r.item0 = recast(ELEM.TO.item0, entry.key)
     r.item1 = recast(ELEM.TO.item1, entry.value)
-    _ll_dict_del(dic, i)
+    _ll_dict_del(dic, r_uint(i))
     return r
 
 def ll_pop(dic, key):
     i = ll_dict_lookup(dic, key, dic.keyhash(key))
     if not i & HIGHEST_BIT:
-        value = ll_get_value(dic, i)
-        _ll_dict_del(dic, i)
+        value = ll_get_value(dic, r_uint(i))
+        _ll_dict_del(dic, r_uint(i))
         return value
     else:
         raise KeyError
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to