[pypy-svn] r13766 - in pypy/dist/pypy/rpython: . test

ac at codespeak.net ac at codespeak.net
Fri Jun 24 11:59:26 CEST 2005


Author: ac
Date: Fri Jun 24 11:59:25 2005
New Revision: 13766

Modified:
   pypy/dist/pypy/rpython/rdict.py
   pypy/dist/pypy/rpython/test/test_rdict.py
Log:
Add iteration over rdicts.

Modified: pypy/dist/pypy/rpython/rdict.py
==============================================================================
--- pypy/dist/pypy/rpython/rdict.py	(original)
+++ pypy/dist/pypy/rpython/rdict.py	Fri Jun 24 11:59:25 2005
@@ -86,6 +86,9 @@
         v_dict, = hop.inputargs(self)
         return hop.gendirectcall(ll_strdict_len, v_dict)
 
+    def make_iterator_repr(self):
+        return StrDictIteratorRepr(self)
+
 class __extend__(pairtype(StrDictRepr, rmodel.StringRepr)): 
 
     def rtype_getitem((r_dict, r_string), hop):
@@ -241,3 +244,42 @@
     v_result = hop.gendirectcall(ll_newstrdict, c1) 
     return v_result
 
+# ____________________________________________________________
+#
+#  Iteration.
+
+class StrDictIteratorRepr(rmodel.Repr):
+
+    def __init__(self, r_dict):
+        self.r_dict = r_dict
+        self.lowleveltype = lltype.Ptr(lltype.GcStruct('strdictiter',
+                                         ('dict', r_dict.lowleveltype),
+                                         ('index', lltype.Signed)))
+
+    def newiter(self, hop):
+        v_dict, = hop.inputargs(self.r_dict)
+        citerptr = hop.inputconst(lltype.Void, self.lowleveltype)
+        return hop.gendirectcall(ll_strdictiter, citerptr, v_dict)
+
+    def rtype_next(self, hop):
+        v_iter, = hop.inputargs(self)
+        return hop.gendirectcall(ll_strdictnext, v_iter)
+
+def ll_strdictiter(ITERPTR, d):
+    iter = lltype.malloc(ITERPTR.TO)
+    iter.dict = d
+    iter.index = 0
+    return iter
+
+def ll_strdictnext(iter):
+    entries = iter.dict.entries
+    index = iter.index
+    entries_len = len(entries)
+    while index < entries_len:
+        key = entries[index].key
+        index = index + 1
+        if key and key != deleted_entry_marker:
+            iter.index = index
+            return key
+    iter.index = index
+    raise StopIteration

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	Fri Jun 24 11:59:25 2005
@@ -138,3 +138,16 @@
     assert len(res.entries) > rdict.STRDICT_INITSIZE 
     res = interpret(func, [1])
     assert len(res.entries) == rdict.STRDICT_INITSIZE 
+
+def test_dict_iteration():
+    def func(i, j):
+        d = {}
+        d['hello'] = i
+        d['world'] = j
+        k = 1
+        for key in d:
+            k = k * d[key]
+        return k
+    res = interpret(func, [6, 7])
+    assert res == 42
+    



More information about the Pypy-commit mailing list