[Python-checkins] cpython (2.7): Defer deleted item decref until after the deque is restored to a consistent

raymond.hettinger python-checkins at python.org
Sat May 2 19:53:33 CEST 2015


https://hg.python.org/cpython/rev/fb6c2fbbde34
changeset: 95844:fb6c2fbbde34
branch: 2.7
parent: 95841:d356e68de236
user: Raymond Hettinger <python at rcn.com>
date: Sat May 02 10:53:27 2015 -0700
summary:
 Defer deleted item decref until after the deque is restored to a consistent state.
files:
 Misc/NEWS | 4 ++++
 Modules/_collectionsmodule.c | 14 +++++++-------
 2 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -26,6 +26,10 @@
 - Issues #24099, #24100, and #24101: Fix free-after-use bug in heapq's siftup
 and siftdown functions.
 
+- Backport collections.deque fixes from Python 3.5. Prevents reentrant badness
+ during deletion by deferring the decref until the container has been restored
+ to a consistent state.
+
 - Issue #23842: os.major(), os.minor() and os.makedev() now support ints again.
 
 - Issue #23811: Add missing newline to the PyCompileError error message.
diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c
--- a/Modules/_collectionsmodule.c
+++ b/Modules/_collectionsmodule.c
@@ -623,9 +623,9 @@
 if (cmp > 0) {
 PyObject *tgt = deque_popleft(deque, NULL);
 assert (tgt != NULL);
+ if (_deque_rotate(deque, i))
+ return NULL;
 Py_DECREF(tgt);
- if (_deque_rotate(deque, i) == -1)
- return NULL;
 Py_RETURN_NONE;
 }
 else if (cmp < 0) {
@@ -706,16 +706,16 @@
 deque_del_item(dequeobject *deque, Py_ssize_t i)
 {
 PyObject *item;
+ int rv;
 
- assert (i >= 0 && i < deque->len);
- if (_deque_rotate(deque, -i) == -1)
+ assert (i >= 0 && i < Py_SIZE(deque));
+ if (_deque_rotate(deque, -i))
 return -1;
-
 item = deque_popleft(deque, NULL);
+ rv = _deque_rotate(deque, i);
 assert (item != NULL);
 Py_DECREF(item);
-
- return _deque_rotate(deque, i);
+ return rv;
 }
 
 static int
-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /