diff options
Diffstat (limited to 'Objects/structseq.c')
-rw-r--r-- | Objects/structseq.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/Objects/structseq.c b/Objects/structseq.c index 2a53438..727d728 100644 --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -509,6 +509,13 @@ _PyStructSequence_InitBuiltinWithFlags(PyTypeObject *type, PyStructSequence_Desc *desc, unsigned long tp_flags) { + if (type->tp_flags & Py_TPFLAGS_READY) { + if (_PyStaticType_InitBuiltin(type) < 0) { + goto failed_init_builtin; + } + return 0; + } + PyMemberDef *members; Py_ssize_t n_members, n_unnamed_members; @@ -517,18 +524,25 @@ _PyStructSequence_InitBuiltinWithFlags(PyTypeObject *type, return -1; } initialize_static_fields(type, desc, members, tp_flags); + + Py_INCREF(type); // XXX It should be immortal. if (_PyStaticType_InitBuiltin(type) < 0) { PyMem_Free(members); - PyErr_Format(PyExc_RuntimeError, - "Can't initialize builtin type %s", - desc->name); - return -1; + goto failed_init_builtin; } - if (initialize_static_type(type, desc, n_members, n_unnamed_members) < 0) { + + if (initialize_structseq_dict( + desc, type->tp_dict, n_members, n_unnamed_members) < 0) { PyMem_Free(members); return -1; } return 0; + +failed_init_builtin: + PyErr_Format(PyExc_RuntimeError, + "Can't initialize builtin type %s", + desc->name); + return -1; } int |