@@ -2627,6 +2627,60 @@ 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 ),
2634
+ };
2635
+
2636
+ static PyObject * clear_basic_static_type (PyObject * , PyObject * );
2637
+
2638
+ static PyObject *
2639
+ get_basic_static_type (PyObject * self , PyObject * args )
2640
+ {
2641
+ PyObject * base = NULL ;
2642
+ if (!PyArg_ParseTuple (args , "|O" , & base )) {
2643
+ return NULL ;
2644
+ }
2645
+ assert (base == NULL || PyType_Check (base ));
2646
+
2647
+ PyTypeObject * cls = & BasicStaticType ;
2648
+ assert (!(cls -> tp_flags & Py_TPFLAGS_READY ));
2649
+
2650
+ if (base != NULL ) {
2651
+ cls -> tp_base = (PyTypeObject * )Py_NewRef (base );
2652
+ cls -> tp_bases = Py_BuildValue ("(O)" , base );
2653
+ if (cls -> tp_bases == NULL ) {
2654
+ clear_basic_static_type (self , (PyObject * )cls );
2655
+ return NULL ;
2656
+ }
2657
+ }
2658
+ if (PyType_Ready (cls ) < 0 ) {
2659
+ clear_basic_static_type (self , (PyObject * )cls );
2660
+ return NULL ;
2661
+ }
2662
+ Py_INCREF (cls );
2663
+ return (PyObject * )cls ;
2664
+ }
2665
+
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
+
2630
2684
// Test PyThreadState C API
2631
2685
static PyObject *
2632
2686
test_tstate_capi (PyObject * self , PyObject * Py_UNUSED (args ))
@@ -3384,6 +3438,8 @@ static PyMethodDef TestMethods[] = {
3384
3438
{"type_assign_version" , type_assign_version , METH_O , PyDoc_STR ("PyUnstable_Type_AssignVersionTag" )},
3385
3439
{"type_get_tp_bases" , type_get_tp_bases , METH_O },
3386
3440
{"type_get_tp_mro" , type_get_tp_mro , METH_O },
3441
+ {"get_basic_static_type" , get_basic_static_type , METH_VARARGS , NULL },
3442
+ {"clear_basic_static_type" , clear_basic_static_type , METH_O , NULL },
3387
3443
{"test_tstate_capi" , test_tstate_capi , METH_NOARGS , NULL },
3388
3444
{"frame_getlocals" , frame_getlocals , METH_O , NULL },
3389
3445
{"frame_getglobals" , frame_getglobals , METH_O , NULL },
0 commit comments