summaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/src/Modules/_collectionsmodule.c
diff options
context:
space:
mode:
authorshadchin <[email protected]>2022-04-18 12:39:32 +0300
committershadchin <[email protected]>2022-04-18 12:39:32 +0300
commitd4be68e361f4258cf0848fc70018dfe37a2acc24 (patch)
tree153e294cd97ac8b5d7a989612704a0c1f58e8ad4 /contrib/tools/python3/src/Modules/_collectionsmodule.c
parent260c02f5ccf242d9d9b8a873afaf6588c00237d6 (diff)
IGNIETFERRO-1816 Update Python 3 from 3.9.12 to 3.10.4
ref:9f96be6d02ee8044fdd6f124b799b270c20ce641
Diffstat (limited to 'contrib/tools/python3/src/Modules/_collectionsmodule.c')
-rw-r--r--contrib/tools/python3/src/Modules/_collectionsmodule.c104
1 files changed, 65 insertions, 39 deletions
diff --git a/contrib/tools/python3/src/Modules/_collectionsmodule.c b/contrib/tools/python3/src/Modules/_collectionsmodule.c
index 2e19b83dcec..eff03c789ed 100644
--- a/contrib/tools/python3/src/Modules/_collectionsmodule.c
+++ b/contrib/tools/python3/src/Modules/_collectionsmodule.c
@@ -1,4 +1,5 @@
#include "Python.h"
+#include "pycore_long.h" // _PyLong_GetZero()
#include "structmember.h" // PyMemberDef
#ifdef STDC_HEADERS
@@ -898,9 +899,20 @@ deque_rotate(dequeobject *deque, PyObject *const *args, Py_ssize_t nargs)
{
Py_ssize_t n=1;
- if (!_PyArg_ParseStack(args, nargs, "|n:rotate", &n)) {
+ if (!_PyArg_CheckPositional("deque.rotate", nargs, 0, 1)) {
return NULL;
}
+ if (nargs) {
+ PyObject *index = _PyNumber_Index(args[0]);
+ if (index == NULL) {
+ return NULL;
+ }
+ n = PyLong_AsSsize_t(index);
+ Py_DECREF(index);
+ if (n == -1 && PyErr_Occurred()) {
+ return NULL;
+ }
+ }
if (!_deque_rotate(deque, n))
Py_RETURN_NONE;
@@ -1146,38 +1158,6 @@ deque_insert(dequeobject *deque, PyObject *const *args, Py_ssize_t nargs)
PyDoc_STRVAR(insert_doc,
"D.insert(index, object) -- insert object before index");
-static PyObject *
-deque_remove(dequeobject *deque, PyObject *value)
-{
- Py_ssize_t i, n=Py_SIZE(deque);
-
- for (i=0 ; i<n ; i++) {
- PyObject *item = deque->leftblock->data[deque->leftindex];
- int cmp = PyObject_RichCompareBool(item, value, Py_EQ);
-
- if (Py_SIZE(deque) != n) {
- PyErr_SetString(PyExc_IndexError,
- "deque mutated during remove().");
- return NULL;
- }
- if (cmp > 0) {
- PyObject *tgt = deque_popleft(deque, NULL);
- assert (tgt != NULL);
- if (_deque_rotate(deque, i))
- return NULL;
- Py_DECREF(tgt);
- Py_RETURN_NONE;
- }
- else if (cmp < 0) {
- _deque_rotate(deque, i);
- return NULL;
- }
- _deque_rotate(deque, -1);
- }
- PyErr_SetString(PyExc_ValueError, "deque.remove(x): x not in deque");
- return NULL;
-}
-
PyDoc_STRVAR(remove_doc,
"D.remove(value) -- remove first occurrence of value.");
@@ -1245,6 +1225,48 @@ deque_del_item(dequeobject *deque, Py_ssize_t i)
return rv;
}
+static PyObject *
+deque_remove(dequeobject *deque, PyObject *value)
+{
+ PyObject *item;
+ block *b = deque->leftblock;
+ Py_ssize_t i, n = Py_SIZE(deque), index = deque->leftindex;
+ size_t start_state = deque->state;
+ int cmp, rv;
+
+ for (i = 0 ; i < n; i++) {
+ item = b->data[index];
+ Py_INCREF(item);
+ cmp = PyObject_RichCompareBool(item, value, Py_EQ);
+ Py_DECREF(item);
+ if (cmp < 0) {
+ return NULL;
+ }
+ if (start_state != deque->state) {
+ PyErr_SetString(PyExc_IndexError,
+ "deque mutated during iteration");
+ return NULL;
+ }
+ if (cmp > 0) {
+ break;
+ }
+ index++;
+ if (index == BLOCKLEN) {
+ b = b->rightlink;
+ index = 0;
+ }
+ }
+ if (i == n) {
+ PyErr_Format(PyExc_ValueError, "%R is not in deque", value);
+ return NULL;
+ }
+ rv = deque_del_item(deque, i);
+ if (rv == -1) {
+ return NULL;
+ }
+ Py_RETURN_NONE;
+}
+
static int
deque_ass_item(dequeobject *deque, Py_ssize_t i, PyObject *v)
{
@@ -1640,7 +1662,8 @@ static PyTypeObject deque_type = {
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
+ Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_SEQUENCE,
/* tp_flags */
deque_doc, /* tp_doc */
(traverseproc)deque_traverse, /* tp_traverse */
@@ -2296,6 +2319,7 @@ _collections__count_elements_impl(PyObject *module, PyObject *mapping,
PyObject *dict_get;
PyObject *mapping_setitem;
PyObject *dict_setitem;
+ PyObject *one = _PyLong_GetOne(); // borrowed reference
it = PyObject_GetIter(iterable);
if (it == NULL)
@@ -2342,10 +2366,10 @@ _collections__count_elements_impl(PyObject *module, PyObject *mapping,
if (oldval == NULL) {
if (PyErr_Occurred())
goto done;
- if (_PyDict_SetItem_KnownHash(mapping, key, _PyLong_One, hash) < 0)
+ if (_PyDict_SetItem_KnownHash(mapping, key, one, hash) < 0)
goto done;
} else {
- newval = PyNumber_Add(oldval, _PyLong_One);
+ newval = PyNumber_Add(oldval, one);
if (newval == NULL)
goto done;
if (_PyDict_SetItem_KnownHash(mapping, key, newval, hash) < 0)
@@ -2354,19 +2378,21 @@ _collections__count_elements_impl(PyObject *module, PyObject *mapping,
}
Py_DECREF(key);
}
- } else {
+ }
+ else {
bound_get = _PyObject_GetAttrId(mapping, &PyId_get);
if (bound_get == NULL)
goto done;
+ PyObject *zero = _PyLong_GetZero(); // borrowed reference
while (1) {
key = PyIter_Next(it);
if (key == NULL)
break;
- oldval = PyObject_CallFunctionObjArgs(bound_get, key, _PyLong_Zero, NULL);
+ oldval = PyObject_CallFunctionObjArgs(bound_get, key, zero, NULL);
if (oldval == NULL)
break;
- newval = PyNumber_Add(oldval, _PyLong_One);
+ newval = PyNumber_Add(oldval, one);
Py_DECREF(oldval);
if (newval == NULL)
break;