Author: Manuel Jacob
Branch: 
Changeset: r64484:df1447de24d7
Date: 2013-05-22 22:13 +0200
http://bitbucket.org/pypy/pypy/changeset/df1447de24d7/

Log:    hg merge remove-iter-smm

diff --git a/pypy/doc/whatsnew-head.rst b/pypy/doc/whatsnew-head.rst
--- a/pypy/doc/whatsnew-head.rst
+++ b/pypy/doc/whatsnew-head.rst
@@ -31,3 +31,6 @@
 
 .. branch: remove-tuple-smm
 Remove multi-methods on tuple
+
+.. branch: remove-iter-smm
+Remove multi-methods on iterators
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
@@ -1,15 +1,11 @@
 """Generic iterator implementations"""
+from pypy.interpreter import gateway
+from pypy.interpreter.baseobjspace import W_Root
 from pypy.interpreter.error import OperationError
-from pypy.objspace.std.model import registerimplementation, W_Object
-from pypy.objspace.std.register_all import register_all
+from pypy.objspace.std.stdtypedef import StdTypeDef
 
 
-class W_AbstractIterObject(W_Object):
-    __slots__ = ()
-
-class W_AbstractSeqIterObject(W_AbstractIterObject):
-    from pypy.objspace.std.itertype import iter_typedef as typedef
-
+class W_AbstractSeqIterObject(W_Root):
     def __init__(w_self, w_seq, index=0):
         if index < 0:
             index = 0
@@ -26,12 +22,84 @@
             w_len = space.wrap(0)
         return w_len
 
