]> granicus.if.org Git - python/commitdiff
list_inplace_concat() is now expressed in terms of list_extend() which
authorRaymond Hettinger <python@rcn.com>
Thu, 11 Mar 2004 07:34:19 +0000 (07:34 +0000)
committerRaymond Hettinger <python@rcn.com>
Thu, 11 Mar 2004 07:34:19 +0000 (07:34 +0000)
avoids creating an intermediate tuple for iterable arguments other than
lists or tuples.

In other words, a+=b no longer requires extra memory when b is not a
list or tuple.  The list and tuple cases are unchanged.

Objects/listobject.c

index b61d7da0adff2cbb7681fb8e1b211a1cf394b9d6..6bb6d8c797351ab6f82d01423bd6654bbc1563d8 100644 (file)
@@ -707,20 +707,6 @@ listextend_internal(PyListObject *self, PyObject *b)
        return 0;
 }
 
-static PyObject *
-list_inplace_concat(PyListObject *self, PyObject *other)
-{
-       other = PySequence_Fast(other, "argument to += must be iterable");
-       if (!other)
-               return NULL;
-
-       if (listextend_internal(self, other) < 0)
-               return NULL;
-
-       Py_INCREF(self);
-       return (PyObject *)self;
-}
-
 static PyObject *
 listextend(PyListObject *self, PyObject *b)
 {
@@ -790,6 +776,19 @@ listextend(PyListObject *self, PyObject *b)
        return NULL;
 }
 
+static PyObject *
+list_inplace_concat(PyListObject *self, PyObject *other)
+{
+       PyObject *result;
+
+       result = listextend(self, other);
+       if (result == NULL)
+               return result;
+       Py_DECREF(result);
+       Py_INCREF(self);
+       return (PyObject *)self;
+}
+
 static PyObject *
 listpop(PyListObject *self, PyObject *args)
 {