[pypy-svn] r58252 - pypy/branch/tuple-nonresizable-395/pypy/objspace/std

arigo at codespeak.net arigo at codespeak.net
Sat Sep 20 12:23:18 CEST 2008


Author: arigo
Date: Sat Sep 20 12:23:18 2008
New Revision: 58252

Modified:
   pypy/branch/tuple-nonresizable-395/pypy/objspace/std/iterobject.py
Log:
Factor out common code, assuming that len(iterobject) is not a
completely performance-critical operation.


Modified: pypy/branch/tuple-nonresizable-395/pypy/objspace/std/iterobject.py
==============================================================================
--- pypy/branch/tuple-nonresizable-395/pypy/objspace/std/iterobject.py	(original)
+++ pypy/branch/tuple-nonresizable-395/pypy/objspace/std/iterobject.py	Sat Sep 20 12:23:18 2008
@@ -16,6 +16,16 @@
         w_self.w_seq = w_seq
         w_self.index = index
 
+    def getlength(self, space):
+        if self.w_seq is None:
+            return space.wrap(0)
+        index = self.index
+        w_length = space.len(self.w_seq)
+        w_len = space.sub(w_length, space.wrap(index))
+        if space.is_true(space.lt(w_len,space.wrap(0))):
+            w_len = space.wrap(0)
+        return w_len
+
 class W_SeqIterObject(W_AbstractSeqIterObject):
     """Sequence iterator implementation for general sequences."""
 
@@ -66,14 +76,7 @@
     return w_item
 
 def len__SeqIter(space,  w_seqiter):
-    if w_seqiter.w_seq is None:
-        return space.wrap(0)
-    index = w_seqiter.index
-    w_length = space.len(w_seqiter.w_seq)
-    w_len = space.sub(w_length, space.wrap(index))
-    if space.is_true(space.lt(w_len,space.wrap(0))):
-        w_len = space.wrap(0)
-    return w_len
+    return w_seqiter.getlength(space)
 
 
 def iter__FastTupleIter(space, w_seqiter):
@@ -93,13 +96,7 @@
     return w_item
 
 def len__FastTupleIter(space, w_seqiter):
-    if w_seqiter.tupleitems is None:
-        return space.wrap(0)
-    totallength = len(w_seqiter.tupleitems)
-    remaining = totallength - w_seqiter.index
-    if remaining < 0:
-        remaining = 0
-    return space.wrap(remaining)
+    return w_seqiter.getlength(space)
 
 
 def iter__FastListIter(space, w_seqiter):
@@ -119,13 +116,7 @@
     return w_item
 
 def len__FastListIter(space, w_seqiter):
-    if w_seqiter.listitems is None:
-        return space.wrap(0)
-    totallength = len(w_seqiter.listitems)
-    remaining = totallength - w_seqiter.index
-    if remaining < 0:
-        remaining = 0
-    return space.wrap(remaining)
+    return w_seqiter.getlength(space)
 
 
 def iter__ReverseSeqIter(space, w_seqiter):



More information about the Pypy-commit mailing list