]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
I missed the most important file
authorChristian Heimes <christian@cheimes.de>
Mon, 14 Jan 2008 03:35:38 +0000 (03:35 +0000)
committerChristian Heimes <christian@cheimes.de>
Mon, 14 Jan 2008 03:35:38 +0000 (03:35 +0000)
Objects/structseq.c

index 8dcc2bc2b03eadcccb56073567413b13788bf960..8e27441bace00595a0c01565576c08e7a311acad 100644 (file)
@@ -30,7 +30,7 @@ PyObject *
 PyStructSequence_New(PyTypeObject *type)
 {
        PyStructSequence *obj;
-       
+
        obj = PyObject_New(PyStructSequence, type);
        Py_SIZE(obj) = VISIBLE_SIZE_TP(type);
 
@@ -230,11 +230,64 @@ make_tuple(PyStructSequence *obj)
 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 *