diff --git a/Misc/NEWS.d/next/Library/2026-06-23-15-02-27.gh-issue-152017.wH89hr.rst b/Misc/NEWS.d/next/Library/2026-06-23-15-02-27.gh-issue-152017.wH89hr.rst new file mode 100644 index 000000000000000..b903e39d6215054 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-06-23-15-02-27.gh-issue-152017.wH89hr.rst @@ -0,0 +1 @@ +:class:`collections.deque` no longer suppresses :exc:`MemoryError` in certain cases. diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index 0626cc6a70bc8f7..a471501ae18d7d2 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -175,17 +175,11 @@ struct dequeobject { static inline block * newblock(dequeobject *deque) { - block *b; if (deque->numfreeblocks) { deque->numfreeblocks--; return deque->freeblocks[deque->numfreeblocks]; } - b = PyMem_Malloc(sizeof(block)); - if (b != NULL) { - return b; - } - PyErr_NoMemory(); - return NULL; + return PyMem_Malloc(sizeof(block)); } static inline void @@ -212,6 +206,7 @@ deque_new(PyTypeObject *type, PyObject *args, PyObject *kwds) b = newblock(deque); if (b == NULL) { + PyErr_NoMemory(); Py_DECREF(deque); return NULL; } @@ -343,6 +338,7 @@ deque_append_lock_held(dequeobject *deque, PyObject *item, Py_ssize_t maxlen) if (deque->rightindex == BLOCKLEN - 1) { block *b = newblock(deque); if (b == NULL) { + PyErr_NoMemory(); Py_DECREF(item); return -1; } @@ -392,6 +388,7 @@ deque_appendleft_lock_held(dequeobject *deque, PyObject *item, if (deque->leftindex == 0) { block *b = newblock(deque); if (b == NULL) { + PyErr_NoMemory(); Py_DECREF(item); return -1; } @@ -746,7 +743,6 @@ deque_clear(PyObject *self) b = newblock(deque); if (b == NULL) { - PyErr_Clear(); goto alternate_method; } @@ -857,6 +853,7 @@ deque_inplace_repeat_impl(dequeobject *deque, Py_ssize_t n) if (deque->rightindex == BLOCKLEN - 1) { block *b = newblock(deque); if (b == NULL) { + PyErr_NoMemory(); Py_SET_SIZE(deque, Py_SIZE(deque) + i); return NULL; } @@ -977,8 +974,10 @@ _deque_rotate(dequeobject *deque, Py_ssize_t n) if (leftindex == 0) { if (b == NULL) { b = newblock(deque); - if (b == NULL) + if (b == NULL) { + PyErr_NoMemory(); goto done; + } } b->rightlink = leftblock; CHECK_END(leftblock->leftlink); @@ -1021,8 +1020,10 @@ _deque_rotate(dequeobject *deque, Py_ssize_t n) if (rightindex == BLOCKLEN - 1) { if (b == NULL) { b = newblock(deque); - if (b == NULL) + if (b == NULL) { + PyErr_NoMemory(); goto done; + } } b->leftlink = rightblock; CHECK_END(rightblock->rightlink);