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;
 }