From: Raymond Hettinger Date: Thu, 11 Mar 2004 07:34:19 +0000 (+0000) Subject: list_inplace_concat() is now expressed in terms of list_extend() which X-Git-Tag: v2.4a1~720 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=97bc6182297ab383d54dca4b85fe656a658e7f0d;p=python list_inplace_concat() is now expressed in terms of list_extend() which 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. --- diff --git a/Objects/listobject.c b/Objects/listobject.c index b61d7da0ad..6bb6d8c797 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -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) {