+    def descr_iter(self, space):
+        return self
+
+    def descr_next(self, space):
+        raise NotImplementedError
+
+    def descr_reduce(self, space):
+        """
+        XXX to do: remove this __reduce__ method and do
+        a registration with copy_reg, instead.
+        """
+        from pypy.objspace.std.iterobject import W_AbstractSeqIterObject
+        assert isinstance(self, W_AbstractSeqIterObject)
+        from pypy.interpreter.mixedmodule import MixedModule
+        w_mod = space.getbuiltinmodule('_pickle_support')
+        mod = space.interp_w(MixedModule, w_mod)
+        new_inst = mod.get('seqiter_new')
+        tup = [self.w_seq, space.wrap(self.index)]
+        return space.newtuple([new_inst, space.newtuple(tup)])
+
+    def descr_length_hint(self, space):
+        from pypy.objspace.std.iterobject import W_AbstractSeqIterObject
+        assert isinstance(self, W_AbstractSeqIterObject)
+        return self.getlength(space)
+
+W_AbstractSeqIterObject.typedef = StdTypeDef(
+    "sequenceiterator",
+    __doc__ = '''iter(collection) -> iterator
+iter(callable, sentinel) -> iterator
+
+Get an iterator from an object.  In the first form, the argument must
+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),
+)
+W_AbstractSeqIterObject.typedef.acceptable_as_base_class = False
+
+
 class W_SeqIterObject(W_AbstractSeqIterObject):
     """Sequence iterator implementation for general sequences."""
 
-class W_FastListIterObject(W_AbstractSeqIterObject): # XXX still needed
-    """Sequence iterator specialized for lists.
-    """
+    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):
+    """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):
     """Sequence iterator specialized for tuples, accessing directly
@@ -41,87 +109,79 @@
         W_AbstractSeqIterObject.__init__(w_self, w_seq)
         w_self.tupleitems = wrappeditems
 
-class W_ReverseSeqIterObject(W_Object):
-    from pypy.objspace.std.itertype import reverse_iter_typedef as typedef
+    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_Root):
     def __init__(w_self, space, w_seq, index=-1):
         w_self.w_seq = w_seq
         w_self.w_len = space.len(w_seq)
         w_self.index = space.int_w(w_self.w_len) + index
 
+    def descr_reduce(self, space):
+        """
+        XXX to do: remove this __reduce__ method and do
+        a registration with copy_reg, instead.
+        """
+        from pypy.objspace.std.iterobject import W_ReverseSeqIterObject
+        assert isinstance(self, W_ReverseSeqIterObject)
+        from pypy.interpreter.mixedmodule import MixedModule
+        w_mod = space.getbuiltinmodule('_pickle_support')
+        mod = space.interp_w(MixedModule, w_mod)
+        new_inst = mod.get('reverseseqiter_new')
+        tup = [self.w_seq, space.wrap(self.index)]
+        return space.newtuple([new_inst, space.newtuple(tup)])
 
-registerimplementation(W_SeqIterObject)
-registerimplementation(W_FastListIterObject)
-registerimplementation(W_FastTupleIterObject)
-registerimplementation(W_ReverseSeqIterObject)
+    def descr_length_hint(self, space):
+        from pypy.objspace.std.iterobject import W_ReverseSeqIterObject
+        assert isinstance(self, W_ReverseSeqIterObject)
+        if self.w_seq is None:
+            return space.wrap(0)
+        index = self.index + 1
+        w_length = space.len(self.w_seq)
+        # if length of sequence is less than index :exhaust iterator
+        if space.is_true(space.gt(space.wrap(self.index), w_length)):
+            w_len = space.wrap(0)
+            self.w_seq = None
+        else:
+            w_len = space.wrap(index)
+        if space.is_true(space.lt(w_len, space.wrap(0))):
+            w_len = space.wrap(0)
+        return w_len
 
-def iter__SeqIter(space, w_seqiter):
-    return w_seqiter
+    def descr_iter(self, space):
+        return self
 
-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 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
 
-
-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())
+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),
+)
+W_ReverseSeqIterObject.typedef.acceptable_as_base_class = False
diff --git a/pypy/objspace/std/itertype.py b/pypy/objspace/std/itertype.py
deleted file mode 100644
--- a/pypy/objspace/std/itertype.py
+++ /dev/null
@@ -1,85 +0,0 @@
-from pypy.interpreter import gateway
-from pypy.objspace.std.stdtypedef import StdTypeDef
-from pypy.interpreter.error import OperationError
-
-# ____________________________________________________________
-
-def descr_seqiter__reduce__(w_self, space):
-    """
-    XXX to do: remove this __reduce__ method and do
-    a registration with copy_reg, instead.
-    """
-
-    # cpython does not support pickling iterators but stackless python do
-    #msg = 'Pickling for iterators dissabled as cpython does not support it'
-    #raise OperationError(space.w_TypeError, space.wrap(msg))
-
-    from pypy.objspace.std.iterobject import W_AbstractSeqIterObject
-    assert isinstance(w_self, W_AbstractSeqIterObject)
-    from pypy.interpreter.mixedmodule import MixedModule
-    w_mod    = space.getbuiltinmodule('_pickle_support')
-    mod      = space.interp_w(MixedModule, w_mod)
-    new_inst = mod.get('seqiter_new')
-    tup      = [w_self.w_seq, space.wrap(w_self.index)]
-    return space.newtuple([new_inst, space.newtuple(tup)])
-
-
-def descr_seqiter__length_hint__(space, w_self):
-    from pypy.objspace.std.iterobject import W_AbstractSeqIterObject
-    assert isinstance(w_self, W_AbstractSeqIterObject)
-    return w_self.getlength(space)
-
-# ____________________________________________________________
-
-def descr_reverseseqiter__reduce__(w_self, space):
-    """
-    XXX to do: remove this __reduce__ method and do
-    a registration with copy_reg, instead.
-    """
-    from pypy.objspace.std.iterobject import W_ReverseSeqIterObject
-    assert isinstance(w_self, W_ReverseSeqIterObject)
-    from pypy.interpreter.mixedmodule import MixedModule
-    w_mod    = space.getbuiltinmodule('_pickle_support')
-    mod      = space.interp_w(MixedModule, w_mod)
-    new_inst = mod.get('reverseseqiter_new')
-    tup      = [w_self.w_seq, space.wrap(w_self.index)]
-    return space.newtuple([new_inst, space.newtuple(tup)])
-
-
-def descr_reverseseqiter__length_hint__(space, w_self):
-    from pypy.objspace.std.iterobject import W_ReverseSeqIterObject
-    assert isinstance(w_self, W_ReverseSeqIterObject)
-    if w_self.w_seq is None:
-        return space.wrap(0)
-    index = w_self.index + 1
-    w_length = space.len(w_self.w_seq)
-    # if length of sequence is less than index :exhaust iterator
-    if space.is_true(space.gt(space.wrap(w_self.index), w_length)):
-        w_len = space.wrap(0)
-        w_self.w_seq = None
-    else:
-        w_len = space.wrap(index)
-    if space.is_true(space.lt(w_len, space.wrap(0))):
-        w_len = space.wrap(0)
-    return w_len
-
-# ____________________________________________________________
-iter_typedef = StdTypeDef("sequenceiterator",
-    __doc__ = '''iter(collection) -> iterator
-iter(callable, sentinel) -> iterator
-
-Get an iterator from an object.  In the first form, the argument must
-supply its own iterator, or be a sequence.
-In the second form, the callable is called until it returns the sentinel.''',
-
-    __reduce__ = gateway.interp2app(descr_seqiter__reduce__),
-    __length_hint__ = gateway.interp2app(descr_seqiter__length_hint__),
-    )
-iter_typedef.acceptable_as_base_class = False
-
-reverse_iter_typedef = StdTypeDef("reversesequenceiterator",
-
-    __reduce__ = gateway.interp2app(descr_reverseseqiter__reduce__),
-    __length_hint__ = gateway.interp2app(descr_reverseseqiter__length_hint__),
-    )
-reverse_iter_typedef.acceptable_as_base_class = False
diff --git a/pypy/objspace/std/model.py b/pypy/objspace/std/model.py
--- a/pypy/objspace/std/model.py
+++ b/pypy/objspace/std/model.py
@@ -44,7 +44,6 @@
             from pypy.objspace.std.longtype   import long_typedef
             from pypy.objspace.std.unicodetype import unicode_typedef
             from pypy.objspace.std.nonetype import none_typedef
-            from pypy.objspace.std.itertype import iter_typedef
         self.pythontypes = [value for key, value in result.__dict__.items()
                             if not key.startswith('_')]   # don't look
 
@@ -81,6 +80,7 @@
         self.pythontypes.append(dictmultiobject.W_DictMultiObject.typedef)
         self.pythontypes.append(setobject.W_SetObject.typedef)
         self.pythontypes.append(setobject.W_FrozensetObject.typedef)
+        self.pythontypes.append(iterobject.W_AbstractSeqIterObject.typedef)
 
         # the set of implementation types
         self.typeorder = {
@@ -95,10 +95,6 @@
             longobject.W_LongObject: [],
             noneobject.W_NoneObject: [],
             complexobject.W_ComplexObject: [],
-            iterobject.W_SeqIterObject: [],
-            iterobject.W_FastListIterObject: [],
-            iterobject.W_FastTupleIterObject: [],
-            iterobject.W_ReverseSeqIterObject: [],
             unicodeobject.W_UnicodeObject: [],
             pypy.interpreter.pycode.PyCode: [],
             pypy.interpreter.special.Ellipsis: [],
diff --git a/pypy/objspace/std/objspace.py b/pypy/objspace/std/objspace.py
--- a/pypy/objspace/std/objspace.py
+++ b/pypy/objspace/std/objspace.py
@@ -19,6 +19,7 @@
 from pypy.objspace.std.dictmultiobject import W_DictMultiObject
 from pypy.objspace.std.floatobject import W_FloatObject
 from pypy.objspace.std.intobject import W_IntObject
+from pypy.objspace.std.iterobject import W_AbstractSeqIterObject
 from pypy.objspace.std.listobject import W_ListObject
 from pypy.objspace.std.longobject import W_LongObject, newlong
 from pypy.objspace.std.noneobject import W_NoneObject
@@ -668,6 +669,8 @@
         self._interplevel_classes[self.w_list] = W_ListObject
         self._interplevel_classes[self.w_set] = W_SetObject
         self._interplevel_classes[self.w_tuple] = W_AbstractTupleObject
+        self._interplevel_classes[self.w_sequenceiterator] = \
+                W_AbstractSeqIterObject
 
     @specialize.memo()
     def _get_interplevel_cls(self, w_type):
diff --git a/pypy/objspace/std/test/test_lengthhint.py 
b/pypy/objspace/std/test/test_lengthhint.py
--- a/pypy/objspace/std/test/test_lengthhint.py
+++ b/pypy/objspace/std/test/test_lengthhint.py
@@ -74,7 +74,7 @@
         self._test_length_hint(self.space.wrap(u'Y' * self.SIZE))
 
     def test_tuple(self):
-        self._test_length_hint(self.space.newtuple(self.ITEMS))
+        self._test_length_hint(self.space.wrap(tuple(self.ITEMS)))
 
     def test_reversed(self):
         # test the generic reversed iterator (w_foo lacks __reversed__)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to