[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