[Python-checkins] r59948 - python/trunk/Objects/structseq.c

christian.heimes python-checkins at python.org
Mon Jan 14 04:35:38 CET 2008


Author: christian.heimes
Date: Mon Jan 14 04:35:38 2008
New Revision: 59948

Modified:
   python/trunk/Objects/structseq.c
Log:
I missed the most important file

Modified: python/trunk/Objects/structseq.c
==============================================================================
--- python/trunk/Objects/structseq.c	(original)
+++ python/trunk/Objects/structseq.c	Mon Jan 14 04:35:38 2008
@@ -30,7 +30,7 @@
 PyStructSequence_New(PyTypeObject *type)
 {
 	PyStructSequence *obj;
-       
+
 	obj = PyObject_New(PyStructSequence, type);
 	Py_SIZE(obj) = VISIBLE_SIZE_TP(type);
 
@@ -230,11 +230,64 @@
 static PyObject *
 structseq_repr(PyStructSequence *obj)
 {
-	PyObject *tup, *str;
-	tup = make_tuple(obj);
-	str = PyObject_Repr(tup);
+	PyObject *tup, *val, *repr;
+	PyTypeObject *typ = Py_TYPE(obj);
+	int i, len;
+	char buf[250+5]; /* "...)\0" */
+	char *cname, *crepr;
+	char *pbuf = buf;
+ 	char *endbuf = &buf[250];
+
+	strncpy(pbuf, typ->tp_name, 50);
+	pbuf += strlen(typ->tp_name) > 50 ? 50 : strlen(typ->tp_name);
+	*pbuf++ = '(';
+
+	if ((tup = make_tuple(obj)) == NULL) {
+		return NULL;
+	}
+	for (i=0; i < VISIBLE_SIZE(obj); i++) {
+		cname = typ->tp_members[i].name;
+		val = PyTuple_GetItem(tup, i);
+		if (cname == NULL || val == NULL) {
+			return NULL;
+		}
+		repr = PyObject_Repr(val);
+		if (repr == NULL) {
+			Py_DECREF(tup);
+			return NULL;
+		}
+		crepr = PyString_AsString(repr);
+		if (crepr == NULL) {
+			Py_DECREF(tup);
+			Py_DECREF(repr);
+			return NULL;
+		}
+		len = strlen(cname) + strlen(crepr) + 3;
+		if ((pbuf+len) < endbuf) {
+			strcpy(pbuf, cname);
+			pbuf += strlen(cname);
+			*pbuf++ = '=';
+			strcpy(pbuf, crepr);
+			pbuf += strlen(crepr);
+			*pbuf++ = ',';
+			*pbuf++ = ' ';
+			Py_DECREF(repr);
+		}
+		else {
+			strcpy(pbuf, "...");
+			pbuf += 5;
+			Py_DECREF(repr);
+			break;
+		}
+	}
 	Py_DECREF(tup);
-	return str;
+
+	pbuf-=2;
+	*pbuf++ = ')';
+	*pbuf = '\0';
+
+	repr = PyString_FromString(buf);
+	return repr;
 }
 
 static PyObject *


More information about the Python-checkins mailing list