summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2009-12-10 06:00:33 (GMT)
committerRaymond Hettinger <python@rcn.com>2009-12-10 06:00:33 (GMT)
commit0b3263b073245e29b83fd8795c085ac96205dee0 (patch)
tree65079f23cc0f14859f0d5d2e5576ade88240ad95 /Modules
parent5fb877027b4284e6cef49bea7157b11d3d938a7b (diff)
downloadcpython-0b3263b073245e29b83fd8795c085ac96205dee0.zip
cpython-0b3263b073245e29b83fd8795c085ac96205dee0.tar.gz
cpython-0b3263b073245e29b83fd8795c085ac96205dee0.tar.bz2
Fix variants of deque.extend: d.extend(d) d+=d d.extendleft(d)
Diffstat (limited to 'Modules')
-rw-r--r--Modules/_collectionsmodule.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c
index 1873cab..97b3905 100644
--- a/Modules/_collectionsmodule.c
+++ b/Modules/_collectionsmodule.c
@@ -298,6 +298,17 @@ deque_extend(dequeobject *deque, PyObject *iterable)
{
PyObject *it, *item;
+ /* Handle case where id(deque) == id(iterable) */
+ if ((PyObject *)deque == iterable) {
+ PyObject *result;
+ PyObject *s = PySequence_List(iterable);
+ if (s == NULL)
+ return NULL;
+ result = deque_extend(deque, s);
+ Py_DECREF(s);
+ return result;
+ }
+
it = PyObject_GetIter(iterable);
if (it == NULL)
return NULL;
@@ -339,6 +350,17 @@ deque_extendleft(dequeobject *deque, PyObject *iterable)
{
PyObject *it, *item;
+ /* Handle case where id(deque) == id(iterable) */
+ if ((PyObject *)deque == iterable) {
+ PyObject *result;
+ PyObject *s = PySequence_List(iterable);
+ if (s == NULL)
+ return NULL;
+ result = deque_extendleft(deque, s);
+ Py_DECREF(s);
+ return result;
+ }
+
it = PyObject_GetIter(iterable);
if (it == NULL)
return NULL;
@@ -375,6 +397,19 @@ deque_extendleft(dequeobject *deque, PyObject *iterable)
PyDoc_STRVAR(extendleft_doc,
"Extend the left side of the deque with elements from the iterable");
+static PyObject *
+deque_inplace_concat(dequeobject *deque, PyObject *other)
+{
+ PyObject *result;
+
+ result = deque_extend(deque, other);
+ if (result == NULL)
+ return result;
+ Py_DECREF(result);
+ Py_INCREF(deque);
+ return (PyObject *)deque;
+}
+
static int
_deque_rotate(dequeobject *deque, Py_ssize_t n)
{
@@ -891,6 +926,11 @@ static PySequenceMethods deque_as_sequence = {
(ssizeargfunc)deque_item, /* sq_item */
0, /* sq_slice */
(ssizeobjargproc)deque_ass_item, /* sq_ass_item */
+ 0, /* sq_ass_slice */
+ 0, /* sq_contains */
+ (binaryfunc)deque_inplace_concat, /* sq_inplace_concat */
+ 0, /* sq_inplace_repeat */
+
};
/* deque object ********************************************************/