@@ -2418,6 +2418,34 @@ set_vectorcall_nop(PyObject *self, PyObject *func)
24182418 Py_RETURN_NONE ;
24192419}
24202420
2421+ static PyObject *
2422+ module_get_gc_hooks (PyObject * self , PyObject * arg )
2423+ {
2424+ PyModuleObject * mod = (PyModuleObject * )arg ;
2425+ PyObject * traverse = NULL ;
2426+ PyObject * clear = NULL ;
2427+ PyObject * free = NULL ;
2428+ PyObject * result = NULL ;
2429+ traverse = PyLong_FromVoidPtr (mod -> md_state_traverse );
2430+ if (!traverse ) {
2431+ goto finally ;
2432+ }
2433+ clear = PyLong_FromVoidPtr (mod -> md_state_clear );
2434+ if (!clear ) {
2435+ goto finally ;
2436+ }
2437+ free = PyLong_FromVoidPtr (mod -> md_state_free );
2438+ if (!free ) {
2439+ goto finally ;
2440+ }
2441+ result = PyTuple_FromArray ((PyObject * []){ traverse , clear , free }, 3 );
2442+ finally :
2443+ Py_XDECREF (traverse );
2444+ Py_XDECREF (clear );
2445+ Py_XDECREF (free );
2446+ return result ;
2447+ }
2448+
24212449static PyMethodDef module_functions [] = {
24222450 {"get_configs" , get_configs , METH_NOARGS },
24232451 {"get_recursion_depth" , get_recursion_depth , METH_NOARGS },
@@ -2527,6 +2555,7 @@ static PyMethodDef module_functions[] = {
25272555#endif
25282556 {"simple_pending_call ", simple_pending_call , METH_O },
25292557 {"set_vectorcall_nop ", set_vectorcall_nop , METH_O },
2558+ {"module_get_gc_hooks ", module_get_gc_hooks , METH_O },
25302559 {NULL, NULL } /* sentinel */
25312560};
25322561
0 commit comments