[pypy-svn] r70562 - pypy/trunk/pypy/objspace/std

cfbolz at codespeak.net cfbolz at codespeak.net
Wed Jan 13 16:24:01 CET 2010


Author: cfbolz
Date: Wed Jan 13 16:24:00 2010
New Revision: 70562

Modified:
   pypy/trunk/pypy/objspace/std/rangeobject.py
Log:
Unrelated things I found when staring at traces: make range object a bit more
efficient, reducing the number of comparisons when iterating over it (removes 2
guards when jitted). Test in test_pypy_c.py will follow.


Modified: pypy/trunk/pypy/objspace/std/rangeobject.py
==============================================================================
--- pypy/trunk/pypy/objspace/std/rangeobject.py	(original)
+++ pypy/trunk/pypy/objspace/std/rangeobject.py	Wed Jan 13 16:24:00 2010
@@ -56,7 +56,9 @@
     def getitem(w_self, i):
         if i < 0:
             i += w_self.length
-        if i >= w_self.length or i < 0:
+            if i < 0:
+                raise IndexError
+        elif i >= w_self.length:
             raise IndexError
         return w_self.start + i * w_self.step
 
@@ -194,24 +196,24 @@
     if w_rangelist is None:
         raise OperationError(space.w_StopIteration, space.w_None)
     assert isinstance(w_rangelist, W_RangeListObject)
+    index = w_rangeiter.index
     if w_rangelist.w_list is not None:
         try:
             w_item = space.getitem(w_rangelist.w_list,
-                                   wrapint(space, w_rangeiter.index))
+                                   wrapint(space, index))
         except OperationError, e:
             w_rangeiter.w_seq = None
             if not e.match(space, space.w_IndexError):
                 raise
             raise OperationError(space.w_StopIteration, space.w_None)
     else:
-        try:
-            w_item = wrapint(
-                space,
-                w_rangelist.getitem(w_rangeiter.index))
-        except IndexError:
+        if index >= w_rangelist.length:
             w_rangeiter.w_seq = None
             raise OperationError(space.w_StopIteration, space.w_None)
-    w_rangeiter.index += 1
+        w_item = wrapint(
+            space,
+            w_rangelist.getitem_unchecked(index))
+    w_rangeiter.index = index + 1
     return w_item
 
 # XXX __length_hint__()



More information about the Pypy-commit mailing list