summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2003-04-23 17:27:00 (GMT)
committerRaymond Hettinger <python@rcn.com>2003-04-23 17:27:00 (GMT)
commit88ba1e39ecf32d0a2328358351fff3006a5b30b9 (patch)
tree62ec435a8f72c680b192c3e95991e7fb602d6703 /Modules
parent444e434011408d474cbd167c2276ad51259eda20 (diff)
downloadcpython-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.
Diffstat (limited to 'Modules')
-rw-r--r--Modules/arraymodule.c45
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;
}