Author: Armin Rigo <ar...@tunes.org>
Branch: py3.5
Changeset: r87854:b34556478b94
Date: 2016-10-18 10:46 +0200
http://bitbucket.org/pypy/pypy/changeset/b34556478b94/

Log:    merge heads

diff --git a/pypy/module/_collections/interp_deque.py 
b/pypy/module/_collections/interp_deque.py
--- a/pypy/module/_collections/interp_deque.py
+++ b/pypy/module/_collections/interp_deque.py
@@ -177,6 +177,7 @@
 
     def add(self, w_iterable):
         copy = W_Deque(self.space)
+        copy.maxlen = self.maxlen
         copy.extend(self.iter())
         copy.extend(w_iterable)
         return self.space.wrap(copy)
@@ -188,6 +189,7 @@
     def mul(self, w_int):
         space = self.space
         copied = W_Deque(space)
+        copied.maxlen = self.maxlen
         num = space.int_w(w_int)
 
         for _ in range(num):
@@ -200,9 +202,16 @@
 
     def imul(self, w_int):
         space = self.space
+        num = space.int_w(w_int)
+        if self.len == 0 or num == 1:
+            return space.wrap(self)
+        if num <= 0:
+            self.clear()
+            return space.wrap(self)
+        # use a copy to extend self
         copy = W_Deque(space)
+        copy.maxlen = self.maxlen
         copy.extend(self.iter())
-        num = space.int_w(w_int)
 
         for _ in range(num - 1):
             self.extend(copy)
@@ -372,13 +381,15 @@
     def insert(self, index, w_value):
         space = self.space
         n = space.len_w(self)
-        if n == self.maxlen:
+        if n >= self.maxlen:
             raise oefmt(space.w_IndexError, "deque already at its maximum 
size")
 
         if index >= n:
             self.append(w_value)
+            return
         if index <= -n or index == 0:
             self.appendleft(w_value)
+            return
 
         self.rotate(-index)
         if index < 0:
diff --git a/pypy/module/_collections/test/test_deque.py 
b/pypy/module/_collections/test/test_deque.py
--- a/pypy/module/_collections/test/test_deque.py
+++ b/pypy/module/_collections/test/test_deque.py
@@ -350,6 +350,12 @@
         d *= 3
         assert d == deque([1,2,3]*3)
         assert d is not deque([1,2,3]*3)
+        d = deque('a')
+        for n in (-10, -1, 0, 1, 2, 10, 1000):
+            d = deque('a')
+            d *= n
+            assert d == deque('a' * n)
+            assert d.maxlen is None
 
     def test_deque_insert(self):
         from _collections import deque
@@ -386,3 +392,28 @@
         d = deque([1,2])
         assert 2 * d == deque([1,2,1,2])
         assert -5 * d == deque()
+
+    def test_deque_maxlen(self):
+        from _collections import deque
+        g = deque('abcdef', maxlen=4)
+        assert len(g) == 4 and g == deque('cdef')
+        h = deque('gh')
+        assert ''.join(g + h) == 'efgh'
+        assert g + h == deque('efgh')
+
+    def test_deque_insert2(self):
+        from _collections import deque
+        elements = 'ABCDEFGHI'
+        for i in range(-5 - len(elements)*2, 5 + len(elements) * 2):
+            d = deque('ABCDEFGHI')
+            s = list('ABCDEFGHI')
+            d.insert(i, 'Z')
+            s.insert(i, 'Z')
+            assert list(d) == s
+
+    def test_deque_index_overflow_start_end(self):
+        from _collections import deque
+        import sys
+        elements = 'ABCDEFGHI'
+        d = deque([-2, -1, 0, 0, 1, 2])
+        assert a.index(0, -4*sys.maxsize, 4*sys.maxsize) == 2
diff --git a/pypy/objspace/std/intobject.py b/pypy/objspace/std/intobject.py
--- a/pypy/objspace/std/intobject.py
+++ b/pypy/objspace/std/intobject.py
@@ -902,13 +902,12 @@
         if space.isinstance_w(w_value, space.w_unicode):
             from pypy.objspace.std.unicodeobject import unicode_to_decimal_w
             s = unicode_to_decimal_w(space, w_value, allow_surrogates=True)
+        elif (space.isinstance_w(w_value, space.w_bytes) or
+              space.isinstance_w(w_value, space.w_bytearray)):
+            s = space.bufferstr_w(w_value)
         else:
-            try:
-                s = space.bufferstr_w(w_value)
-            except OperationError as e:
-                raise oefmt(space.w_TypeError,
-                            "int() can't convert non-string with explicit "
-                            "base")
+            raise oefmt(space.w_TypeError,
+                        "int() can't convert non-string with explicit base")
 
         return _string_to_int_or_long(space, w_inttype, w_value, s, base)
 
diff --git a/pypy/objspace/std/test/test_intobject.py 
b/pypy/objspace/std/test/test_intobject.py
--- a/pypy/objspace/std/test/test_intobject.py
+++ b/pypy/objspace/std/test/test_intobject.py
@@ -602,6 +602,11 @@
         assert m is False
         assert len(log) == 2
 
+    def test_int_nonstr_with_base(self):
+        assert int(b'100', 2) == 4
+        assert int(bytearray(b'100'), 2) == 4
+        raises(TypeError, int, memoryview(b'100'), 2)
+
 
 class AppTestIntShortcut(AppTestInt):
     spaceconfig = {"objspace.std.intshortcut": True}
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to