[pypy-commit] pypy remove-iter-smm: Kill iter SMMs.
Manuel Jacob
noreply at buildbot.pypy.org
Wed May 22 03:12:16 CEST 2013
Author: Manuel Jacob
Branch: remove-iter-smm
Changeset: r64418:447f13b83628
Date: 2013-05-22 01:01 +0200
http://bitbucket.org/pypy/pypy/changeset/447f13b83628/
Log: Kill iter SMMs.
diff --git a/pypy/objspace/std/iterobject.py b/pypy/objspace/std/iterobject.py
--- a/pypy/objspace/std/iterobject.py
+++ b/pypy/objspace/std/iterobject.py
@@ -9,6 +9,12 @@
class W_AbstractIterObject(W_Object):
__slots__ = ()
+ def descr_iter(self, space):
+ return self
+
+ def descr_next(self, space):
+ raise NotImplementedError
+
class W_AbstractSeqIterObject(W_AbstractIterObject):
def __init__(w_self, w_seq, index=0):
@@ -59,6 +65,8 @@
supply its own iterator, or be a sequence.
In the second form, the callable is called until it returns the sentinel.''',
+ __iter__ = gateway.interp2app(W_AbstractSeqIterObject.descr_iter),
+ next = gateway.interpindirect2app(W_AbstractSeqIterObject.descr_next),
__reduce__ = gateway.interp2app(W_AbstractSeqIterObject.descr_reduce),
__length_hint__ = gateway.interp2app(W_AbstractSeqIterObject.descr_length_hint),
)
@@ -69,10 +77,37 @@
class W_SeqIterObject(W_AbstractSeqIterObject):
"""Sequence iterator implementation for general sequences."""
+ def descr_next(self, space):
+ if self.w_seq is None:
+ raise OperationError(space.w_StopIteration, space.w_None)
+ try:
+ w_item = space.getitem(self.w_seq, space.wrap(self.index))
+ except OperationError, e:
+ self.w_seq = None
+ if not e.match(space, space.w_IndexError):
+ raise
+ raise OperationError(space.w_StopIteration, space.w_None)
+ self.index += 1
+ return w_item
+
class W_FastListIterObject(W_AbstractSeqIterObject): # XXX still needed
- """Sequence iterator specialized for lists.
- """
+ """Sequence iterator specialized for lists."""
+
+ def descr_next(self, space):
+ from pypy.objspace.std.listobject import W_ListObject
+ w_seq = self.w_seq
+ if w_seq is None:
+ raise OperationError(space.w_StopIteration, space.w_None)
+ assert isinstance(w_seq, W_ListObject)
+ index = self.index
+ try:
+ w_item = w_seq.getitem(index)
+ except IndexError:
+ self.w_seq = None
+ raise OperationError(space.w_StopIteration, space.w_None)
+ self.index = index + 1
+ return w_item
class W_FastTupleIterObject(W_AbstractSeqIterObject):
@@ -83,6 +118,19 @@
W_AbstractSeqIterObject.__init__(w_self, w_seq)
w_self.tupleitems = wrappeditems
+ def descr_next(self, space):
+ if self.tupleitems is None:
+ raise OperationError(space.w_StopIteration, space.w_None)
+ index = self.index
+ try:
+ w_item = self.tupleitems[index]
+ except IndexError:
+ self.tupleitems = None
+ self.w_seq = None
+ raise OperationError(space.w_StopIteration, space.w_None)
+ self.index = index + 1
+ return w_item
+
class W_ReverseSeqIterObject(W_Object):
def __init__(w_self, space, w_seq, index=-1):
@@ -121,7 +169,25 @@
w_len = space.wrap(0)
return w_len
+ def descr_iter(self, space):
+ return self
+
+ def descr_next(self, space):
+ if self.w_seq is None or self.index < 0:
+ raise OperationError(space.w_StopIteration, space.w_None)
+ try:
+ w_item = space.getitem(self.w_seq, space.wrap(self.index))
+ self.index -= 1
+ except OperationError, e:
+ self.w_seq = None
+ if not e.match(space, space.w_IndexError):
+ raise
+ raise OperationError(space.w_StopIteration, space.w_None)
+ return w_item
+
W_ReverseSeqIterObject.typedef = StdTypeDef("reversesequenceiterator",
+ __iter__ = gateway.interp2app(W_ReverseSeqIterObject.descr_iter),
+ next = gateway.interp2app(W_ReverseSeqIterObject.descr_next),
__reduce__ = gateway.interp2app(W_ReverseSeqIterObject.descr_reduce),
__length_hint__ = gateway.interp2app(W_ReverseSeqIterObject.descr_length_hint),
)
@@ -133,74 +199,3 @@
registerimplementation(W_FastListIterObject)
registerimplementation(W_FastTupleIterObject)
registerimplementation(W_ReverseSeqIterObject)
-
-def iter__SeqIter(space, w_seqiter):
- return w_seqiter
-
-def next__SeqIter(space, w_seqiter):
- if w_seqiter.w_seq is None:
- raise OperationError(space.w_StopIteration, space.w_None)
- try:
- w_item = space.getitem(w_seqiter.w_seq, space.wrap(w_seqiter.index))
- except OperationError, e:
- w_seqiter.w_seq = None
- if not e.match(space, space.w_IndexError):
- raise
- raise OperationError(space.w_StopIteration, space.w_None)
- w_seqiter.index += 1
- return w_item
-
-
-def iter__FastTupleIter(space, w_seqiter):
- return w_seqiter
-
-def next__FastTupleIter(space, w_seqiter):
- if w_seqiter.tupleitems is None:
- raise OperationError(space.w_StopIteration, space.w_None)
- index = w_seqiter.index
- try:
- w_item = w_seqiter.tupleitems[index]
- except IndexError:
- w_seqiter.tupleitems = None
- w_seqiter.w_seq = None
- raise OperationError(space.w_StopIteration, space.w_None)
- w_seqiter.index = index + 1
- return w_item
-
-
-def iter__FastListIter(space, w_seqiter):
- return w_seqiter
-
-def next__FastListIter(space, w_seqiter):
- from pypy.objspace.std.listobject import W_ListObject
- w_seq = w_seqiter.w_seq
- if w_seq is None:
- raise OperationError(space.w_StopIteration, space.w_None)
- assert isinstance(w_seq, W_ListObject)
- index = w_seqiter.index
- try:
- w_item = w_seq.getitem(index)
- except IndexError:
- w_seqiter.w_seq = None
- raise OperationError(space.w_StopIteration, space.w_None)
- w_seqiter.index = index + 1
- return w_item
-
-
-def iter__ReverseSeqIter(space, w_seqiter):
- return w_seqiter
-
-def next__ReverseSeqIter(space, w_seqiter):
- if w_seqiter.w_seq is None or w_seqiter.index < 0:
- raise OperationError(space.w_StopIteration, space.w_None)
- try:
- w_item = space.getitem(w_seqiter.w_seq, space.wrap(w_seqiter.index))
- w_seqiter.index -= 1
- except OperationError, e:
- w_seqiter.w_seq = None
- if not e.match(space, space.w_IndexError):
- raise
- raise OperationError(space.w_StopIteration, space.w_None)
- return w_item
-
-register_all(vars())
More information about the pypy-commit
mailing list