diff -r 99640494ca7f Lib/test/test_structseq.py --- a/Lib/test/test_structseq.py Tue Nov 05 21:55:46 2013 -0600 +++ b/Lib/test/test_structseq.py Thu Nov 07 16:23:56 2013 +0530 @@ -34,7 +34,8 @@ t = time.gmtime(0) self.assertEqual(repr(t), "time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, " - "tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)") + "tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0, " + "dict={'tm_zone':'GMT', 'tm_gmtoff':0})") # os.stat() gives a complicated struct sequence. st = os.stat(__file__) rep = repr(st) @@ -42,6 +43,8 @@ self.assertIn("st_mode=", rep) self.assertIn("st_ino=", rep) self.assertIn("st_dev=", rep) + # Issue 11698: Display unindexed values in repr + self.assertIn("'st_atime_ns'", rep) def test_concat(self): t1 = time.gmtime() diff -r 99640494ca7f Objects/structseq.c --- a/Objects/structseq.c Tue Nov 05 21:55:46 2013 -0600 +++ b/Objects/structseq.c Thu Nov 07 16:23:56 2013 +0530 @@ -164,10 +164,14 @@ #define TYPE_MAXSIZE 100 PyTypeObject *typ = Py_TYPE(obj); - int i, removelast = 0; + int i, k, removelast = 0; Py_ssize_t len; char buf[REPR_BUFFER_SIZE]; char *endofbuf, *pbuf = buf; + char separator = '='; + Py_ssize_t n_fields = REAL_SIZE(obj); + Py_ssize_t n_visible_fields = VISIBLE_SIZE(obj); + Py_ssize_t n_unnamed_fields = UNNAMED_FIELDS(obj); /* pointer to end of writeable buffer; safes space for "...)\0" */ endofbuf= &buf[REPR_BUFFER_SIZE-5]; @@ -179,11 +183,15 @@ pbuf += len; *pbuf++ = '('; - for (i=0; i < VISIBLE_SIZE(obj); i++) { + for (i=0; i < n_fields; i++) { PyObject *val, *repr; char *cname, *crepr; - - cname = typ->tp_members[i].name; + + k = i; + if(i >= n_visible_fields) { + k -= n_unnamed_fields; + } + cname = typ->tp_members[k].name; if (cname == NULL) { PyErr_Format(PyExc_SystemError, "In structseq_repr(), member %d name is NULL" " for type %.500s", i, typ->tp_name); @@ -201,10 +209,29 @@ /* + 3: keep space for "=" and ", " */ len = strlen(cname) + strlen(crepr) + 3; + if(i == n_visible_fields) { + /* space for "dict={}" */ + len += 7; + } + if(i >= n_visible_fields) { + /* space for quotes around key in the dict part */ + len += 2; + } if ((pbuf+len) <= endofbuf) { - strcpy(pbuf, cname); + if(i == n_visible_fields) { + strcpy(pbuf, "dict={"); + pbuf += 6; + separator = ':'; + } + if(i >= n_visible_fields) { + *pbuf++ = '\''; + } + strcpy(pbuf, cname); pbuf += strlen(cname); - *pbuf++ = '='; + if(i >= n_visible_fields) { + *pbuf++ = '\''; + } + *pbuf++ = separator; strcpy(pbuf, crepr); pbuf += strlen(crepr); *pbuf++ = ','; @@ -224,6 +251,9 @@ /* overwrite last ", " */ pbuf-=2; } + if(i > n_visible_fields) { + *pbuf++ = '}'; + } *pbuf++ = ')'; *pbuf = '\0';