diff -r ecb8b965c93e Objects/structseq.c --- a/Objects/structseq.c Sat Aug 11 11:16:26 2012 +0200 +++ b/Objects/structseq.c Mon Aug 13 18:12:34 2012 +0200 @@ -316,7 +316,9 @@ }; void -PyStructSequence_InitType(PyTypeObject *type, PyStructSequence_Desc *desc) +_PyStructSequence_InitTypeWithFlags(PyTypeObject *type, + PyStructSequence_Desc *desc, + int flags) { PyObject *dict; PyMemberDef* members; @@ -337,6 +339,7 @@ n_members = i; memcpy(type, &_struct_sequence_template, sizeof(PyTypeObject)); + type->tp_flags = flags; type->tp_base = &PyTuple_Type; type->tp_name = desc->name; type->tp_doc = desc->doc; @@ -379,10 +382,38 @@ SET_DICT_FROM_INT(unnamed_fields_key, n_unnamed_members); } +void +PyStructSequence_InitType(PyTypeObject *type, PyStructSequence_Desc *desc) +{ + _PyStructSequence_InitTypeWithFlags(type, desc, Py_TPFLAGS_DEFAULT); +} + PyTypeObject* PyStructSequence_NewType(PyStructSequence_Desc *desc) { - PyTypeObject *result = (PyTypeObject*)PyType_GenericAlloc(&PyType_Type, 0); - PyStructSequence_InitType(result, desc); + char *s; + PyHeapTypeObject *result = + (PyHeapTypeObject*)PyType_GenericAlloc(&PyType_Type, 0); + _PyStructSequence_InitTypeWithFlags((PyTypeObject *)result, + desc, + Py_TPFLAGS_HEAPTYPE); + + /* Because we are creating a HeapType, we + need to set the ht_* fields of the resulting + typeobject */ + + /* Set the type name and qualname */ + s = strrchr(desc->name, '.'); + if (s == NULL) + s = (char*)desc->name; + else + s++; + + result->ht_name = PyUnicode_FromString(s); + if(!result->ht_name) + return NULL; + Py_INCREF(result->ht_name); + result->ht_qualname = result->ht_name; + return result; }