Mercurial > cpython-lru_cache-weakref
diff Modules/arraymodule.c @ 28742:bd678e65f784 legacy-trunk
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.
| author | Raymond Hettinger <python@rcn.com> |
|---|---|
| date | Wed, 23 Apr 2003 17:27:00 +0000 |
| parents | fd5ef7003469 |
| children | 22d177682ae1 |
line wrap: on
line diff
--- a/Modules/arraymodule.c Wed Apr 23 15:04:52 2003 +0000 +++ b/Modules/arraymodule.c Wed Apr 23 17:27:00 2003 +0000 @@ -1456,8 +1456,8 @@ 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 @@ 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); + + if (typecode == 'c') + v = array_tostring(a, NULL); #ifdef Py_USING_UNICODE - if (typecode == 'c') -#endif - 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; }
