[pypy-svn] r13740 - in pypy/dist/pypy/rpython: . test
hpk at codespeak.net
hpk at codespeak.net
Thu Jun 23 20:43:01 CEST 2005
Author: hpk
Date: Thu Jun 23 20:43:00 2005
New Revision: 13740
Modified:
pypy/dist/pypy/rpython/rdict.py
pypy/dist/pypy/rpython/test/test_rdict.py
Log:
(arre)
added basic strdict resizing
Modified: pypy/dist/pypy/rpython/rdict.py
==============================================================================
--- pypy/dist/pypy/rpython/rdict.py (original)
+++ pypy/dist/pypy/rpython/rdict.py Thu Jun 23 20:43:00 2005
@@ -139,8 +139,13 @@
entry = ll_strdict_lookup(d, key)
if not entry.key or entry.key == deleted_entry_marker:
entry.key = key
+ entry.value = value
d.num_used_entries += 1
- entry.value = value
+ if d.num_used_entries / 2 > len(d.entries) / 3:
+ ll_strdict_resize(d, len(d.entries) * 2)
+
+ else:
+ entry.value = value
def ll_strdict_delitem(d, key):
entry = ll_strdict_lookup(d, key)
@@ -150,6 +155,18 @@
d.num_used_entries -= 1
# XXX: entry.value = ???
+def ll_strdict_resize(d, new_size):
+ old_entries = d.entries
+ old_size = len(old_entries)
+ d.entries = lltype.malloc(lltype.typeOf(old_entries).TO, new_size)
+ i = 0
+ while i < old_size:
+ entry = old_entries[i]
+ if entry.key and entry.key != deleted_entry_marker:
+ new_entry = ll_strdict_lookup(d, entry.key)
+ new_entry.key = entry.key
+ new_entry.value = entry.value
+ i += 1
# the below is a port of CPython's dictobject.c's lookdict implementation
PERTURB_SHIFT = 5
Modified: pypy/dist/pypy/rpython/test/test_rdict.py
==============================================================================
--- pypy/dist/pypy/rpython/test/test_rdict.py (original)
+++ pypy/dist/pypy/rpython/test/test_rdict.py Thu Jun 23 20:43:00 2005
@@ -102,3 +102,12 @@
res = interpret(func2, [ord(x), y])
for i in range(len(res.entries)):
assert res.entries[i].key != rdict.deleted_entry_marker
+
+def test_dict_resize():
+ def func():
+ d = {}
+ for i in range(8):
+ d[chr(ord('a') + i)] = i
+ return d
+ res = interpret(func, [])
+ assert len(res.entries) > 8
More information about the Pypy-commit
mailing list