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
