[pypy-commit] pypy default: Import a recent tweak from rdict to rordereddict.
arigo
noreply at buildbot.pypy.org
Sun Dec 14 13:44:50 CET 2014
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r74909:b25002d820a5
Date: 2014-12-14 13:44 +0100
http://bitbucket.org/pypy/pypy/changeset/b25002d820a5/
Log: Import a recent tweak from rdict to rordereddict. Support
rtype_newdict() making possibly-ordered dicts.
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
@@ -669,6 +669,7 @@
d.num_items = 0
d.resize_counter = DICT_INITSIZE * 2
return d
+DictRepr.ll_newdict = staticmethod(ll_newdict)
def ll_newdict_size(DICT, length_estimate):
length_estimate = (length_estimate // 2) * 3
diff --git a/rpython/rtyper/lltypesystem/rordereddict.py b/rpython/rtyper/lltypesystem/rordereddict.py
--- a/rpython/rtyper/lltypesystem/rordereddict.py
+++ b/rpython/rtyper/lltypesystem/rordereddict.py
@@ -839,6 +839,7 @@
d.num_used_items = 0
d.resize_counter = DICT_INITSIZE * 2
return d
+OrderedDictRepr.ll_newdict = staticmethod(ll_newdict)
def ll_newdict_size(DICT, orig_length_estimate):
length_estimate = (orig_length_estimate // 2) * 3
@@ -1012,7 +1013,13 @@
# (d.resize_counter - 1) // 3 = room left in d
# so, if num_extra == 1, we need d.resize_counter > 3
# if num_extra == 2, we need d.resize_counter > 6 etc.
- jit.conditional_call(d.resize_counter <= num_extra * 3,
+ # Note however a further hack: if num_extra <= d.num_items,
+ # we avoid calling _ll_dict_resize_to here. This is to handle
+ # the case where dict.update() actually has a lot of collisions.
+ # If num_extra is much greater than d.num_items the conditional_call
+ # will trigger anyway, which is really the goal.
+ x = num_extra - d.num_items
+ jit.conditional_call(d.resize_counter <= x * 3,
_ll_dict_resize_to, d, num_extra)
# this is an implementation of keys(), values() and items()
diff --git a/rpython/rtyper/rdict.py b/rpython/rtyper/rdict.py
--- a/rpython/rtyper/rdict.py
+++ b/rpython/rtyper/rdict.py
@@ -57,11 +57,10 @@
def rtype_newdict(hop):
- from rpython.rtyper.lltypesystem.rdict import ll_newdict
hop.inputargs() # no arguments expected
r_dict = hop.r_result
cDICT = hop.inputconst(lltype.Void, r_dict.DICT)
- v_result = hop.gendirectcall(ll_newdict, cDICT)
+ v_result = hop.gendirectcall(r_dict.ll_newdict, cDICT)
return v_result
More information about the pypy-commit
mailing list