From 476637795fc0ca8a3cf3f329f9ca240f99528e02 Mon Sep 17 00:00:00 2001 From: Naris Date: Sun, 19 Aug 2018 11:54:55 +1000 Subject: [PATCH 1/6] islice values when calling MutableSequence.extend on self --- Lib/_collections_abc.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Lib/_collections_abc.py b/Lib/_collections_abc.py index dbe30dff1fe190..deeb2424640968 100644 --- a/Lib/_collections_abc.py +++ b/Lib/_collections_abc.py @@ -7,6 +7,7 @@ """ from abc import ABCMeta, abstractmethod +from itertools import islice import sys __all__ = ["Awaitable", "Coroutine", @@ -986,6 +987,8 @@ def reverse(self): def extend(self, values): 'S.extend(iterable) -- extend sequence by appending elements from the iterable' + if values is self: + values = islice(self, len(self)) for v in values: self.append(v) From 351ea2b2947390e9c626d10dc3eb632ea165b7c6 Mon Sep 17 00:00:00 2001 From: Naris Date: Mon, 20 Aug 2018 11:35:04 +1000 Subject: [PATCH 2/6] create copy using list(values) --- Lib/_collections_abc.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Lib/_collections_abc.py b/Lib/_collections_abc.py index deeb2424640968..c363987970b4c6 100644 --- a/Lib/_collections_abc.py +++ b/Lib/_collections_abc.py @@ -7,7 +7,6 @@ """ from abc import ABCMeta, abstractmethod -from itertools import islice import sys __all__ = ["Awaitable", "Coroutine", @@ -988,7 +987,7 @@ def reverse(self): def extend(self, values): 'S.extend(iterable) -- extend sequence by appending elements from the iterable' if values is self: - values = islice(self, len(self)) + values = list(values) for v in values: self.append(v) From 7183136b0c3a4d2594db2e1d670b4aa3eeeb6f32 Mon Sep 17 00:00:00 2001 From: Naris Date: Mon, 20 Aug 2018 11:48:48 +1000 Subject: [PATCH 3/6] added tests to mutable sequence subclass --- Lib/test/test_collections.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index 2099d236d0c4a1..19f95f50b7098c 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -1721,6 +1721,17 @@ def insert(self, index, value): mss.clear() self.assertEqual(len(mss), 0) + # issue 34427 + # extending self should not cause infinite loop + items = 'ABCD' + mss2 = MutableSequenceSubclass(items + items) + mss.clear() + mss.extend(items) + mss.extend(mss) + self.assertEqual(len(mss), len(mss2)) + self.assertEqual(list(mss), list(mss2)) + + ################################################################################ ### Counter ################################################################################ From 7dea2abf66f822e626e49a35a4c07f24a2c9dee2 Mon Sep 17 00:00:00 2001 From: Naris Date: Mon, 20 Aug 2018 13:54:43 +1000 Subject: [PATCH 4/6] news for behaviour change --- .../NEWS.d/next/Library/2018-08-20-13-53-10.bpo-34427.tMRQjl.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Misc/NEWS.d/next/Library/2018-08-20-13-53-10.bpo-34427.tMRQjl.rst 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 00000000000000..936d34336f122b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-08-20-13-53-10.bpo-34427.tMRQjl.rst @@ -0,0 +1 @@ +Fix ``a.extend(a)`` for ``MutableSequence`` subclasses From 89f6ab2bd24283fdc279d3037b154c8b51f68013 Mon Sep 17 00:00:00 2001 From: Naris Date: Tue, 21 Aug 2018 00:02:15 +1000 Subject: [PATCH 5/6] fixed test --- Lib/test/test_collections.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index 19f95f50b7098c..0b7cb5848b1b8f 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -1724,7 +1724,8 @@ def insert(self, index, value): # issue 34427 # extending self should not cause infinite loop items = 'ABCD' - mss2 = MutableSequenceSubclass(items + items) + mss2 = MutableSequenceSubclass() + mss2.extend(items + items) mss.clear() mss.extend(items) mss.extend(mss) From 594ed4a30db34a474584fa3c873a4d121c67376f Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 26 Aug 2018 23:42:42 -0700 Subject: [PATCH 6/6] Make the blurb entry more specific. --- .../next/Library/2018-08-20-13-53-10.bpo-34427.tMRQjl.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 936d34336f122b..f6e0e030b7fec7 100644 --- 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 @@ -1 +1 @@ -Fix ``a.extend(a)`` for ``MutableSequence`` subclasses +Fix infinite loop in ``a.extend(a)`` for ``MutableSequence`` subclasses.