Mercurial > cpython-lru_cache-weakref
diff Objects/structseq.c @ 62877:e4bda4a520ca
fix repr of complicated structseqs #9206
| author | Benjamin Peterson <benjamin@python.org> |
|---|---|
| date | Thu, 08 Jul 2010 22:33:03 +0000 |
| parents | 384f73a104e9 |
| children | 8304bd765bcf |
line wrap: on
line diff
--- a/Objects/structseq.c Thu Jul 08 22:16:05 2010 +0000 +++ b/Objects/structseq.c Thu Jul 08 22:33:03 2010 +0000 @@ -35,12 +35,27 @@ obj = PyObject_GC_NewVar(PyStructSequence, type, size); if (obj == NULL) return NULL; + /* Hack the size of the variable object, so invisible fields don't appear + to Python code. */ + Py_SIZE(obj) = VISIBLE_SIZE_TP(type); for (i = 0; i < size; i++) obj->ob_item[i] = NULL; return (PyObject*)obj; } +static void +structseq_dealloc(PyStructSequence *obj) +{ + Py_ssize_t i, size; + + size = REAL_SIZE(obj); + for (i = 0; i < size; ++i) { + Py_XDECREF(obj->ob_item[i]); + } + PyObject_GC_Del(obj); +} + static PyObject * structseq_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { @@ -154,8 +169,11 @@ char *cname, *crepr; cname = typ->tp_members[i].name; - if (cname == NULL) + if (cname == NULL) { + PyErr_Format(PyExc_SystemError, "In structseq_repr(), member %d name is NULL" + " for type %.500s", i, typ->tp_name); return NULL; + } val = PyStructSequence_GET_ITEM(obj, i); repr = PyObject_Repr(val); if (repr == NULL) @@ -249,7 +267,7 @@ NULL, /* tp_name */ sizeof(PyStructSequence) - sizeof(PyObject *), /* tp_basicsize */ sizeof(PyObject *), /* tp_itemsize */ - 0, /* tp_dealloc */ + (destructor)structseq_dealloc, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */
