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

antocuni at codespeak.net antocuni at codespeak.net
Tue Apr 25 19:02:13 CEST 2006


Author: antocuni
Date: Tue Apr 25 19:02:03 2006
New Revision: 26343

Modified:
   pypy/dist/pypy/rpython/ootypesystem/ootype.py
   pypy/dist/pypy/rpython/ootypesystem/rdict.py
   pypy/dist/pypy/rpython/rdict.py
   pypy/dist/pypy/rpython/test/test_rdict.py
Log:
Added support for copy(), clear() and update() methods.



Modified: pypy/dist/pypy/rpython/ootypesystem/ootype.py
==============================================================================
--- pypy/dist/pypy/rpython/ootypesystem/ootype.py	(original)
+++ pypy/dist/pypy/rpython/ootypesystem/ootype.py	Tue Apr 25 19:02:03 2006
@@ -358,6 +358,7 @@
             "ll_set": Meth([self.KEYTYPE_T, self.VALUETYPE_T], Void),
             "ll_remove": Meth([self.KEYTYPE_T], Bool), # return False is key was not present
             "ll_contains": Meth([self.KEYTYPE_T], Bool),
+            "ll_clear": Meth([], Void),
             "ll_get_items_iterator": Meth([], DictItemsIterator(self.KEYTYPE_T, self.VALUETYPE_T)),
         })
 
@@ -795,6 +796,9 @@
         assert typeOf(key) == self._TYPE._KEYTYPE
         return key in self._dict
 
+    def ll_clear(self):
+        self._dict.clear()
+
     def ll_get_items_iterator(self):
         # NOT_RPYTHON
         ITER = DictItemsIterator(self._TYPE._KEYTYPE, self._TYPE._VALUETYPE)

Modified: pypy/dist/pypy/rpython/ootypesystem/rdict.py
==============================================================================
--- pypy/dist/pypy/rpython/ootypesystem/rdict.py	(original)
+++ pypy/dist/pypy/rpython/ootypesystem/rdict.py	Tue Apr 25 19:02:03 2006
@@ -69,6 +69,7 @@
 
     def rtype_len(self, hop):
         v_dict, = hop.inputargs(self)
+        hop.exception_cannot_occur()
         return self.send_message(hop, 'll_length')
 
     def rtype_is_true(self, hop):
@@ -89,6 +90,17 @@
         v_res = hop.gendirectcall(ll_dict_setdefault, v_dict, v_key, v_default)
         return self.recast_value(hop.llops, v_res)
 
+    def rtype_method_copy(self, hop):
+        v_dict, = hop.inputargs(self)
+        cDICT = hop.inputconst(ootype.Void, self.lowleveltype)
+        hop.exception_cannot_occur()
+        return hop.gendirectcall(ll_dict_copy, cDICT, v_dict)
+
+    def rtype_method_update(self, hop):
+        v_dict1, v_dict2 = hop.inputargs(self, self)
+        hop.exception_cannot_occur()
+        return hop.gendirectcall(ll_dict_update, v_dict1, v_dict2)
+
     def rtype_method_keys(self, hop):
         return self._rtype_method_kvi(hop, dum_keys)
 
@@ -118,6 +130,10 @@
         hop.exception_cannot_occur()
         return DictIteratorRepr(self, "items").newiter(hop)
 
+    def rtype_method_clear(self, hop):
+        v_dict, = hop.inputargs(self)
+        hop.exception_cannot_occur()
+        return self.send_message(hop, 'll_clear')
 
 class __extend__(pairtype(DictRepr, rmodel.Repr)): 
 
@@ -147,9 +163,12 @@
 
     def rtype_contains((r_dict, r_key), hop):
         v_dict, v_key = hop.inputargs(r_dict, r_dict.key_repr)
+        hop.exception_cannot_occur()
         return r_dict.send_message(hop, 'll_contains')
 
 
+def rtype_r_dict(hop):
+    pass # TODO
 
 def ll_newdict(DICT):
     return ootype.new(DICT)
@@ -158,6 +177,19 @@
     # check if a dict is True, allowing for None
     return bool(d) and d.ll_length() != 0
 
+def ll_dict_copy(DICT, d):
+    res = ootype.new(DICT)
+    ll_dict_update(res, d)
+    return res
+
+def ll_dict_update(d1, d2):
+    it = d2.ll_get_items_iterator()
+    while it.ll_go_next():
+        key = it.ll_current_key()
+        value = it.ll_current_value()
+        d1.ll_set(key, value)
+
+
 def ll_dict_getitem(d, key):
     # TODO: this is inefficient because it does two lookups
     if d.ll_contains(key):

Modified: pypy/dist/pypy/rpython/rdict.py
==============================================================================
--- pypy/dist/pypy/rpython/rdict.py	(original)
+++ pypy/dist/pypy/rpython/rdict.py	Tue Apr 25 19:02:03 2006
@@ -81,6 +81,7 @@
 
 
 class AbstractDictIteratorRepr(rmodel.IteratorRepr):
+
     def newiter(self, hop):
         v_dict, = hop.inputargs(self.r_dict)
         citerptr = hop.inputconst(lltype.Void, self.lowleveltype)

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	Tue Apr 25 19:02:03 2006
@@ -857,3 +857,38 @@
             return tot1, tot2
         res = self.ll_to_tuple(self.interpret(func, [42, 13]), 2)
         assert res == (55, 57)
+
+    def test_copy(self):
+        def func(x, y):
+            d = {x: x+1, y: y+1}
+            d2 = d.copy()
+            d[x] = 0
+            d[y] = 0
+            tot1 = 0
+            tot2 = 0
+            for key, value in  d2.iteritems():
+                tot1 += key
+                tot2 += value
+            return tot1, tot2
+        res = self.ll_to_tuple(self.interpret(func, [42, 13]), 2)
+        assert res == (55, 57)
+
+    def test_update(self):
+        def func():
+            dic = {1:1000, 2:200}
+            d2 = {2:30, 3:4}
+            dic.update(d2)
+            ok = len(dic) == 3
+            sum = ok
+            for key in dic:
+                sum += dic[key]
+            return sum
+        res = self.interpret(func, ())
+        assert res == 1035
+
+    def test_clear(self):
+        def func():
+            dic = {1: 2, 3:4}
+            dic.clear()
+            return len(dic)
+        assert self.interpret(func, ()) == 0



More information about the Pypy-commit mailing list