diff options
author | Raymond Hettinger <python@rcn.com> | 2003-04-23 17:27:00 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2003-04-23 17:27:00 (GMT) |
commit | 88ba1e39ecf32d0a2328358351fff3006a5b30b9 (patch) | |
tree | 62ec435a8f72c680b192c3e95991e7fb602d6703 | |
parent | 444e434011408d474cbd167c2276ad51259eda20 (diff) | |
download | cpython-88ba1e39ecf32d0a2328358351fff3006a5b30b9.zip cpython-88ba1e39ecf32d0a2328358351fff3006a5b30b9.tar.gz cpython-88ba1e39ecf32d0a2328358351fff3006a5b30b9.tar.bz2 |
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.
-rw-r--r-- | Modules/arraymodule.c | 45 |
1 files changed, 15 insertions, 30 deletions
diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index e361c94..204c8d3 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; } |