diff options
-rw-r--r-- | Lib/_collections_abc.py | 2 | ||||
-rw-r--r-- | Lib/test/test_collections.py | 12 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2018-08-20-13-53-10.bpo-34427.tMRQjl.rst | 1 |
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. |