[Python-checkins] python/dist/src/Modules arraymodule.c,2.86,2.87

rhettinger@users.sourceforge.net rhettinger@users.sourceforge.net
2003年4月23日 10:27:03 -0700


Update of /cvsroot/python/python/dist/src/Modules
In directory sc8-pr-cvs1:/tmp/cvs-serv28766
Modified Files:
	arraymodule.c 
Log Message:
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.
Index: arraymodule.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/arraymodule.c,v
retrieving revision 2.86
retrieving revision 2.87
diff -C2 -d -r2.86 -r2.87
*** arraymodule.c	17 Mar 2003 19:46:07 -0000	2.86
--- arraymodule.c	23 Apr 2003 17:27:00 -0000	2.87
***************
*** 1457,1462 ****
 {
 	char buf[256], typecode;
! 	PyObject *s, *t, *comma, *v;
! 	int i, len;
 
 	len = a->ob_size;
--- 1457,1462 ----
 {
 	char buf[256], typecode;
! 	PyObject *s, *t, *v = NULL;
! 	int len;
 
 	len = a->ob_size;
***************
*** 1466,1500 ****
 		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);
 #ifdef Py_USING_UNICODE
! 		else
! 			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);
 	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("])"));
 	return s;
 }
--- 1466,1485 ----
 		return PyString_FromString(buf);
 	}
! 		
! 	if (typecode == 'c')
! 		v = array_tostring(a, NULL);
 #ifdef Py_USING_UNICODE
! 	else if (typecode == 'u')
! 		v = array_tounicode(a, NULL);
 #endif
! 	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);
! 	PyString_ConcatAndDel(&s, t);
! 	PyString_ConcatAndDel(&s, PyString_FromString(")"));
 	return s;
 }

AltStyle によって変換されたページ (->オリジナル) /