[pypy-svn] pypy default: Fix product() when given non-tuple but iterable arguments.

arigo commits-noreply at bitbucket.org
Tue Jan 25 17:47:59 CET 2011


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r41309:16ec3f5e8424
Date: 2011-01-24 16:04 +0100
http://bitbucket.org/pypy/pypy/changeset/16ec3f5e8424/

Log:	Fix product() when given non-tuple but iterable arguments.

diff --git a/pypy/module/itertools/test/test_itertools.py b/pypy/module/itertools/test/test_itertools.py
--- a/pypy/module/itertools/test/test_itertools.py
+++ b/pypy/module/itertools/test/test_itertools.py
@@ -729,6 +729,9 @@
         prodlist = product(l, m)
         assert list(prodlist) == [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]
 
+        prodlist = product(iter(l), iter(m))
+        assert list(prodlist) == [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]
+
     def test_product_repeat(self):
         from itertools import product
         l = [1, 2]

diff --git a/pypy/module/itertools/interp_itertools.py b/pypy/module/itertools/interp_itertools.py
--- a/pypy/module/itertools/interp_itertools.py
+++ b/pypy/module/itertools/interp_itertools.py
@@ -1036,11 +1036,11 @@
 
     def __init__(self, space, args_w, w_repeat):
         self.space = space
-        self.gears_w = args_w * space.int_w(w_repeat)
-        self.num_gears = len(self.gears_w)
+        args = [space.fixedview(w_arg) for w_arg in args_w]
+        self.gears = args * space.int_w(w_repeat)
+        self.num_gears = len(self.gears)
         # initialization of indicies to loop over
-        self.indicies = [(0, space.int_w(space.len(w_gear)))
-                         for w_gear in self.gears_w]
+        self.indicies = [(0, len(gear)) for gear in self.gears]
         self.cont = True
         for _, lim in self.indicies:
             if lim <= 0:
@@ -1082,8 +1082,7 @@
         l = [None] * self.num_gears
         for x in range(0, self.num_gears):
             index, limit = self.indicies[x]
-            l[x] = self.space.getitem(self.gears_w[x],
-                                      self.space.wrap(index))
+            l[x] = self.gears[x][index]
         self.roll_gears()
         return self.space.newtuple(l)
 


More information about the Pypy-commit mailing list