summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/_collections_abc.py2
-rw-r--r--Lib/test/test_collections.py12
-rw-r--r--Misc/NEWS.d/next/Library/2018-08-20-13-53-10.bpo-34427.tMRQjl.rst1
3 files changed, 15 insertions, 0 deletions
diff --git a/Lib/_collections_abc.py b/Lib/_collections_abc.py
index dbe30df..c363987 100644
--- a/Lib/_collections_abc.py
+++ b/Lib/_collections_abc.py
@@ -986,6 +986,8 @@ class MutableSequence(Sequence):
def extend(self, values):
'S.extend(iterable) -- extend sequence by appending elements from the iterable'
+ if values is self:
+ values = list(values)
for v in values:
self.append(v)
diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py
index 2099d23..0b7cb58 100644
--- a/Lib/test/test_collections.py
+++ b/Lib/test/test_collections.py
@@ -1721,6 +1721,18 @@ class TestCollectionABCs(ABCTestCase):
mss.clear()
self.assertEqual(len(mss), 0)
+ # issue 34427
+ # extending self should not cause infinite loop
+ items = 'ABCD'
+ mss2 = MutableSequenceSubclass()
+ mss2.extend(items + items)
+ mss.clear()
+ mss.extend(items)
+ mss.extend(mss)
+ self.assertEqual(len(mss), len(mss2))
+ self.assertEqual(list(mss), list(mss2))
+
+
################################################################################
### Counter
################################################################################
diff --git a/Misc/NEWS.d/next/Library/2018-08-20-13-53-10.bpo-34427.tMRQjl.rst b/Misc/NEWS.d/next/Library/2018-08-20-13-53-10.bpo-34427.tMRQjl.rst
new file mode 100644
index 0000000..f6e0e03
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2018-08-20-13-53-10.bpo-34427.tMRQjl.rst
@@ -0,0 +1 @@
+Fix infinite loop in ``a.extend(a)`` for ``MutableSequence`` subclasses.