@@ -165,12 +165,17 @@ PyStatus
165
165
_PyGC_Init (PyThreadState * tstate )
166
166
{
167
167
GCState * gcstate = & tstate -> interp -> gc ;
168
+
169
+ gcstate -> garbage = PyList_New (0 );
168
170
if (gcstate -> garbage == NULL ) {
169
- gcstate -> garbage = PyList_New (0 );
170
- if (gcstate -> garbage == NULL ) {
171
- return _PyStatus_NO_MEMORY ();
172
- }
171
+ return _PyStatus_NO_MEMORY ();
172
+ }
173
+
174
+ gcstate -> callbacks = PyList_New (0 );
175
+ if (gcstate -> callbacks == NULL ) {
176
+ return _PyStatus_NO_MEMORY ();
173
177
}
178
+
174
179
return _PyStatus_OK ();
175
180
}
176
181
@@ -1992,59 +1997,50 @@ static PyMethodDef GcMethods[] = {
1992
1997
{NULL , NULL } /* Sentinel */
1993
1998
};
1994
1999
1995
- static struct PyModuleDef gcmodule = {
1996
- PyModuleDef_HEAD_INIT ,
1997
- "gc" , /* m_name */
1998
- gc__doc__ , /* m_doc */
1999
- -1 , /* m_size */
2000
- GcMethods , /* m_methods */
2001
- NULL , /* m_reload */
2002
- NULL , /* m_traverse */
2003
- NULL , /* m_clear */
2004
- NULL /* m_free */
2005
- };
2006
-
2007
- PyMODINIT_FUNC
2008
- PyInit_gc (void )
2000
+ static int
2001
+ gcmodule_exec (PyObject * module )
2009
2002
{
2010
2003
GCState * gcstate = get_gc_state ();
2011
2004
2012
- PyObject * m = PyModule_Create (& gcmodule );
2013
-
2014
- if (m == NULL ) {
2015
- return NULL ;
2016
- }
2017
-
2018
- if (gcstate -> garbage == NULL ) {
2019
- gcstate -> garbage = PyList_New (0 );
2020
- if (gcstate -> garbage == NULL ) {
2021
- return NULL ;
2022
- }
2023
- }
2024
- Py_INCREF (gcstate -> garbage );
2025
- if (PyModule_AddObject (m , "garbage" , gcstate -> garbage ) < 0 ) {
2026
- return NULL ;
2027
- }
2028
-
2029
- if (gcstate -> callbacks == NULL ) {
2030
- gcstate -> callbacks = PyList_New (0 );
2031
- if (gcstate -> callbacks == NULL ) {
2032
- return NULL ;
2033
- }
2005
+ /* garbage and callbacks are initialized by _PyGC_Init() early in
2006
+ * interpreter lifecycle. */
2007
+ assert (gcstate -> garbage != NULL );
2008
+ if (PyModule_AddObjectRef (module , "garbage" , gcstate -> garbage ) < 0 ) {
2009
+ return -1 ;
2034
2010
}
2035
- Py_INCREF (gcstate -> callbacks );
2036
- if (PyModule_AddObject ( m , "callbacks" , gcstate -> callbacks ) < 0 ) {
2037
- return NULL ;
2011
+ assert (gcstate -> callbacks != NULL );
2012
+ if (PyModule_AddObjectRef ( module , "callbacks" , gcstate -> callbacks ) < 0 ) {
2013
+ return -1 ;
2038
2014
}
2039
2015
2040
- #define ADD_INT (NAME ) if (PyModule_AddIntConstant(m , #NAME, NAME) < 0) { return NULL ; }
2016
+ #define ADD_INT (NAME ) if (PyModule_AddIntConstant(module , #NAME, NAME) < 0) { return -1 ; }
2041
2017
ADD_INT (DEBUG_STATS );
2042
2018
ADD_INT (DEBUG_COLLECTABLE );
2043
2019
ADD_INT (DEBUG_UNCOLLECTABLE );
2044
2020
ADD_INT (DEBUG_SAVEALL );
2045
2021
ADD_INT (DEBUG_LEAK );
2046
2022
#undef ADD_INT
2047
- return m ;
2023
+ return 0 ;
2024
+ }
2025
+
2026
+ static PyModuleDef_Slot gcmodule_slots [] = {
2027
+ {Py_mod_exec , gcmodule_exec },
2028
+ {0 , NULL }
2029
+ };
2030
+
2031
+ static struct PyModuleDef gcmodule = {
2032
+ PyModuleDef_HEAD_INIT ,
2033
+ .m_name = "gc" ,
2034
+ .m_doc = gc__doc__ ,
2035
+ .m_size = 0 , // per interpreter state, see: get_gc_state()
2036
+ .m_methods = GcMethods ,
2037
+ .m_slots = gcmodule_slots
2038
+ };
2039
+
2040
+ PyMODINIT_FUNC
2041
+ PyInit_gc (void )
2042
+ {
2043
+ return PyModuleDef_Init (& gcmodule );
2048
2044
}
2049
2045
2050
2046
/* Public API to invoke gc.collect() from C */
0 commit comments