@@ -2627,13 +2627,20 @@ type_get_tp_mro(PyObject *self, PyObject *type)
2627
2627
}
2628
2628
2629
2629
2630
- static PyTypeObject BasicStaticType = {
2631
- PyVarObject_HEAD_INIT (NULL , 0 )
2632
- .tp_name = "BasicStaticType" ,
2633
- .tp_basicsize = sizeof (PyObject ),
2630
+ /* We only use 2 in test_capi/test_misc.py. */
2631
+ #define NUM_BASIC_STATIC_TYPES 2
2632
+ static PyTypeObject BasicStaticTypes [NUM_BASIC_STATIC_TYPES ] = {
2633
+ #define INIT_BASIC_STATIC_TYPE \
2634
+ { \
2635
+ PyVarObject_HEAD_INIT (NULL , 0 ) \
2636
+ .tp_name = "BasicStaticType" , \
2637
+ .tp_basicsize = sizeof (PyObject ), \
2638
+ }
2639
+ INIT_BASIC_STATIC_TYPE ,
2640
+ INIT_BASIC_STATIC_TYPE ,
2641
+ #undef INIT_BASIC_STATIC_TYPE
2634
2642
};
2635
-
2636
- static PyObject * clear_basic_static_type (PyObject * , PyObject * );
2643
+ static int num_basic_static_types_used = 0 ;
2637
2644
2638
2645
static PyObject *
2639
2646
get_basic_static_type (PyObject * self , PyObject * args )
@@ -2644,42 +2651,25 @@ get_basic_static_type(PyObject *self, PyObject *args)
2644
2651
}
2645
2652
assert (base == NULL || PyType_Check (base ));
2646
2653
2647
- PyTypeObject * cls = & BasicStaticType ;
2648
- assert (!(cls -> tp_flags & Py_TPFLAGS_READY ));
2654
+ if (num_basic_static_types_used >= NUM_BASIC_STATIC_TYPES ) {
2655
+ PyErr_SetString (PyExc_RuntimeError , "no more available basic static types" );
2656
+ return NULL ;
2657
+ }
2658
+ PyTypeObject * cls = & BasicStaticTypes [num_basic_static_types_used ++ ];
2649
2659
2650
2660
if (base != NULL ) {
2651
2661
cls -> tp_base = (PyTypeObject * )Py_NewRef (base );
2652
2662
cls -> tp_bases = Py_BuildValue ("(O)" , base );
2653
2663
if (cls -> tp_bases == NULL ) {
2654
- clear_basic_static_type (self , (PyObject * )cls );
2655
2664
return NULL ;
2656
2665
}
2657
2666
}
2658
2667
if (PyType_Ready (cls ) < 0 ) {
2659
- clear_basic_static_type (self , (PyObject * )cls );
2660
2668
return NULL ;
2661
2669
}
2662
- Py_INCREF (cls );
2663
2670
return (PyObject * )cls ;
2664
2671
}
2665
2672
2666
- static PyObject *
2667
- clear_basic_static_type (PyObject * self , PyObject * clsobj )
2668
- {
2669
- // Reset it back to the statically initialized state.
2670
- PyTypeObject * cls = (PyTypeObject * )clsobj ;
2671
- Py_CLEAR (cls -> ob_base .ob_base .ob_type );
2672
- Py_CLEAR (cls -> tp_base );
2673
- Py_CLEAR (cls -> tp_bases );
2674
- Py_CLEAR (cls -> tp_mro );
2675
- Py_CLEAR (cls -> tp_subclasses );
2676
- Py_CLEAR (cls -> tp_dict );
2677
- cls -> tp_flags &= ~Py_TPFLAGS_READY ;
2678
- cls -> tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG ;
2679
- cls -> tp_version_tag = 0 ;
2680
- Py_RETURN_NONE ;
2681
- }
2682
-
2683
2673
2684
2674
// Test PyThreadState C API
2685
2675
static PyObject *
@@ -3439,7 +3429,6 @@ static PyMethodDef TestMethods[] = {
3439
3429
{"type_get_tp_bases" , type_get_tp_bases , METH_O },
3440
3430
{"type_get_tp_mro" , type_get_tp_mro , METH_O },
3441
3431
{"get_basic_static_type" , get_basic_static_type , METH_VARARGS , NULL },
3442
- {"clear_basic_static_type" , clear_basic_static_type , METH_O , NULL },
3443
3432
{"test_tstate_capi" , test_tstate_capi , METH_NOARGS , NULL },
3444
3433
{"frame_getlocals" , frame_getlocals , METH_O , NULL },
3445
3434
{"frame_getglobals" , frame_getglobals , METH_O , NULL },
0 commit comments