[pypy-svn] r26318 - pypy/dist/pypy/rpython/ootypesystem

antocuni at codespeak.net antocuni at codespeak.net
Tue Apr 25 11:54:10 CEST 2006


Author: antocuni
Date: Tue Apr 25 11:53:55 2006
New Revision: 26318

Modified:
   pypy/dist/pypy/rpython/ootypesystem/ootype.py
   pypy/dist/pypy/rpython/ootypesystem/rdict.py
Log:
rdict's keys(), values() and items() are now implemented on top of
ll_get_items_iterator().  The deprecated ll_keys() has been removed
from Dict's interface.



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 11:53:55 2006
@@ -358,7 +358,6 @@
             "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_keys": Meth([], List(self.KEYTYPE_T)), # deprecated
             "ll_get_items_iterator": Meth([], DictItemsIterator(self.KEYTYPE_T, self.VALUETYPE_T)),
         })
 
@@ -796,12 +795,6 @@
         assert typeOf(key) == self._TYPE._KEYTYPE
         return key in self._dict
 
-    def ll_keys(self):
-        # NOT_RPYTHON
-        keys = _list(List(self._TYPE._KEYTYPE))
-        keys._list = self._dict.keys()
-        return keys
-
     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 11:53:55 2006
@@ -90,21 +90,21 @@
         return self.recast_value(hop.llops, v_res)
 
     def rtype_method_keys(self, hop):
-        hop.exception_cannot_occur()        
-        return self.send_message(hop, 'll_keys')
+        return self._rtype_method_kvi(hop, dum_keys)
 
     def rtype_method_values(self, hop):
-        return self._rtype_method_vi(hop, dum_values)
+        return self._rtype_method_kvi(hop, dum_values)
 
     def rtype_method_items(self, hop):
-        return self._rtype_method_vi(hop, dum_items)
+        return self._rtype_method_kvi(hop, dum_items)
 
-    def _rtype_method_vi(self, hop, spec):
+    def _rtype_method_kvi(self, hop, spec):
         v_dict, = hop.inputargs(self)
         r_list = hop.r_result
         cLIST = hop.inputconst(ootype.Void, r_list.lowleveltype)
-        c_func = hop.inputconst(ootype.Void, spec)        
-        return hop.gendirectcall(ll_dict_values_items, v_dict, cLIST, c_func)
+        c_func = hop.inputconst(ootype.Void, spec)
+        hop.exception_cannot_occur()
+        return hop.gendirectcall(ll_dict_kvi, v_dict, cLIST, c_func)
 
     def rtype_method_iterkeys(self, hop):
         hop.exception_cannot_occur()
@@ -183,23 +183,23 @@
         d.ll_set(key, default)
         return default
 
-def ll_dict_values_items(d, LIST, func):
-    keys = d.ll_keys()
-    length = keys.ll_length()
+def ll_dict_kvi(d, LIST, func):
+    length = d.ll_length()
     result = ll_newlist(LIST, length)
+    it = d.ll_get_items_iterator()
     i = 0
-    while i < length:
-        key = keys.ll_getitem_fast(i)
-        value = d.ll_get(key)
+    while it.ll_go_next():
+        if func is dum_keys:
+            result.ll_setitem_fast(i, it.ll_current_key())
+        elif func is dum_values:
+            result.ll_setitem_fast(i, it.ll_current_value())
         if func is dum_items:
             r = ootype.new(LIST._ITEMTYPE)
-            r.item0 = key   # TODO: do we need casting?
-            r.item1 = value
+            r.item0 = it.ll_current_key()   # TODO: do we need casting?
+            r.item1 = it.ll_current_value()
             result.ll_setitem_fast(i, r)
-        elif func is dum_values:
-            result.ll_setitem_fast(i, value)
-
         i += 1
+    #assert i == length
     return result
 
 
@@ -242,3 +242,4 @@
         res.item0 = it.ll_current_key()
         res.item1 = it.ll_current_value()
         return res
+



More information about the Pypy-commit mailing list