@@ -432,11 +432,21 @@ initialize_structseq_dict(PyStructSequence_Desc *desc, PyObject* dict,
432432 return -1 ;
433433}
434434
435- static void
436- initialize_members (PyStructSequence_Desc * desc , PyMemberDef * members ,
437- Py_ssize_t n_members ) {
438- Py_ssize_t i , k ;
435+ static PyMemberDef *
436+ initialize_members (PyStructSequence_Desc * desc ,
437+ Py_ssize_t * pn_members , Py_ssize_t * pn_unnamed_members )
438+ {
439+ PyMemberDef * members ;
440+ Py_ssize_t n_members , n_unnamed_members ;
441+
442+ n_members = count_members (desc , & n_unnamed_members );
443+ members = PyMem_NEW (PyMemberDef , n_members - n_unnamed_members + 1 );
444+ if (members == NULL ) {
445+ PyErr_NoMemory ();
446+ return NULL ;
447+ }
439448
449+ Py_ssize_t i , k ;
440450 for (i = k = 0 ; i < n_members ; ++ i ) {
441451 if (desc -> fields [i ].name == PyStructSequence_UnnamedField ) {
442452 continue ;
@@ -453,30 +463,17 @@ initialize_members(PyStructSequence_Desc *desc, PyMemberDef* members,
453463 k ++ ;
454464 }
455465 members [k ].name = NULL ;
466+
467+ * pn_members = n_members ;
468+ * pn_unnamed_members = n_unnamed_members ;
469+ return members ;
456470}
457471
458472
459- int
460- _PyStructSequence_InitType (PyTypeObject * type , PyStructSequence_Desc * desc ,
461- unsigned long tp_flags )
473+ static void
474+ initialize_static_fields (PyTypeObject * type , PyStructSequence_Desc * desc ,
475+ PyMemberDef * tp_members , unsigned long tp_flags )
462476{
463- PyMemberDef * members ;
464- Py_ssize_t n_members , n_unnamed_members ;
465-
466- #ifdef Py_TRACE_REFS
467- /* if the type object was chained, unchain it first
468- before overwriting its storage */
469- if (type -> ob_base .ob_base ._ob_next ) {
470- _Py_ForgetReference ((PyObject * )type );
471- }
472- #endif
473-
474- /* PyTypeObject has already been initialized */
475- if (Py_REFCNT (type ) != 0 ) {
476- PyErr_BadInternalCall ();
477- return -1 ;
478- }
479-
480477 type -> tp_name = desc -> name ;
481478 type -> tp_basicsize = sizeof (PyStructSequence ) - sizeof (PyObject * );
482479 type -> tp_itemsize = sizeof (PyObject * );
@@ -488,36 +485,84 @@ _PyStructSequence_InitType(PyTypeObject *type, PyStructSequence_Desc *desc,
488485 type -> tp_new = structseq_new ;
489486 type -> tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | tp_flags ;
490487 type -> tp_traverse = (traverseproc ) structseq_traverse ;
488+ type -> tp_members = tp_members ;
489+ }
491490
492- n_members = count_members (desc , & n_unnamed_members );
493- members = PyMem_NEW (PyMemberDef , n_members - n_unnamed_members + 1 );
494- if (members == NULL ) {
495- PyErr_NoMemory ();
496- return -1 ;
497- }
498- initialize_members (desc , members , n_members );
499- type -> tp_members = members ;
500-
491+ static int
492+ initialize_static_type (PyTypeObject * type , PyStructSequence_Desc * desc ,
493+ Py_ssize_t n_members , Py_ssize_t n_unnamed_members ) {
494+ /* initialize_static_fields() should have been called already. */
501495 if (PyType_Ready (type ) < 0 ) {
502- PyMem_Free (members );
503496 return -1 ;
504497 }
505498 Py_INCREF (type );
506499
507500 if (initialize_structseq_dict (
508501 desc , type -> tp_dict , n_members , n_unnamed_members ) < 0 ) {
509- PyMem_Free (members );
510502 Py_DECREF (type );
511503 return -1 ;
512504 }
513505
514506 return 0 ;
515507}
516508
509+ int
510+ _PyStructSequence_InitBuiltinWithFlags (PyTypeObject * type ,
511+ PyStructSequence_Desc * desc ,
512+ unsigned long tp_flags )
513+ {
514+ PyMemberDef * members ;
515+ Py_ssize_t n_members , n_unnamed_members ;
516+
517+ members = initialize_members (desc , & n_members , & n_unnamed_members );
518+ if (members == NULL ) {
519+ return -1 ;
520+ }
521+ initialize_static_fields (type , desc , members , tp_flags );
522+ if (_PyStaticType_InitBuiltin (type ) < 0 ) {
523+ PyMem_Free (members );
524+ PyErr_Format (PyExc_RuntimeError ,
525+ "Can't initialize builtin type %s" ,
526+ desc -> name );
527+ return -1 ;
528+ }
529+ if (initialize_static_type (type , desc , n_members , n_unnamed_members ) < 0 ) {
530+ PyMem_Free (members );
531+ return -1 ;
532+ }
533+ return 0 ;
534+ }
535+
517536int
518537PyStructSequence_InitType2 (PyTypeObject * type , PyStructSequence_Desc * desc )
519538{
520- return _PyStructSequence_InitType (type , desc , 0 );
539+ PyMemberDef * members ;
540+ Py_ssize_t n_members , n_unnamed_members ;
541+
542+ #ifdef Py_TRACE_REFS
543+ /* if the type object was chained, unchain it first
544+ before overwriting its storage */
545+ if (type -> ob_base .ob_base ._ob_next ) {
546+ _Py_ForgetReference ((PyObject * )type );
547+ }
548+ #endif
549+
550+ /* PyTypeObject has already been initialized */
551+ if (Py_REFCNT (type ) != 0 ) {
552+ PyErr_BadInternalCall ();
553+ return -1 ;
554+ }
555+
556+ members = initialize_members (desc , & n_members , & n_unnamed_members );
557+ if (members == NULL ) {
558+ return -1 ;
559+ }
560+ initialize_static_fields (type , desc , members , 0 );
561+ if (initialize_static_type (type , desc , n_members , n_unnamed_members ) < 0 ) {
562+ PyMem_Free (members );
563+ return -1 ;
564+ }
565+ return 0 ;
521566}
522567
523568void
@@ -569,13 +614,10 @@ _PyStructSequence_NewType(PyStructSequence_Desc *desc, unsigned long tp_flags)
569614 Py_ssize_t n_members , n_unnamed_members ;
570615
571616 /* Initialize MemberDefs */
572- n_members = count_members (desc , & n_unnamed_members );
573- members = PyMem_NEW (PyMemberDef , n_members - n_unnamed_members + 1 );
617+ members = initialize_members (desc , & n_members , & n_unnamed_members );
574618 if (members == NULL ) {
575- PyErr_NoMemory ();
576619 return NULL ;
577620 }
578- initialize_members (desc , members , n_members );
579621
580622 /* Initialize Slots */
581623 slots [0 ] = (PyType_Slot ){Py_tp_dealloc , (destructor )structseq_dealloc };
0 commit comments