]> granicus.if.org Git - python/commitdiff
SF Patch 685051: fix for 680789: reprs in arraymodule
authorRaymond Hettinger <python@rcn.com>
Wed, 23 Apr 2003 17:27:00 +0000 (17:27 +0000)
committerRaymond Hettinger <python@rcn.com>
Wed, 23 Apr 2003 17:27:00 +0000 (17:27 +0000)
(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.

Modules/arraymodule.c

index e361c9407c6c5148fff75ebfcda3fc8906421e97..204c8d3c5f3b0691899d70becb214393e0523660 100644 (file)
@@ -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;
 }