summaryrefslogtreecommitdiffstats
path: root/Modules/collectionsmodule.c
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/collectionsmodule.c')
-rw-r--r--Modules/collectionsmodule.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/Modules/collectionsmodule.c b/Modules/collectionsmodule.c
index fc30c99..e49224d 100644
--- a/Modules/collectionsmodule.c
+++ b/Modules/collectionsmodule.c
@@ -353,6 +353,44 @@ deque_item(dequeobject *deque, int i)
}
static int
+deque_del_item(dequeobject *deque, int i)
+{
+ PyObject *item=NULL, *minus_i=NULL, *plus_i=NULL;
+ int rv = -1;
+
+ assert (i >= 0 && i < deque->len);
+
+ minus_i = Py_BuildValue("(i)", -i);
+ if (minus_i == NULL)
+ goto fail;
+
+ plus_i = Py_BuildValue("(i)", i);
+ if (plus_i == NULL)
+ goto fail;
+
+ item = deque_rotate(deque, minus_i);
+ if (item == NULL)
+ goto fail;
+ Py_DECREF(item);
+
+ item = deque_popleft(deque, NULL);
+ if (item == NULL)
+ goto fail;
+ Py_DECREF(item);
+
+ item = deque_rotate(deque, plus_i);
+ if (item == NULL)
+ goto fail;
+
+ rv = 0;
+fail:
+ Py_XDECREF(item);
+ Py_XDECREF(minus_i);
+ Py_XDECREF(plus_i);
+ return rv;
+}
+
+static int
deque_ass_item(dequeobject *deque, int i, PyObject *v)
{
PyObject *old_value;
@@ -364,6 +402,9 @@ deque_ass_item(dequeobject *deque, int i, PyObject *v)
"deque index out of range");
return -1;
}
+ if (v == NULL)
+ return deque_del_item(deque, i);
+
i += deque->leftindex;
n = i / BLOCKLEN;
i %= BLOCKLEN;