Revert "bpo-36854: Move _PyRuntimeState.gc to PyInterpreterState (GH-17287)" by pablogsal · Pull Request #17455 · python/cpython
Expand Up
@@ -133,7 +133,7 @@ static PyObject *gc_str = NULL;
#define GEN_HEAD(gcstate, n) (&(gcstate)->generations[n].head)
void _PyGC_InitState(GCState *gcstate) _PyGC_InitializeRuntime(GCState *gcstate) { gcstate->enabled = 1; /* automatic collection enabled? */
Expand All @@ -159,7 +159,7 @@ _PyGC_InitState(GCState *gcstate) PyStatus _PyGC_Init(PyThreadState *tstate) { GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; if (gcstate->garbage == NULL) { gcstate->garbage = PyList_New(0); if (gcstate->garbage == NULL) { Expand Down Expand Up @@ -1156,7 +1156,7 @@ collect(PyThreadState *tstate, int generation, PyGC_Head finalizers; /* objects with, & reachable from, __del__ */ PyGC_Head *gc; _PyTime_t t1 = 0; /* initialize to prevent a compiler warning */ GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc;
if (gcstate->debug & DEBUG_STATS) { PySys_WriteStderr("gc: collecting generation %d...\n", generation); Expand Down Expand Up @@ -1321,7 +1321,7 @@ invoke_gc_callback(PyThreadState *tstate, const char *phase, assert(!_PyErr_Occurred(tstate));
/* we may get called very early */ GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; if (gcstate->callbacks == NULL) { return; } Expand Down Expand Up @@ -1373,7 +1373,7 @@ collect_with_callback(PyThreadState *tstate, int generation) static Py_ssize_t collect_generations(PyThreadState *tstate) { GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; /* Find the oldest generation (highest numbered) where the count * exceeds the threshold. Objects in the that generation and * generations younger than it will be collected. */ Expand Down Expand Up @@ -1407,7 +1407,7 @@ gc_enable_impl(PyObject *module) /*[clinic end generated code: output=45a427e9dce9155c input=81ac4940ca579707]*/ { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; gcstate->enabled = 1; Py_RETURN_NONE; } Expand All @@ -1423,7 +1423,7 @@ gc_disable_impl(PyObject *module) /*[clinic end generated code: output=97d1030f7aa9d279 input=8c2e5a14e800d83b]*/ { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; gcstate->enabled = 0; Py_RETURN_NONE; } Expand All @@ -1439,7 +1439,7 @@ gc_isenabled_impl(PyObject *module) /*[clinic end generated code: output=1874298331c49130 input=30005e0422373b31]*/ { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; return gcstate->enabled; }
Expand Down Expand Up @@ -1468,7 +1468,7 @@ gc_collect_impl(PyObject *module, int generation) return -1; }
GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; Py_ssize_t n; if (gcstate->collecting) { /* already collecting, don't do anything */ Expand Down Expand Up @@ -1505,7 +1505,7 @@ gc_set_debug_impl(PyObject *module, int flags) /*[clinic end generated code: output=7c8366575486b228 input=5e5ce15e84fbed15]*/ { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; gcstate->debug = flags; Py_RETURN_NONE; } Expand All @@ -1521,7 +1521,7 @@ gc_get_debug_impl(PyObject *module) /*[clinic end generated code: output=91242f3506cd1e50 input=91a101e1c3b98366]*/ { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; return gcstate->debug; }
Expand All @@ -1535,7 +1535,7 @@ static PyObject * gc_set_threshold(PyObject *self, PyObject *args) { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; if (!PyArg_ParseTuple(args, "i|ii:set_threshold", &gcstate->generations[0].threshold, &gcstate->generations[1].threshold, Expand All @@ -1559,7 +1559,7 @@ gc_get_threshold_impl(PyObject *module) /*[clinic end generated code: output=7902bc9f41ecbbd8 input=286d79918034d6e6]*/ { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; return Py_BuildValue("(iii)", gcstate->generations[0].threshold, gcstate->generations[1].threshold, Expand All @@ -1577,7 +1577,7 @@ gc_get_count_impl(PyObject *module) /*[clinic end generated code: output=354012e67b16398f input=a392794a08251751]*/ { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; return Py_BuildValue("(iii)", gcstate->generations[0].count, gcstate->generations[1].count, Expand Down Expand Up @@ -1627,7 +1627,7 @@ gc_get_referrers(PyObject *self, PyObject *args) return NULL; }
GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; for (i = 0; i < NUM_GENERATIONS; i++) { if (!(gc_referrers_for(args, GEN_HEAD(gcstate, i), result))) { Py_DECREF(result); Expand Down Expand Up @@ -1692,7 +1692,7 @@ gc_get_objects_impl(PyObject *module, Py_ssize_t generation) PyThreadState *tstate = _PyThreadState_GET(); int i; PyObject* result; GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc;
result = PyList_New(0); if (result == NULL) { Expand Down Expand Up @@ -1751,7 +1751,7 @@ gc_get_stats_impl(PyObject *module)
/* To get consistent values despite allocations while constructing the result list, we use a snapshot of the running stats. */ GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; for (i = 0; i < NUM_GENERATIONS; i++) { stats[i] = gcstate->generation_stats[i]; } Expand Down Expand Up @@ -1824,7 +1824,7 @@ gc_freeze_impl(PyObject *module) /*[clinic end generated code: output=502159d9cdc4c139 input=b602b16ac5febbe5]*/ { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; for (int i = 0; i < NUM_GENERATIONS; ++i) { gc_list_merge(GEN_HEAD(gcstate, i), &gcstate->permanent_generation.head); gcstate->generations[i].count = 0; Expand All @@ -1845,7 +1845,7 @@ gc_unfreeze_impl(PyObject *module) /*[clinic end generated code: output=1c15f2043b25e169 input=2dd52b170f4cef6c]*/ { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; gc_list_merge(&gcstate->permanent_generation.head, GEN_HEAD(gcstate, NUM_GENERATIONS-1)); Py_RETURN_NONE; Expand All @@ -1862,7 +1862,7 @@ gc_get_freeze_count_impl(PyObject *module) /*[clinic end generated code: output=61cbd9f43aa032e1 input=45ffbc65cfe2a6ed]*/ { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; return gc_list_size(&gcstate->permanent_generation.head); }
Expand Down Expand Up @@ -1926,38 +1926,34 @@ static struct PyModuleDef gcmodule = { PyMODINIT_FUNC PyInit_gc(void) { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; PyObject *m;
PyObject *m = PyModule_Create(&gcmodule); m = PyModule_Create(&gcmodule);
if (m == NULL) { return NULL; }
GCState *gcstate = &_PyRuntime.gc; if (gcstate->garbage == NULL) { gcstate->garbage = PyList_New(0); if (gcstate->garbage == NULL) { if (gcstate->garbage == NULL) return NULL; } } Py_INCREF(gcstate->garbage); if (PyModule_AddObject(m, "garbage", gcstate->garbage) < 0) { if (PyModule_AddObject(m, "garbage", gcstate->garbage) < 0) return NULL; }
if (gcstate->callbacks == NULL) { gcstate->callbacks = PyList_New(0); if (gcstate->callbacks == NULL) { if (gcstate->callbacks == NULL) return NULL; } } Py_INCREF(gcstate->callbacks); if (PyModule_AddObject(m, "callbacks", gcstate->callbacks) < 0) { if (PyModule_AddObject(m, "callbacks", gcstate->callbacks) < 0) return NULL; }
#define ADD_INT(NAME) if (PyModule_AddIntConstant(m, #NAME, NAME) < 0) { return NULL; } #define ADD_INT(NAME) if (PyModule_AddIntConstant(m, #NAME, NAME) < 0) return NULL ADD_INT(DEBUG_STATS); ADD_INT(DEBUG_COLLECTABLE); ADD_INT(DEBUG_UNCOLLECTABLE); Expand All @@ -1972,7 +1968,7 @@ Py_ssize_t PyGC_Collect(void) { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc;
if (!gcstate->enabled) { return 0; Expand Down Expand Up @@ -2007,7 +2003,7 @@ _PyGC_CollectNoFail(void) PyThreadState *tstate = _PyThreadState_GET(); assert(!_PyErr_Occurred(tstate));
GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; Py_ssize_t n;
/* Ideally, this function is only called on interpreter shutdown, Expand All @@ -2030,7 +2026,7 @@ _PyGC_CollectNoFail(void) void _PyGC_DumpShutdownStats(PyThreadState *tstate) { GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; if (!(gcstate->debug & DEBUG_SAVEALL) && gcstate->garbage != NULL && PyList_GET_SIZE(gcstate->garbage) > 0) { const char *message; Expand Down Expand Up @@ -2067,7 +2063,7 @@ _PyGC_DumpShutdownStats(PyThreadState *tstate) void _PyGC_Fini(PyThreadState *tstate) { GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; Py_CLEAR(gcstate->garbage); Py_CLEAR(gcstate->callbacks); } Expand Down Expand Up @@ -2132,7 +2128,7 @@ static PyObject * _PyObject_GC_Alloc(int use_calloc, size_t basicsize) { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; if (basicsize > PY_SSIZE_T_MAX - sizeof(PyGC_Head)) { return _PyErr_NoMemory(tstate); } Expand Down Expand Up @@ -2231,7 +2227,7 @@ PyObject_GC_Del(void *op) gc_list_remove(g); } PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; if (gcstate->generations[0].count > 0) { gcstate->generations[0].count--; } Expand Down
void _PyGC_InitState(GCState *gcstate) _PyGC_InitializeRuntime(GCState *gcstate) { gcstate->enabled = 1; /* automatic collection enabled? */
Expand All @@ -159,7 +159,7 @@ _PyGC_InitState(GCState *gcstate) PyStatus _PyGC_Init(PyThreadState *tstate) { GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; if (gcstate->garbage == NULL) { gcstate->garbage = PyList_New(0); if (gcstate->garbage == NULL) { Expand Down Expand Up @@ -1156,7 +1156,7 @@ collect(PyThreadState *tstate, int generation, PyGC_Head finalizers; /* objects with, & reachable from, __del__ */ PyGC_Head *gc; _PyTime_t t1 = 0; /* initialize to prevent a compiler warning */ GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc;
if (gcstate->debug & DEBUG_STATS) { PySys_WriteStderr("gc: collecting generation %d...\n", generation); Expand Down Expand Up @@ -1321,7 +1321,7 @@ invoke_gc_callback(PyThreadState *tstate, const char *phase, assert(!_PyErr_Occurred(tstate));
/* we may get called very early */ GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; if (gcstate->callbacks == NULL) { return; } Expand Down Expand Up @@ -1373,7 +1373,7 @@ collect_with_callback(PyThreadState *tstate, int generation) static Py_ssize_t collect_generations(PyThreadState *tstate) { GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; /* Find the oldest generation (highest numbered) where the count * exceeds the threshold. Objects in the that generation and * generations younger than it will be collected. */ Expand Down Expand Up @@ -1407,7 +1407,7 @@ gc_enable_impl(PyObject *module) /*[clinic end generated code: output=45a427e9dce9155c input=81ac4940ca579707]*/ { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; gcstate->enabled = 1; Py_RETURN_NONE; } Expand All @@ -1423,7 +1423,7 @@ gc_disable_impl(PyObject *module) /*[clinic end generated code: output=97d1030f7aa9d279 input=8c2e5a14e800d83b]*/ { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; gcstate->enabled = 0; Py_RETURN_NONE; } Expand All @@ -1439,7 +1439,7 @@ gc_isenabled_impl(PyObject *module) /*[clinic end generated code: output=1874298331c49130 input=30005e0422373b31]*/ { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; return gcstate->enabled; }
Expand Down Expand Up @@ -1468,7 +1468,7 @@ gc_collect_impl(PyObject *module, int generation) return -1; }
GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; Py_ssize_t n; if (gcstate->collecting) { /* already collecting, don't do anything */ Expand Down Expand Up @@ -1505,7 +1505,7 @@ gc_set_debug_impl(PyObject *module, int flags) /*[clinic end generated code: output=7c8366575486b228 input=5e5ce15e84fbed15]*/ { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; gcstate->debug = flags; Py_RETURN_NONE; } Expand All @@ -1521,7 +1521,7 @@ gc_get_debug_impl(PyObject *module) /*[clinic end generated code: output=91242f3506cd1e50 input=91a101e1c3b98366]*/ { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; return gcstate->debug; }
Expand All @@ -1535,7 +1535,7 @@ static PyObject * gc_set_threshold(PyObject *self, PyObject *args) { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; if (!PyArg_ParseTuple(args, "i|ii:set_threshold", &gcstate->generations[0].threshold, &gcstate->generations[1].threshold, Expand All @@ -1559,7 +1559,7 @@ gc_get_threshold_impl(PyObject *module) /*[clinic end generated code: output=7902bc9f41ecbbd8 input=286d79918034d6e6]*/ { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; return Py_BuildValue("(iii)", gcstate->generations[0].threshold, gcstate->generations[1].threshold, Expand All @@ -1577,7 +1577,7 @@ gc_get_count_impl(PyObject *module) /*[clinic end generated code: output=354012e67b16398f input=a392794a08251751]*/ { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; return Py_BuildValue("(iii)", gcstate->generations[0].count, gcstate->generations[1].count, Expand Down Expand Up @@ -1627,7 +1627,7 @@ gc_get_referrers(PyObject *self, PyObject *args) return NULL; }
GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; for (i = 0; i < NUM_GENERATIONS; i++) { if (!(gc_referrers_for(args, GEN_HEAD(gcstate, i), result))) { Py_DECREF(result); Expand Down Expand Up @@ -1692,7 +1692,7 @@ gc_get_objects_impl(PyObject *module, Py_ssize_t generation) PyThreadState *tstate = _PyThreadState_GET(); int i; PyObject* result; GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc;
result = PyList_New(0); if (result == NULL) { Expand Down Expand Up @@ -1751,7 +1751,7 @@ gc_get_stats_impl(PyObject *module)
/* To get consistent values despite allocations while constructing the result list, we use a snapshot of the running stats. */ GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; for (i = 0; i < NUM_GENERATIONS; i++) { stats[i] = gcstate->generation_stats[i]; } Expand Down Expand Up @@ -1824,7 +1824,7 @@ gc_freeze_impl(PyObject *module) /*[clinic end generated code: output=502159d9cdc4c139 input=b602b16ac5febbe5]*/ { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; for (int i = 0; i < NUM_GENERATIONS; ++i) { gc_list_merge(GEN_HEAD(gcstate, i), &gcstate->permanent_generation.head); gcstate->generations[i].count = 0; Expand All @@ -1845,7 +1845,7 @@ gc_unfreeze_impl(PyObject *module) /*[clinic end generated code: output=1c15f2043b25e169 input=2dd52b170f4cef6c]*/ { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; gc_list_merge(&gcstate->permanent_generation.head, GEN_HEAD(gcstate, NUM_GENERATIONS-1)); Py_RETURN_NONE; Expand All @@ -1862,7 +1862,7 @@ gc_get_freeze_count_impl(PyObject *module) /*[clinic end generated code: output=61cbd9f43aa032e1 input=45ffbc65cfe2a6ed]*/ { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; return gc_list_size(&gcstate->permanent_generation.head); }
Expand Down Expand Up @@ -1926,38 +1926,34 @@ static struct PyModuleDef gcmodule = { PyMODINIT_FUNC PyInit_gc(void) { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; PyObject *m;
PyObject *m = PyModule_Create(&gcmodule); m = PyModule_Create(&gcmodule);
if (m == NULL) { return NULL; }
GCState *gcstate = &_PyRuntime.gc; if (gcstate->garbage == NULL) { gcstate->garbage = PyList_New(0); if (gcstate->garbage == NULL) { if (gcstate->garbage == NULL) return NULL; } } Py_INCREF(gcstate->garbage); if (PyModule_AddObject(m, "garbage", gcstate->garbage) < 0) { if (PyModule_AddObject(m, "garbage", gcstate->garbage) < 0) return NULL; }
if (gcstate->callbacks == NULL) { gcstate->callbacks = PyList_New(0); if (gcstate->callbacks == NULL) { if (gcstate->callbacks == NULL) return NULL; } } Py_INCREF(gcstate->callbacks); if (PyModule_AddObject(m, "callbacks", gcstate->callbacks) < 0) { if (PyModule_AddObject(m, "callbacks", gcstate->callbacks) < 0) return NULL; }
#define ADD_INT(NAME) if (PyModule_AddIntConstant(m, #NAME, NAME) < 0) { return NULL; } #define ADD_INT(NAME) if (PyModule_AddIntConstant(m, #NAME, NAME) < 0) return NULL ADD_INT(DEBUG_STATS); ADD_INT(DEBUG_COLLECTABLE); ADD_INT(DEBUG_UNCOLLECTABLE); Expand All @@ -1972,7 +1968,7 @@ Py_ssize_t PyGC_Collect(void) { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc;
if (!gcstate->enabled) { return 0; Expand Down Expand Up @@ -2007,7 +2003,7 @@ _PyGC_CollectNoFail(void) PyThreadState *tstate = _PyThreadState_GET(); assert(!_PyErr_Occurred(tstate));
GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; Py_ssize_t n;
/* Ideally, this function is only called on interpreter shutdown, Expand All @@ -2030,7 +2026,7 @@ _PyGC_CollectNoFail(void) void _PyGC_DumpShutdownStats(PyThreadState *tstate) { GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; if (!(gcstate->debug & DEBUG_SAVEALL) && gcstate->garbage != NULL && PyList_GET_SIZE(gcstate->garbage) > 0) { const char *message; Expand Down Expand Up @@ -2067,7 +2063,7 @@ _PyGC_DumpShutdownStats(PyThreadState *tstate) void _PyGC_Fini(PyThreadState *tstate) { GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; Py_CLEAR(gcstate->garbage); Py_CLEAR(gcstate->callbacks); } Expand Down Expand Up @@ -2132,7 +2128,7 @@ static PyObject * _PyObject_GC_Alloc(int use_calloc, size_t basicsize) { PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; if (basicsize > PY_SSIZE_T_MAX - sizeof(PyGC_Head)) { return _PyErr_NoMemory(tstate); } Expand Down Expand Up @@ -2231,7 +2227,7 @@ PyObject_GC_Del(void *op) gc_list_remove(g); } PyThreadState *tstate = _PyThreadState_GET(); GCState *gcstate = &tstate->interp->gc; GCState *gcstate = &tstate->interp->runtime->gc; if (gcstate->generations[0].count > 0) { gcstate->generations[0].count--; } Expand Down