From: Raymond Hettinger Date: Wed, 23 Apr 2003 17:27:00 +0000 (+0000) Subject: SF Patch 685051: fix for 680789: reprs in arraymodule X-Git-Tag: v2.3c1~1064 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=88ba1e39ecf32d0a2328358351fff3006a5b30b9;p=python SF Patch 685051: fix for 680789: reprs in arraymodule (contributed by logistix; substantially reworked by rhettinger). To create a representation of non-string arrays, array_repr() was starting with a base Python string object and repeatedly using += to concatenate the representation of individual objects. Logistix had the idea to convert to an intermediate tuple form and then join it all at once. I took advantage of existing tools and formed a list with array_tolist() and got its representation through PyObject_Repr(v) which already has a fast implementation for lists. --- diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index e361c9407c..204c8d3c5f 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -1456,8 +1456,8 @@ static PyObject * array_repr(arrayobject *a) { char buf[256], typecode; - PyObject *s, *t, *comma, *v; - int i, len; + PyObject *s, *t, *v = NULL; + int len; len = a->ob_size; typecode = a->ob_descr->typecode; @@ -1465,37 +1465,22 @@ array_repr(arrayobject *a) PyOS_snprintf(buf, sizeof(buf), "array('%c')", typecode); return PyString_FromString(buf); } - - if (typecode == 'c' || typecode == 'u') { - PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode); - s = PyString_FromString(buf); -#ifdef Py_USING_UNICODE - if (typecode == 'c') -#endif - v = array_tostring(a, NULL); + + if (typecode == 'c') + v = array_tostring(a, NULL); #ifdef Py_USING_UNICODE - else - v = array_tounicode(a, NULL); + else if (typecode == 'u') + v = array_tounicode(a, NULL); #endif - t = PyObject_Repr(v); - Py_XDECREF(v); - PyString_ConcatAndDel(&s, t); - PyString_ConcatAndDel(&s, PyString_FromString(")")); - return s; - } - PyOS_snprintf(buf, sizeof(buf), "array('%c', [", typecode); + else + v = array_tolist(a, NULL); + t = PyObject_Repr(v); + Py_XDECREF(v); + + PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode); s = PyString_FromString(buf); - comma = PyString_FromString(", "); - for (i = 0; i < len && !PyErr_Occurred(); i++) { - if (i > 0) - PyString_Concat(&s, comma); - v = (a->ob_descr->getitem)(a, i); - t = PyObject_Repr(v); - Py_XDECREF(v); - PyString_ConcatAndDel(&s, t); - } - Py_XDECREF(comma); - PyString_ConcatAndDel(&s, PyString_FromString("])")); + PyString_ConcatAndDel(&s, t); + PyString_ConcatAndDel(&s, PyString_FromString(")")); return s; }