[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