[pypy-svn] r17414 - in pypy/dist/pypy: annotation rpython rpython/test

arigo at codespeak.net arigo at codespeak.net
Fri Sep 9 17:52:08 CEST 2005


Author: arigo
Date: Fri Sep  9 17:52:05 2005
New Revision: 17414

Modified:
   pypy/dist/pypy/annotation/unaryop.py
   pypy/dist/pypy/rpython/rdict.py
   pypy/dist/pypy/rpython/test/test_rdict.py
Log:
Support the method clear() on interp-level dicts.


Modified: pypy/dist/pypy/annotation/unaryop.py
==============================================================================
--- pypy/dist/pypy/annotation/unaryop.py	(original)
+++ pypy/dist/pypy/annotation/unaryop.py	Fri Sep  9 17:52:05 2005
@@ -301,6 +301,9 @@
         return getbookkeeper().newlist(SomeTuple((dct.dictdef.read_key(),
                                                   dct.dictdef.read_value())))
 
+    def method_clear(dct):
+        pass
+
 
 class __extend__(SomeString):
 

Modified: pypy/dist/pypy/rpython/rdict.py
==============================================================================
--- pypy/dist/pypy/rpython/rdict.py	(original)
+++ pypy/dist/pypy/rpython/rdict.py	Fri Sep  9 17:52:05 2005
@@ -147,6 +147,11 @@
     def rtype_method_items(self, hop):
         return self._rtype_method_kvi(hop, dum_items)
 
+    def rtype_method_clear(self, hop):
+        v_dict, = hop.inputargs(self)
+        hop.exception_cannot_occur()
+        return hop.gendirectcall(ll_clear, v_dict)
+
 class __extend__(pairtype(StrDictRepr, rmodel.StringRepr)): 
 
     def rtype_getitem((r_dict, r_string), hop):
@@ -387,6 +392,14 @@
         i += 1
     return d
 
+def ll_clear(d):
+    if len(d.entries) == d.num_pristine_entries == STRDICT_INITSIZE:
+        return
+    DICTPTR = lltype.typeOf(d)
+    d.entries = lltype.malloc(DICTPTR.TO.entries.TO, STRDICT_INITSIZE)
+    d.num_items = 0
+    d.num_pristine_entries = STRDICT_INITSIZE 
+
 def ll_update(dic1, dic2):
     d2len =len(dic2.entries)
     entries = dic2.entries

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 Sep  9 17:52:05 2005
@@ -41,6 +41,17 @@
     res = interpret(func, [6])
     assert res == 1
 
+def test_dict_clear():
+    def func(i):
+        d = {'abc': i}
+        d['def'] = i+1
+        d.clear()
+        d['ghi'] = i+2
+        return ('abc' not in d and 'def' not in d
+                and d['ghi'] == i+2 and len(d) == 1)
+    res = interpret(func, [7])
+    assert res == True
+
 def test_empty_strings():
     def func(i): 
         d = {'' : i}



More information about the Pypy-commit mailing list